Skip to content

Commit b04853d

Browse files
authored
Fix java_binary targets in test trees (#240)
Before they were generated with a dependency on a target which didn't exist. Instead, add the dependency on the -test-lib target of the java_test_suite in their package, and mark them as testonly. This is hopefully a pretty rare edge-case, but has been observed.
1 parent 8a16bb1 commit b04853d

File tree

8 files changed

+57
-2
lines changed

8 files changed

+57
-2
lines changed

java/gazelle/generate.go

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,22 @@ func (l javaLang) GenerateRules(args language.GenerateArgs) language.GenerateRes
190190
l.generateJavaLibrary(args.File, args.Rel, filepath.Base(args.Rel), productionJavaFiles.SortedSlice(), allPackageNames, nonLocalProductionJavaImports, nonLocalJavaExports, false, javaLibraryKind, &res)
191191
}
192192

193+
var testHelperJavaClasses *sorted_set.SortedSet[types.ClassName]
193194
for _, m := range allMains.SortedSlice() {
194-
l.generateJavaBinary(args.File, m, filepath.Base(args.Rel), &res)
195+
// Lazily populate because java_binaries are pretty rare
196+
if testHelperJavaClasses == nil {
197+
testHelperJavaClasses = sorted_set.NewSortedSetFn[types.ClassName]([]types.ClassName{}, types.ClassNameLess)
198+
for _, testHelperJavaFile := range testHelperJavaFiles.SortedSlice() {
199+
testHelperJavaClasses.Add(*testHelperJavaFile.ClassName())
200+
}
201+
}
202+
isTestOnly := false
203+
libName := filepath.Base(args.Rel)
204+
if testHelperJavaClasses.Contains(m) {
205+
isTestOnly = true
206+
libName += "-test-lib"
207+
}
208+
l.generateJavaBinary(args.File, m, libName, isTestOnly, &res)
195209
}
196210

197211
// We add special packages to point to testonly libraries which - this accumulates them,
@@ -450,12 +464,16 @@ func (l javaLang) generateJavaLibrary(file *rule.File, pathToPackageRelativeToBa
450464
res.Imports = append(res.Imports, resolveInput)
451465
}
452466

453-
func (l javaLang) generateJavaBinary(file *rule.File, m types.ClassName, libName string, res *language.GenerateResult) {
467+
func (l javaLang) generateJavaBinary(file *rule.File, m types.ClassName, libName string, testonly bool, res *language.GenerateResult) {
454468
const ruleKind = "java_binary"
455469
name := m.BareOuterClassName()
456470
r := rule.NewRule("java_binary", name) // FIXME check collision on name
457471
r.SetAttr("main_class", m.FullyQualifiedClassName())
458472

473+
if testonly {
474+
r.SetAttr("testonly", true)
475+
}
476+
459477
runtimeDeps := l.collectRuntimeDeps(ruleKind, name, file)
460478
runtimeDeps.Add(label.Label{Name: libName, Relative: true})
461479
r.SetAttr("runtime_deps", labelsToStrings(runtimeDeps.SortedSlice()))
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# gazelle:resolve java org.junit @maven//:junit_junit
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# gazelle:resolve java org.junit @maven//:junit_junit

java/gazelle/testdata/bin_in_test_tree/WORKSPACE

Whitespace-only changes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"level":"warn","_c":"maven-resolver","error":"open %WORKSPACEPATH%/maven_install.json: no such file or directory","message":"not loading maven dependencies"}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
load("@rules_java//java:defs.bzl", "java_binary")
2+
load("@contrib_rules_jvm//java:defs.bzl", "java_test_suite")
3+
4+
java_binary(
5+
name = "SomeTestBinary",
6+
testonly = True,
7+
main_class = "com.example.test.SomeTestBinary",
8+
visibility = ["//visibility:public"],
9+
runtime_deps = [":test-test-lib"],
10+
)
11+
12+
java_test_suite(
13+
name = "test",
14+
srcs = [
15+
"SomeOtherTest.java",
16+
"SomeTestBinary.java",
17+
],
18+
deps = ["@maven//:junit_junit"],
19+
)
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.example.test;
2+
3+
import org.junit.Test;
4+
5+
public class SomeOtherTest {
6+
@Test
7+
public void testPasses() {}
8+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.example.test;
2+
3+
public class SomeTestBinary {
4+
public static void main(String[] args) {
5+
System.out.println("Test passed!");
6+
}
7+
}

0 commit comments

Comments
 (0)