Skip to content

Commit

Permalink
gazelle: Standalone tests depend on their test libraries (#241)
Browse files Browse the repository at this point in the history
  • Loading branch information
illicitonion authored Jan 16, 2024
1 parent b04853d commit 306e4da
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 5 deletions.
24 changes: 20 additions & 4 deletions java/gazelle/generate.go
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ func (l javaLang) GenerateRules(args language.GenerateArgs) language.GenerateRes
libName := filepath.Base(args.Rel)
if testHelperJavaClasses.Contains(m) {
isTestOnly = true
libName += "-test-lib"
libName = testHelperLibname(libName)
}
l.generateJavaBinary(args.File, m, libName, isTestOnly, &res)
}
Expand Down Expand Up @@ -235,7 +235,7 @@ func (l javaLang) GenerateRules(args language.GenerateArgs) language.GenerateRes
case "file":
for _, tf := range testJavaFiles.SortedSlice() {
extraAttributes := separateTestJavaFiles[tf]
l.generateJavaTest(args.File, args.Rel, cfg.MavenRepositoryName(), tf, isModule, testJavaImportsWithHelpers, extraAttributes, &res)
l.generateJavaTest(args.File, args.Rel, cfg.MavenRepositoryName(), tf, isModule, testJavaImportsWithHelpers, nil, extraAttributes, &res)
}

case "suite":
Expand Down Expand Up @@ -274,7 +274,11 @@ func (l javaLang) GenerateRules(args language.GenerateArgs) language.GenerateRes
sortedSeparateTestJavaFiles.Add(src)
}
for _, src := range sortedSeparateTestJavaFiles.SortedSlice() {
l.generateJavaTest(args.File, args.Rel, cfg.MavenRepositoryName(), src, isModule, testJavaImportsWithHelpers, separateTestJavaFiles[src], &res)
var testHelperDep *string
if testHelperJavaFiles.Len() > 0 {
testHelperDep = ptr(testHelperLibname(suiteName))
}
l.generateJavaTest(args.File, args.Rel, cfg.MavenRepositoryName(), src, isModule, testJavaImportsWithHelpers, testHelperDep, separateTestJavaFiles[src], &res)
}
}
}
Expand Down Expand Up @@ -484,7 +488,7 @@ func (l javaLang) generateJavaBinary(file *rule.File, m types.ClassName, libName
})
}

func (l javaLang) generateJavaTest(file *rule.File, pathToPackageRelativeToBazelWorkspace string, mavenRepositoryName string, f javaFile, includePackageInName bool, imports *sorted_set.SortedSet[types.PackageName], extraAttributes map[string]bzl.Expr, res *language.GenerateResult) {
func (l javaLang) generateJavaTest(file *rule.File, pathToPackageRelativeToBazelWorkspace string, mavenRepositoryName string, f javaFile, includePackageInName bool, imports *sorted_set.SortedSet[types.PackageName], depOnTestHelpers *string, extraAttributes map[string]bzl.Expr, res *language.GenerateResult) {
className := f.ClassName()
fullyQualifiedTestClass := className.FullyQualifiedClassName()
var testName string
Expand Down Expand Up @@ -516,6 +520,10 @@ func (l javaLang) generateJavaTest(file *rule.File, pathToPackageRelativeToBazel
r.SetAttr("test_class", fullyQualifiedTestClass)
r.SetPrivateAttr(packagesKey, []types.ResolvableJavaPackage{*types.NewResolvableJavaPackage(f.pkg, true, false)})

if depOnTestHelpers != nil {
r.SetAttr("deps", []string{*depOnTestHelpers})
}

if runtimeDeps.Len() != 0 {
r.SetAttr("runtime_deps", labelsToStrings(runtimeDeps.SortedSlice()))
}
Expand Down Expand Up @@ -618,3 +626,11 @@ func labelsToStrings(labels []label.Label) []string {
}
return out
}

func testHelperLibname(targetName string) string {
return targetName + "-test-lib"
}

func ptr[T any](v T) *T {
return &v
}
2 changes: 1 addition & 1 deletion java/gazelle/generate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,7 @@ func TestSingleJavaTestFile(t *testing.T) {
var res language.GenerateResult

l := newTestJavaLang(t)
l.generateJavaTest(nil, "", "maven", f, tc.includePackageInName, stringsToPackageNames(tc.importedPackages), nil, &res)
l.generateJavaTest(nil, "", "maven", f, tc.includePackageInName, stringsToPackageNames(tc.importedPackages), nil, nil, &res)

require.Len(t, res.Gen, 1, "want 1 generated rule")

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
load("@contrib_rules_jvm//java:defs.bzl", "java_junit5_test", "java_test_suite")

java_test_suite(
name = "hastestutil",
srcs = [
"RandomNumberGenerator.java",
"ReliableTest.java",
],
runner = "junit5",
runtime_deps = [
"@maven//:org_junit_jupiter_junit_jupiter_engine",
"@maven//:org_junit_platform_junit_platform_launcher",
"@maven//:org_junit_platform_junit_platform_reporting",
],
deps = [
"//src/main/com/example/annotation",
"@maven//:org_junit_jupiter_junit_jupiter_api",
],
)

java_junit5_test(
name = "RandomTest",
srcs = ["RandomTest.java"],
flaky = True,
test_class = "com.example.hastestutil.RandomTest",
runtime_deps = [
"@maven//:org_junit_jupiter_junit_jupiter_engine",
"@maven//:org_junit_platform_junit_platform_launcher",
"@maven//:org_junit_platform_junit_platform_reporting",
],
deps = [
":hastestutil-test-lib",
"//src/main/com/example/annotation",
"@maven//:org_junit_jupiter_junit_jupiter_api",
],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.example.hastestutil;

public class RandomNumberGenerator {
public static int generateNumberLessThanTwo() {
Random random = new Random();
return random.nextInt(2);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.example.hastestutil;

import com.example.annotation.FlakyTest;
import org.junit.jupiter.api.Test;

import java.util.Random;

import static org.junit.jupiter.api.Assertions.assertEquals;

@FlakyTest
public class RandomTest {
@Test
public void unreliableTest() {
int r = RandomNumberGenerator.generateNumberLessThanTwo();
assertEquals(r, 0);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.example.hastestutil;

import org.junit.jupiter.api.Test;

import java.util.Random;

import static org.junit.jupiter.api.Assertions.assertTrue;

public class ReliableTest {
@Test
public void reliableTest() {
int r = RandomNumberGenerator.generateNumberLessThanTwo();
assertTrue(r < 2);
}
}

0 comments on commit 306e4da

Please sign in to comment.