|  | // 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 ( | 
|  | "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"], | 
|  | sdk_version: "current", | 
|  | bazel_module: { bp2build_available: true }, | 
|  | } | 
|  |  | 
|  | java_library { | 
|  | name: "java-lib-2", | 
|  | srcs: ["b.java"], | 
|  | sdk_version: "current", | 
|  | bazel_module: { bp2build_available: true }, | 
|  | }`, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{ | 
|  | "srcs":        `["a.java"]`, | 
|  | "deps":        `[":java-lib-2-neverlink"]`, | 
|  | "sdk_version": `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), | 
|  | MakeBazelTarget("java_library", "java-lib-2", AttrNameToString{ | 
|  | "srcs":        `["b.java"]`, | 
|  | "sdk_version": `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "java-lib-2"), | 
|  | }, | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestJavaLibraryConvertsStaticLibsToDepsAndExports(t *testing.T) { | 
|  | runJavaLibraryTestCase(t, Bp2buildTestCase{ | 
|  | StubbedBuildDefinitions: []string{"java-lib-2", "java-lib-3"}, | 
|  | Blueprint: `java_library { | 
|  | name: "java-lib-1", | 
|  | srcs: ["a.java"], | 
|  | libs: ["java-lib-2"], | 
|  | static_libs: ["java-lib-3"], | 
|  | sdk_version: "current", | 
|  | bazel_module: { bp2build_available: true }, | 
|  | } | 
|  |  | 
|  | java_library { | 
|  | name: "java-lib-2", | 
|  | srcs: ["b.java"], | 
|  | sdk_version: "current", | 
|  | } | 
|  |  | 
|  | java_library { | 
|  | name: "java-lib-3", | 
|  | srcs: ["c.java"], | 
|  | sdk_version: "current", | 
|  | }`, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{ | 
|  | "srcs": `["a.java"]`, | 
|  | "deps": `[ | 
|  | ":java-lib-2-neverlink", | 
|  | ":java-lib-3", | 
|  | ]`, | 
|  | "exports":     `[":java-lib-3"]`, | 
|  | "sdk_version": `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), | 
|  | }, | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestJavaLibraryConvertsStaticLibsToExportsIfNoSrcs(t *testing.T) { | 
|  | runJavaLibraryTestCase(t, Bp2buildTestCase{ | 
|  | StubbedBuildDefinitions: []string{"java-lib-2"}, | 
|  | Blueprint: `java_library { | 
|  | name: "java-lib-1", | 
|  | static_libs: ["java-lib-2"], | 
|  | sdk_version: "current", | 
|  | bazel_module: { bp2build_available: true }, | 
|  | } | 
|  |  | 
|  | java_library { | 
|  | name: "java-lib-2", | 
|  | srcs: ["a.java"], | 
|  | }`, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{ | 
|  | "exports":     `[":java-lib-2"]`, | 
|  | "sdk_version": `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), | 
|  | }, | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestJavaLibraryFailsToConvertNoSdkVersion(t *testing.T) { | 
|  | runJavaLibraryTestCase(t, Bp2buildTestCase{ | 
|  | Blueprint: ` | 
|  | java_library { | 
|  | name: "lib", | 
|  | bazel_module: { bp2build_available: true }, | 
|  | } | 
|  | `, | 
|  | ExpectedBazelTargets: []string{}, // no targets expected because sdk_version is not set | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestJavaLibraryPlugins(t *testing.T) { | 
|  | runJavaLibraryTestCaseWithRegistrationCtxFunc(t, Bp2buildTestCase{ | 
|  | StubbedBuildDefinitions: []string{"java-plugin-1"}, | 
|  | Blueprint: `java_library { | 
|  | name: "java-lib-1", | 
|  | plugins: ["java-plugin-1"], | 
|  | sdk_version: "current", | 
|  | bazel_module: { bp2build_available: true }, | 
|  | } | 
|  |  | 
|  | java_plugin { | 
|  | name: "java-plugin-1", | 
|  | srcs: ["a.java"], | 
|  | }`, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{ | 
|  | "plugins":     `[":java-plugin-1"]`, | 
|  | "sdk_version": `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "java-lib-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", | 
|  | sdk_version: "current", | 
|  | }`, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{ | 
|  | "srcs":         `["a.java"]`, | 
|  | "java_version": `"11"`, | 
|  | "sdk_version":  `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTargetWithAttrs( | 
|  | "java_library", | 
|  | "java-lib-1", | 
|  | AttrNameToString{ | 
|  | "java_version": `"11"`, | 
|  | "sdk_version":  `"current"`, | 
|  | }), | 
|  | }, | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestJavaLibraryOpenjdk9(t *testing.T) { | 
|  | runJavaLibraryTestCase(t, Bp2buildTestCase{ | 
|  | Blueprint: `java_library { | 
|  | name: "java-lib-1", | 
|  | srcs: ["a.java"], | 
|  | exclude_srcs: ["b.java"], | 
|  | javacflags: ["flag"], | 
|  | target: { | 
|  | android: { | 
|  | srcs: ["android.java"], | 
|  | }, | 
|  | }, | 
|  | openjdk9: { | 
|  | srcs: ["b.java", "foo.java"], | 
|  | javacflags: ["extraflag"], | 
|  | }, | 
|  | sdk_version: "current", | 
|  | }`, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{ | 
|  | "srcs": `[ | 
|  | "a.java", | 
|  | "foo.java", | 
|  | ] + select({ | 
|  | "//build/bazel_common_rules/platforms/os:android": ["android.java"], | 
|  | "//conditions:default": [], | 
|  | })`, | 
|  | "sdk_version": `"current"`, | 
|  | "javacopts": `[ | 
|  | "flag", | 
|  | "extraflag", | 
|  | ]`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), | 
|  | }, | 
|  | }) | 
|  |  | 
|  | } | 
|  |  | 
|  | func TestJavaLibraryErrorproneEnabledManually(t *testing.T) { | 
|  | runJavaLibraryTestCaseWithRegistrationCtxFunc(t, Bp2buildTestCase{ | 
|  | StubbedBuildDefinitions: []string{"plugin2"}, | 
|  | Blueprint: `java_library { | 
|  | name: "java-lib-1", | 
|  | srcs: ["a.java"], | 
|  | javacflags: ["-Xsuper-fast"], | 
|  | sdk_version: "current", | 
|  | errorprone: { | 
|  | enabled: true, | 
|  | javacflags: ["-Xep:SpeedLimit:OFF"], | 
|  | extra_check_modules: ["plugin2"], | 
|  | }, | 
|  | } | 
|  | java_plugin { | 
|  | name: "plugin2", | 
|  | srcs: ["a.java"], | 
|  | }`, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{ | 
|  | "javacopts": `[ | 
|  | "-Xsuper-fast", | 
|  | "-Xep:SpeedLimit:OFF", | 
|  | ]`, | 
|  | "plugins":                 `[":plugin2"]`, | 
|  | "srcs":                    `["a.java"]`, | 
|  | "errorprone_force_enable": `True`, | 
|  | "sdk_version":             `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), | 
|  | }, | 
|  | }, func(ctx android.RegistrationContext) { | 
|  | ctx.RegisterModuleType("java_plugin", java.PluginFactory) | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestJavaLibraryErrorproneJavacflagsErrorproneDisabledByDefault(t *testing.T) { | 
|  | runJavaLibraryTestCase(t, Bp2buildTestCase{ | 
|  | Blueprint: `java_library { | 
|  | name: "java-lib-1", | 
|  | srcs: ["a.java"], | 
|  | sdk_version: "current", | 
|  | javacflags: ["-Xsuper-fast"], | 
|  | errorprone: { | 
|  | javacflags: ["-Xep:SpeedLimit:OFF"], | 
|  | }, | 
|  | }`, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{ | 
|  | "javacopts":   `["-Xsuper-fast"]`, | 
|  | "srcs":        `["a.java"]`, | 
|  | "sdk_version": `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), | 
|  | }, | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestJavaLibraryErrorproneDisabledManually(t *testing.T) { | 
|  | runJavaLibraryTestCase(t, Bp2buildTestCase{ | 
|  | Blueprint: `java_library { | 
|  | name: "java-lib-1", | 
|  | srcs: ["a.java"], | 
|  | javacflags: ["-Xsuper-fast"], | 
|  | sdk_version: "current", | 
|  | errorprone: { | 
|  | enabled: false, | 
|  | }, | 
|  | }`, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{ | 
|  | "javacopts": `[ | 
|  | "-Xsuper-fast", | 
|  | "-XepDisableAllChecks", | 
|  | ]`, | 
|  | "srcs":        `["a.java"]`, | 
|  | "sdk_version": `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), | 
|  | }, | 
|  | }) | 
|  | } | 
|  |  | 
|  | 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", | 
|  | ], | 
|  | sdk_version: "current", | 
|  | 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", | 
|  | ]`, | 
|  | "sdk_version": `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "example_lib"), | 
|  | }}) | 
|  | } | 
|  |  | 
|  | func TestJavaLibraryResources(t *testing.T) { | 
|  | runJavaLibraryTestCase(t, Bp2buildTestCase{ | 
|  | Dir: "adir", | 
|  | Filesystem: map[string]string{ | 
|  | "adir/res/a.res":      "", | 
|  | "adir/res/b.res":      "", | 
|  | "adir/res/dir1/b.res": "", | 
|  | "adir/Android.bp": `java_library { | 
|  | name: "java-lib-1", | 
|  | java_resources: ["res/a.res", "res/b.res"], | 
|  | sdk_version: "current", | 
|  | bazel_module: { bp2build_available: true }, | 
|  | }`, | 
|  | }, | 
|  | Blueprint: "", | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{ | 
|  | "resources": `[ | 
|  | "res/a.res", | 
|  | "res/b.res", | 
|  | ]`, | 
|  | "resource_strip_prefix": `"adir"`, | 
|  | "sdk_version":           `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), | 
|  | }, | 
|  | }) | 
|  | } | 
|  |  | 
|  | 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"], | 
|  | sdk_version: "current", | 
|  | }`, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{ | 
|  | "resource_strip_prefix": `"res"`, | 
|  | "resources": `[ | 
|  | "res/a.res", | 
|  | "res/b.res", | 
|  | "res/dir1/b.res", | 
|  | ]`, | 
|  | "sdk_version": `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), | 
|  | }, | 
|  | }) | 
|  | } | 
|  |  | 
|  | 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"], | 
|  | sdk_version: "current", | 
|  | exclude_java_resource_dirs: ["res/exclude"], | 
|  | }`, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{ | 
|  | "resource_strip_prefix": `"res"`, | 
|  | "resources":             `["res/a.res"]`, | 
|  | "sdk_version":           `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), | 
|  | }, | 
|  | }) | 
|  | } | 
|  |  | 
|  | 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"], | 
|  | sdk_version: "current", | 
|  | 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", | 
|  | ]`, | 
|  | "sdk_version": `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), | 
|  | }, | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestJavaLibraryResourcesWithMultipleDirs(t *testing.T) { | 
|  | runJavaLibraryTestCase(t, Bp2buildTestCase{ | 
|  | Filesystem: map[string]string{ | 
|  | "res/a.res":  "", | 
|  | "res1/b.res": "", | 
|  | }, | 
|  | Blueprint: `java_library { | 
|  | name: "java-lib-1", | 
|  | srcs: ["foo.java"], | 
|  | java_resource_dirs: ["res", "res1"], | 
|  | sdk_version: "current", | 
|  | }`, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("java_resources", "java-lib-1_resource_dir_res1", AttrNameToString{ | 
|  | "resource_strip_prefix": `"res1"`, | 
|  | "resources":             `["res1/b.res"]`, | 
|  | }), | 
|  | MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{ | 
|  | "deps":                  `["java-lib-1_resource_dir_res1"]`, | 
|  | "resources":             `["res/a.res"]`, | 
|  | "resource_strip_prefix": `"res"`, | 
|  | "srcs":                  `["foo.java"]`, | 
|  | "sdk_version":           `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), | 
|  | }, | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestJavaLibraryJavaResourcesAndResourceDirs(t *testing.T) { | 
|  | runJavaLibraryTestCase(t, Bp2buildTestCase{ | 
|  | Filesystem: map[string]string{ | 
|  | "resdir/a.res": "", | 
|  | }, | 
|  | Blueprint: `java_library { | 
|  | name: "java-lib-1", | 
|  | java_resources: ["res1", "res2"], | 
|  | java_resource_dirs: ["resdir"], | 
|  | sdk_version: "current", | 
|  | srcs: ["foo.java"], | 
|  | }`, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("java_resources", "java-lib-1_resource_dir_resdir", AttrNameToString{ | 
|  | "resource_strip_prefix": `"resdir"`, | 
|  | "resources":             `["resdir/a.res"]`, | 
|  | }), | 
|  | MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{ | 
|  | "deps":                  `["java-lib-1_resource_dir_resdir"]`, | 
|  | "resource_strip_prefix": `"."`, | 
|  | "resources": `[ | 
|  | "res1", | 
|  | "res2", | 
|  | ]`, | 
|  | "srcs":        `["foo.java"]`, | 
|  | "sdk_version": `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), | 
|  | }, | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestJavaLibraryAidl(t *testing.T) { | 
|  | runJavaLibraryTestCase(t, Bp2buildTestCase{ | 
|  | Description:                "Java library - aidl creates separate dependency", | 
|  | ModuleTypeUnderTest:        "java_library", | 
|  | ModuleTypeUnderTestFactory: java.LibraryFactory, | 
|  | Blueprint: `java_library { | 
|  | name: "example_lib", | 
|  | srcs: [ | 
|  | "a.java", | 
|  | "b.java", | 
|  | "a.aidl", | 
|  | "b.aidl", | 
|  | ], | 
|  | bazel_module: { bp2build_available: true }, | 
|  | sdk_version: "current", | 
|  | }`, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("aidl_library", "example_lib_aidl_library", AttrNameToString{ | 
|  | "srcs": `[ | 
|  | "a.aidl", | 
|  | "b.aidl", | 
|  | ]`, | 
|  | }), | 
|  | MakeBazelTarget("java_aidl_library", "example_lib_java_aidl_library", AttrNameToString{ | 
|  | "deps": `[":example_lib_aidl_library"]`, | 
|  | }), | 
|  | MakeBazelTarget("java_library", "example_lib", AttrNameToString{ | 
|  | "deps":    `[":example_lib_java_aidl_library"]`, | 
|  | "exports": `[":example_lib_java_aidl_library"]`, | 
|  | "srcs": `[ | 
|  | "a.java", | 
|  | "b.java", | 
|  | ]`, | 
|  | "sdk_version": `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "example_lib"), | 
|  | }}) | 
|  | } | 
|  |  | 
|  | func TestJavaLibraryAidlSrcsNoFileGroup(t *testing.T) { | 
|  | runJavaLibraryTestCaseWithRegistrationCtxFunc(t, Bp2buildTestCase{ | 
|  | Description:                "Java library - aidl filegroup is parsed", | 
|  | ModuleTypeUnderTest:        "java_library", | 
|  | ModuleTypeUnderTestFactory: java.LibraryFactory, | 
|  | Blueprint: ` | 
|  | java_library { | 
|  | name: "example_lib", | 
|  | srcs: [ | 
|  | "a.java", | 
|  | "b.aidl", | 
|  | ], | 
|  | sdk_version: "current", | 
|  | bazel_module: { bp2build_available: true }, | 
|  | }`, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("aidl_library", "example_lib_aidl_library", AttrNameToString{ | 
|  | "srcs": `["b.aidl"]`, | 
|  | }), | 
|  | MakeBazelTarget("java_aidl_library", "example_lib_java_aidl_library", AttrNameToString{ | 
|  | "deps": `[":example_lib_aidl_library"]`, | 
|  | }), | 
|  | MakeBazelTarget("java_library", "example_lib", AttrNameToString{ | 
|  | "deps":        `[":example_lib_java_aidl_library"]`, | 
|  | "exports":     `[":example_lib_java_aidl_library"]`, | 
|  | "srcs":        `["a.java"]`, | 
|  | "sdk_version": `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "example_lib"), | 
|  | }, | 
|  | }, func(ctx android.RegistrationContext) { | 
|  | ctx.RegisterModuleType("filegroup", android.FileGroupFactory) | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestJavaLibraryAidlFilegroup(t *testing.T) { | 
|  | runJavaLibraryTestCaseWithRegistrationCtxFunc(t, Bp2buildTestCase{ | 
|  | Description:                "Java library - aidl filegroup is parsed", | 
|  | ModuleTypeUnderTest:        "java_library", | 
|  | ModuleTypeUnderTestFactory: java.LibraryFactory, | 
|  | Blueprint: ` | 
|  | filegroup { | 
|  | name: "random_other_files", | 
|  | srcs: [ | 
|  | "a.java", | 
|  | "b.java", | 
|  | ], | 
|  | } | 
|  | filegroup { | 
|  | name: "aidl_files", | 
|  | srcs: [ | 
|  | "a.aidl", | 
|  | "b.aidl", | 
|  | ], | 
|  | } | 
|  | filegroup { | 
|  | name: "aidls_files", | 
|  | srcs: [ | 
|  | "a.aidl", | 
|  | "b.aidl", | 
|  | ], | 
|  | } | 
|  | java_library { | 
|  | name: "example_lib", | 
|  | srcs: [ | 
|  | "a.java", | 
|  | "b.java", | 
|  | ":aidl_files", | 
|  | ":aidls_files", | 
|  | ":random_other_files", | 
|  | ], | 
|  | sdk_version: "current", | 
|  | bazel_module: { bp2build_available: true }, | 
|  | }`, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTargetNoRestrictions("aidl_library", "aidl_files", AttrNameToString{ | 
|  | "srcs": `[ | 
|  | "a.aidl", | 
|  | "b.aidl", | 
|  | ]`, | 
|  | "tags": `["apex_available=//apex_available:anyapex"]`, | 
|  | }), | 
|  | MakeBazelTargetNoRestrictions("aidl_library", "aidls_files", AttrNameToString{ | 
|  | "srcs": `[ | 
|  | "a.aidl", | 
|  | "b.aidl", | 
|  | ]`, | 
|  | "tags": `["apex_available=//apex_available:anyapex"]`, | 
|  | }), | 
|  | MakeBazelTarget("java_aidl_library", "example_lib_java_aidl_library", AttrNameToString{ | 
|  | "deps": `[ | 
|  | ":aidl_files", | 
|  | ":aidls_files", | 
|  | ]`, | 
|  | }), | 
|  | MakeBazelTarget("java_library", "example_lib", AttrNameToString{ | 
|  | "deps":    `[":example_lib_java_aidl_library"]`, | 
|  | "exports": `[":example_lib_java_aidl_library"]`, | 
|  | "srcs": `[ | 
|  | "a.java", | 
|  | "b.java", | 
|  | ":random_other_files", | 
|  | ]`, | 
|  | "sdk_version": `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "example_lib"), | 
|  | MakeBazelTargetNoRestrictions("filegroup", "random_other_files", AttrNameToString{ | 
|  | "srcs": `[ | 
|  | "a.java", | 
|  | "b.java", | 
|  | ]`, | 
|  | }), | 
|  | }, | 
|  | }, func(ctx android.RegistrationContext) { | 
|  | ctx.RegisterModuleType("filegroup", android.FileGroupFactory) | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestJavaLibraryAidlNonAdjacentAidlFilegroup(t *testing.T) { | 
|  | runJavaLibraryTestCaseWithRegistrationCtxFunc(t, Bp2buildTestCase{ | 
|  | Description:                "java_library with non adjacent aidl filegroup", | 
|  | ModuleTypeUnderTest:        "java_library", | 
|  | ModuleTypeUnderTestFactory: java.LibraryFactory, | 
|  | StubbedBuildDefinitions:    []string{"//path/to/A:A_aidl"}, | 
|  | Filesystem: map[string]string{ | 
|  | "path/to/A/Android.bp": ` | 
|  | filegroup { | 
|  | name: "A_aidl", | 
|  | srcs: ["aidl/A.aidl"], | 
|  | path: "aidl", | 
|  | }`, | 
|  | }, | 
|  | Blueprint: ` | 
|  | java_library { | 
|  | name: "foo", | 
|  | srcs: [ | 
|  | ":A_aidl", | 
|  | ], | 
|  | sdk_version: "current", | 
|  | }`, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("java_aidl_library", "foo_java_aidl_library", AttrNameToString{ | 
|  | "deps": `["//path/to/A:A_aidl"]`, | 
|  | }), | 
|  | MakeBazelTarget("java_library", "foo", AttrNameToString{ | 
|  | "exports":     `[":foo_java_aidl_library"]`, | 
|  | "sdk_version": `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "foo"), | 
|  | }, | 
|  | }, func(ctx android.RegistrationContext) { | 
|  | ctx.RegisterModuleType("filegroup", android.FileGroupFactory) | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestConvertArmNeonVariant(t *testing.T) { | 
|  | t.Helper() | 
|  | RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {}, Bp2buildTestCase{ | 
|  | Description:                "Android Library - simple arch feature", | 
|  | ModuleTypeUnderTest:        "android_library", | 
|  | ModuleTypeUnderTestFactory: java.AndroidLibraryFactory, | 
|  | Blueprint: simpleModule("android_library", "static_lib_dep") + ` | 
|  | android_library { | 
|  | name: "TestLib", | 
|  | manifest: "manifest/AndroidManifest.xml", | 
|  | srcs: ["lib.java"], | 
|  | sdk_version: "current", | 
|  | arch: { | 
|  | arm: { | 
|  | neon: { | 
|  | srcs: ["arm_neon.java"], | 
|  | }, | 
|  | }, | 
|  | }, | 
|  | } | 
|  | `, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget( | 
|  | "android_library", | 
|  | "TestLib", | 
|  | AttrNameToString{ | 
|  | "srcs": `["lib.java"] + select({ | 
|  | "//build/bazel/platforms/arch/variants:arm-neon": ["arm_neon.java"], | 
|  | "//conditions:default": [], | 
|  | })`, | 
|  | "manifest":       `"manifest/AndroidManifest.xml"`, | 
|  | "resource_files": `[]`, | 
|  | "sdk_version":    `"current"`, // use as default | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("android_library", "TestLib"), | 
|  | }}) | 
|  | } | 
|  |  | 
|  | func TestConvertMultipleArchFeatures(t *testing.T) { | 
|  | t.Helper() | 
|  | RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {}, Bp2buildTestCase{ | 
|  | Description:                "Android Library - multiple arch features", | 
|  | ModuleTypeUnderTest:        "android_library", | 
|  | ModuleTypeUnderTestFactory: java.AndroidLibraryFactory, | 
|  | Blueprint: simpleModule("android_library", "static_lib_dep") + ` | 
|  | android_library { | 
|  | name: "TestLib", | 
|  | manifest: "manifest/AndroidManifest.xml", | 
|  | srcs: ["lib.java"], | 
|  | sdk_version: "current", | 
|  | arch: { | 
|  | x86: { | 
|  | ssse3: { | 
|  | srcs: ["ssse3.java"], | 
|  | }, | 
|  | sse4_1: { | 
|  | srcs: ["sse4_1.java"], | 
|  | }, | 
|  | }, | 
|  | }, | 
|  | } | 
|  | `, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget( | 
|  | "android_library", | 
|  | "TestLib", | 
|  | AttrNameToString{ | 
|  | "srcs": `["lib.java"] + select({ | 
|  | "//build/bazel/platforms/arch/variants:x86-sse4_1": ["sse4_1.java"], | 
|  | "//build/bazel/platforms/arch/variants:x86-sse4_1-ssse3": [ | 
|  | "sse4_1.java", | 
|  | "ssse3.java", | 
|  | ], | 
|  | "//build/bazel/platforms/arch/variants:x86-ssse3": ["ssse3.java"], | 
|  | "//conditions:default": [], | 
|  | })`, | 
|  | "manifest":       `"manifest/AndroidManifest.xml"`, | 
|  | "resource_files": `[]`, | 
|  | "sdk_version":    `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("android_library", "TestLib"), | 
|  | }}) | 
|  | } | 
|  |  | 
|  | func TestConvertExcludeSrcsArchFeature(t *testing.T) { | 
|  | t.Helper() | 
|  | RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {}, Bp2buildTestCase{ | 
|  | Description:                "Android Library - exclude_srcs with arch feature", | 
|  | ModuleTypeUnderTest:        "android_library", | 
|  | ModuleTypeUnderTestFactory: java.AndroidLibraryFactory, | 
|  | Blueprint: simpleModule("android_library", "static_lib_dep") + ` | 
|  | android_library { | 
|  | name: "TestLib", | 
|  | manifest: "manifest/AndroidManifest.xml", | 
|  | srcs: ["lib.java"], | 
|  | arch: { | 
|  | arm: { | 
|  | srcs: ["arm_non_neon.java"], | 
|  | neon: { | 
|  | exclude_srcs: ["arm_non_neon.java"], | 
|  | }, | 
|  | }, | 
|  | }, | 
|  | sdk_version: "current", | 
|  | } | 
|  | `, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget( | 
|  | "android_library", | 
|  | "TestLib", | 
|  | AttrNameToString{ | 
|  | "srcs": `["lib.java"] + select({ | 
|  | "//build/bazel/platforms/arch/variants:arm-neon": [], | 
|  | "//build/bazel_common_rules/platforms/arch:arm": ["arm_non_neon.java"], | 
|  | "//conditions:default": [], | 
|  | })`, | 
|  | "manifest":       `"manifest/AndroidManifest.xml"`, | 
|  | "resource_files": `[]`, | 
|  | "sdk_version":    `"current"`, // use as default | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("android_library", "TestLib"), | 
|  | }}) | 
|  | } | 
|  |  | 
|  | func TestJavaLibraryKotlinSrcs(t *testing.T) { | 
|  | runJavaLibraryTestCase(t, Bp2buildTestCase{ | 
|  | Description: "java_library with kotlin srcs", | 
|  | Blueprint: `java_library { | 
|  | name: "java-lib-1", | 
|  | srcs: ["a.java", "b.java", "c.kt"], | 
|  | bazel_module: { bp2build_available: true }, | 
|  | sdk_version: "current", | 
|  | } | 
|  | `, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("kt_jvm_library", "java-lib-1", AttrNameToString{ | 
|  | "srcs": `[ | 
|  | "a.java", | 
|  | "b.java", | 
|  | "c.kt", | 
|  | ]`, | 
|  | "sdk_version": `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("kt_jvm_library", "java-lib-1"), | 
|  | }, | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestJavaLibraryKotlincflags(t *testing.T) { | 
|  | runJavaLibraryTestCase(t, Bp2buildTestCase{ | 
|  | Description: "java_library with kotlincfalgs", | 
|  | Blueprint: `java_library { | 
|  | name: "java-lib-1", | 
|  | srcs: [ "a.kt"], | 
|  | kotlincflags: ["-flag1", "-flag2"], | 
|  | bazel_module: { bp2build_available: true }, | 
|  | sdk_version: "current", | 
|  | } | 
|  | `, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("kt_jvm_library", "java-lib-1", AttrNameToString{ | 
|  | "srcs": `["a.kt"]`, | 
|  | "kotlincflags": `[ | 
|  | "-flag1", | 
|  | "-flag2", | 
|  | ]`, | 
|  | "sdk_version": `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("kt_jvm_library", "java-lib-1"), | 
|  | }, | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestJavaLibraryKotlinCommonSrcs(t *testing.T) { | 
|  | runJavaLibraryTestCase(t, Bp2buildTestCase{ | 
|  | Description: "java_library with kotlin common_srcs", | 
|  | Blueprint: `java_library { | 
|  | name: "java-lib-1", | 
|  | srcs: ["a.java", "b.java"], | 
|  | common_srcs: ["c.kt"], | 
|  | bazel_module: { bp2build_available: true }, | 
|  | sdk_version: "current", | 
|  | } | 
|  | `, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("kt_jvm_library", "java-lib-1", AttrNameToString{ | 
|  | "srcs": `[ | 
|  | "a.java", | 
|  | "b.java", | 
|  | ]`, | 
|  | "common_srcs": `["c.kt"]`, | 
|  | "sdk_version": `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("kt_jvm_library", "java-lib-1"), | 
|  | }, | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestJavaLibraryArchVariantDeps(t *testing.T) { | 
|  | runJavaLibraryTestCase(t, Bp2buildTestCase{ | 
|  | Description:             "java_library with arch variant libs", | 
|  | StubbedBuildDefinitions: []string{"java-lib-2", "java-lib-3", "java-lib-4"}, | 
|  | Blueprint: `java_library { | 
|  | name: "java-lib-1", | 
|  | srcs: ["a.java"], | 
|  | libs: ["java-lib-2"], | 
|  | sdk_version: "current", | 
|  | target: { | 
|  | android: { | 
|  | libs: ["java-lib-3"], | 
|  | static_libs: ["java-lib-4"], | 
|  | }, | 
|  | }, | 
|  | bazel_module: { bp2build_available: true }, | 
|  | } | 
|  |  | 
|  | java_library{ | 
|  | name: "java-lib-2", | 
|  | } | 
|  |  | 
|  | java_library{ | 
|  | name: "java-lib-3", | 
|  | } | 
|  |  | 
|  | java_library{ | 
|  | name: "java-lib-4", | 
|  | } | 
|  | `, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{ | 
|  | "srcs": `["a.java"]`, | 
|  | "exports": `select({ | 
|  | "//build/bazel_common_rules/platforms/os:android": [":java-lib-4"], | 
|  | "//conditions:default": [], | 
|  | })`, | 
|  | "deps": `[":java-lib-2-neverlink"] + select({ | 
|  | "//build/bazel_common_rules/platforms/os:android": [ | 
|  | ":java-lib-3-neverlink", | 
|  | ":java-lib-4", | 
|  | ], | 
|  | "//conditions:default": [], | 
|  | })`, | 
|  | "sdk_version": `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), | 
|  | }, | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestJavaLibraryArchVariantSrcsWithExcludes(t *testing.T) { | 
|  | runJavaLibraryTestCase(t, Bp2buildTestCase{ | 
|  | Description: "java_library with arch variant libs", | 
|  | Blueprint: `java_library { | 
|  | name: "java-lib-1", | 
|  | srcs: ["a.java", "b.java"], | 
|  | sdk_version: "current", | 
|  | target: { | 
|  | android: { | 
|  | exclude_srcs: ["a.java"], | 
|  | }, | 
|  | }, | 
|  | bazel_module: { bp2build_available: true }, | 
|  | } | 
|  | `, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{ | 
|  | "srcs": `["b.java"] + select({ | 
|  | "//build/bazel_common_rules/platforms/os:android": [], | 
|  | "//conditions:default": ["a.java"], | 
|  | })`, | 
|  | "sdk_version": `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), | 
|  | }, | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestJavaLibraryJavaResourcesSingleFilegroup(t *testing.T) { | 
|  | runJavaLibraryTestCaseWithRegistrationCtxFunc(t, Bp2buildTestCase{ | 
|  | Filesystem: map[string]string{ | 
|  | "res/a.res":      "", | 
|  | "res/b.res":      "", | 
|  | "res/dir1/b.res": "", | 
|  | }, | 
|  | Description: "java_library", | 
|  | Blueprint: `java_library { | 
|  | name: "java-lib-1", | 
|  | srcs: ["a.java"], | 
|  | sdk_version: "current", | 
|  | java_resources: [":filegroup1"], | 
|  | bazel_module: { bp2build_available: true }, | 
|  | } | 
|  |  | 
|  | filegroup { | 
|  | name: "filegroup1", | 
|  | path: "foo", | 
|  | srcs: ["foo/a", "foo/b"], | 
|  | } | 
|  |  | 
|  | `, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{ | 
|  | "srcs":                  `["a.java"]`, | 
|  | "resources":             `[":filegroup1"]`, | 
|  | "resource_strip_prefix": `"foo"`, | 
|  | "sdk_version":           `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), | 
|  | MakeBazelTargetNoRestrictions("filegroup", "filegroup1", AttrNameToString{ | 
|  | "srcs": `[ | 
|  | "foo/a", | 
|  | "foo/b", | 
|  | ]`}), | 
|  | }, | 
|  | }, func(ctx android.RegistrationContext) { | 
|  | ctx.RegisterModuleType("filegroup", android.FileGroupFactory) | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestJavaLibraryJavaResourcesMultipleFilegroup(t *testing.T) { | 
|  | runJavaLibraryTestCaseWithRegistrationCtxFunc(t, Bp2buildTestCase{ | 
|  | Filesystem: map[string]string{ | 
|  | "a.res": "", | 
|  | }, | 
|  | Description: "with java_resources that has multiple filegroups", | 
|  | Blueprint: `java_library { | 
|  | name: "java-lib-1", | 
|  | srcs: ["a.java"], | 
|  | java_resources: ["a.res", ":filegroup1", ":filegroup2"], | 
|  | sdk_version: "current", | 
|  | bazel_module: { bp2build_available: true }, | 
|  | } | 
|  |  | 
|  | filegroup { | 
|  | name: "filegroup1", | 
|  | path: "foo", | 
|  | srcs: ["foo/a"], | 
|  | } | 
|  |  | 
|  | filegroup { | 
|  | name: "filegroup2", | 
|  | path: "bar", | 
|  | srcs: ["bar/a"], | 
|  | } | 
|  | `, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("java_resources", "java-lib-1_filegroup_resources_filegroup1", AttrNameToString{ | 
|  | "resource_strip_prefix": `"foo"`, | 
|  | "resources":             `[":filegroup1"]`, | 
|  | }), | 
|  | MakeBazelTarget("java_resources", "java-lib-1_filegroup_resources_filegroup2", AttrNameToString{ | 
|  | "resource_strip_prefix": `"bar"`, | 
|  | "resources":             `[":filegroup2"]`, | 
|  | }), | 
|  | MakeBazelTarget("java_library", "java-lib-1", AttrNameToString{ | 
|  | "srcs":                  `["a.java"]`, | 
|  | "resources":             `["a.res"]`, | 
|  | "resource_strip_prefix": `"."`, | 
|  | "deps": `[ | 
|  | "java-lib-1_filegroup_resources_filegroup1", | 
|  | "java-lib-1_filegroup_resources_filegroup2", | 
|  | ]`, | 
|  | "sdk_version": `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "java-lib-1"), | 
|  | MakeBazelTargetNoRestrictions("filegroup", "filegroup1", AttrNameToString{ | 
|  | "srcs": `["foo/a"]`}), | 
|  | MakeBazelTargetNoRestrictions("filegroup", "filegroup2", AttrNameToString{ | 
|  | "srcs": `["bar/a"]`}), | 
|  | }, | 
|  | }, func(ctx android.RegistrationContext) { | 
|  | ctx.RegisterModuleType("filegroup", android.FileGroupFactory) | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestJavaLibrarySameNameAsPrebuilt(t *testing.T) { | 
|  | runJavaLibraryTestCaseWithRegistrationCtxFunc(t, Bp2buildTestCase{ | 
|  | Description: "java_library and prebuilt module have the same name", | 
|  | Filesystem: map[string]string{ | 
|  | "foo/bar/Android.bp": simpleModule("java_import", "test_lib"), | 
|  | }, | 
|  | Blueprint: `java_library { | 
|  | name: "test_lib", | 
|  | srcs: ["a.java"], | 
|  | sdk_version: "current", | 
|  | bazel_module: { bp2build_available: true }, | 
|  | } | 
|  | `, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("java_library", "test_lib", AttrNameToString{ | 
|  | "srcs":        `["a.java"]`, | 
|  | "sdk_version": `"current"`, | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "test_lib"), | 
|  | }, | 
|  | }, func(ctx android.RegistrationContext) { | 
|  | ctx.RegisterModuleType("java_import", java.ImportFactory) | 
|  | }) | 
|  | } | 
|  |  | 
|  | func TestJavaLibrarySharding(t *testing.T) { | 
|  | runJavaLibraryTestCase(t, Bp2buildTestCase{ | 
|  | Description: "java library with sharded compilation", | 
|  | Blueprint: `java_library { | 
|  | name: "lib1", | 
|  | srcs: ["a.java"], | 
|  | javac_shard_size: 3, | 
|  | sdk_version: "current", | 
|  | }`, | 
|  | ExpectedBazelTargets: []string{ | 
|  | MakeBazelTarget("java_library", "lib1", AttrNameToString{ | 
|  | "srcs":             `["a.java"]`, | 
|  | "sdk_version":      `"current"`, | 
|  | "javac_shard_size": "3", | 
|  | }), | 
|  | MakeNeverlinkDuplicateTarget("java_library", "lib1"), | 
|  | }, | 
|  | }) | 
|  | } |