From 306e4daf66630e5a526eb5350714df7520be5595 Mon Sep 17 00:00:00 2001 From: Daniel Wagner-Hall Date: Tue, 16 Jan 2024 16:13:56 +0000 Subject: [PATCH] gazelle: Standalone tests depend on their test libraries (#241) --- java/gazelle/generate.go | 24 ++++++++++--- java/gazelle/generate_test.go | 2 +- .../src/test/com/hastestutil/BUILD.out | 36 +++++++++++++++++++ .../hastestutil/RandomNumberGenerator.java | 8 +++++ .../src/test/com/hastestutil/RandomTest.java | 17 +++++++++ .../test/com/hastestutil/ReliableTest.java | 15 ++++++++ 6 files changed, 97 insertions(+), 5 deletions(-) create mode 100644 java/gazelle/testdata/attribute_setting/src/test/com/hastestutil/BUILD.out create mode 100644 java/gazelle/testdata/attribute_setting/src/test/com/hastestutil/RandomNumberGenerator.java create mode 100644 java/gazelle/testdata/attribute_setting/src/test/com/hastestutil/RandomTest.java create mode 100644 java/gazelle/testdata/attribute_setting/src/test/com/hastestutil/ReliableTest.java diff --git a/java/gazelle/generate.go b/java/gazelle/generate.go index cafb6ce9..6efa8b7c 100644 --- a/java/gazelle/generate.go +++ b/java/gazelle/generate.go @@ -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) } @@ -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": @@ -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) } } } @@ -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 @@ -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())) } @@ -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 +} diff --git a/java/gazelle/generate_test.go b/java/gazelle/generate_test.go index d14e76d4..31564aa8 100644 --- a/java/gazelle/generate_test.go +++ b/java/gazelle/generate_test.go @@ -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") diff --git a/java/gazelle/testdata/attribute_setting/src/test/com/hastestutil/BUILD.out b/java/gazelle/testdata/attribute_setting/src/test/com/hastestutil/BUILD.out new file mode 100644 index 00000000..8949bd37 --- /dev/null +++ b/java/gazelle/testdata/attribute_setting/src/test/com/hastestutil/BUILD.out @@ -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", + ], +) diff --git a/java/gazelle/testdata/attribute_setting/src/test/com/hastestutil/RandomNumberGenerator.java b/java/gazelle/testdata/attribute_setting/src/test/com/hastestutil/RandomNumberGenerator.java new file mode 100644 index 00000000..da0f1c3a --- /dev/null +++ b/java/gazelle/testdata/attribute_setting/src/test/com/hastestutil/RandomNumberGenerator.java @@ -0,0 +1,8 @@ +package com.example.hastestutil; + +public class RandomNumberGenerator { + public static int generateNumberLessThanTwo() { + Random random = new Random(); + return random.nextInt(2); + } +} diff --git a/java/gazelle/testdata/attribute_setting/src/test/com/hastestutil/RandomTest.java b/java/gazelle/testdata/attribute_setting/src/test/com/hastestutil/RandomTest.java new file mode 100644 index 00000000..19994d0d --- /dev/null +++ b/java/gazelle/testdata/attribute_setting/src/test/com/hastestutil/RandomTest.java @@ -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); + } +} diff --git a/java/gazelle/testdata/attribute_setting/src/test/com/hastestutil/ReliableTest.java b/java/gazelle/testdata/attribute_setting/src/test/com/hastestutil/ReliableTest.java new file mode 100644 index 00000000..5ee8d8a3 --- /dev/null +++ b/java/gazelle/testdata/attribute_setting/src/test/com/hastestutil/ReliableTest.java @@ -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); + } +}