From 7aafc050070368e94d737ebf3536572b15c01861 Mon Sep 17 00:00:00 2001 From: Daniel Wagner-Hall Date: Tue, 30 Aug 2022 14:57:28 -0400 Subject: [PATCH] Allow setting wrapper targets based on annotations This allows for registering that, e.g. ```java @RequiresNetwork class SomeTest {} ``` should be generated as: ```starlark requires_network( java_test, ... ) ``` instead of: ```starlark java_test( ... ) ``` In suite mode, separate targets will be generated for these special targets. --- java/gazelle/BUILD.bazel | 1 + java/gazelle/configure.go | 50 +++ java/gazelle/generate.go | 48 ++- java/gazelle/generate_test.go | 27 +- java/gazelle/javaconfig/config.go | 24 ++ java/gazelle/lang.go | 39 +- java/gazelle/resolve.go | 7 +- .../testdata/annotation_to_wrapper/WORKSPACE | 0 .../annotation_to_wrapper/arguments.txt | 1 + .../annotation_to_wrapper/maven_install.json | 344 ++++++++++++++++++ .../main/com/example/annotations/BUILD.out | 7 + .../example/annotations/RequiresNetwork.java | 3 + .../src/test/java/com/example/tests/BUILD.out | 33 ++ .../example/tests/RequiresNetworkTest.java | 12 + .../java/com/example/tests/SimpleTest.java | 8 + 15 files changed, 585 insertions(+), 19 deletions(-) create mode 100644 java/gazelle/testdata/annotation_to_wrapper/WORKSPACE create mode 100644 java/gazelle/testdata/annotation_to_wrapper/arguments.txt create mode 100644 java/gazelle/testdata/annotation_to_wrapper/maven_install.json create mode 100644 java/gazelle/testdata/annotation_to_wrapper/src/main/com/example/annotations/BUILD.out create mode 100644 java/gazelle/testdata/annotation_to_wrapper/src/main/com/example/annotations/RequiresNetwork.java create mode 100644 java/gazelle/testdata/annotation_to_wrapper/src/test/java/com/example/tests/BUILD.out create mode 100644 java/gazelle/testdata/annotation_to_wrapper/src/test/java/com/example/tests/RequiresNetworkTest.java create mode 100644 java/gazelle/testdata/annotation_to_wrapper/src/test/java/com/example/tests/SimpleTest.java diff --git a/java/gazelle/BUILD.bazel b/java/gazelle/BUILD.bazel index 96081d9c..2ea896f5 100644 --- a/java/gazelle/BUILD.bazel +++ b/java/gazelle/BUILD.bazel @@ -20,6 +20,7 @@ go_library( "//java/gazelle/private/javaparser", "//java/gazelle/private/logconfig", "//java/gazelle/private/maven", + "//java/gazelle/private/sorted_multiset", "//java/gazelle/private/sorted_set", "//java/gazelle/private/types", "@bazel_gazelle//config:go_default_library", diff --git a/java/gazelle/configure.go b/java/gazelle/configure.go index 3d6e321c..19006343 100644 --- a/java/gazelle/configure.go +++ b/java/gazelle/configure.go @@ -20,6 +20,7 @@ import ( type Configurer struct { lang *javaLang annotationToAttribute annotationToAttribute + annotationToWrapper annotationToWrapper mavenInstallFile string } @@ -27,11 +28,13 @@ func NewConfigurer(lang *javaLang) *Configurer { return &Configurer{ lang: lang, annotationToAttribute: make(annotationToAttribute), + annotationToWrapper: make(annotationToWrapper), } } func (jc *Configurer) RegisterFlags(fs *flag.FlagSet, cmd string, c *config.Config) { fs.Var(&jc.annotationToAttribute, "java-annotation-to-attribute", "Mapping of annotations (on test classes) to attributes which should be set for that test rule. Examples: com.example.annotations.FlakyTest=flaky=True com.example.annotations.SlowTest=timeout=\"long\"") + fs.Var(&jc.annotationToWrapper, "java-annotation-to-wrapper", "Mapping of annotations (on test classes) to wrapper rules which should be used around the test rule. Example: com.example.annotations.RequiresNetwork=@some//wrapper:file.bzl=requires_network") fs.StringVar(&jc.mavenInstallFile, "java-maven-install-file", "", "Path of the maven_install.json file. Defaults to \"maven_install.json\".") } @@ -42,6 +45,9 @@ func (jc *Configurer) CheckFlags(fs *flag.FlagSet, c *config.Config) error { cfgs[""].MapAnnotationToAttribute(annotation, k, v) } } + for annotation, wrapper := range jc.annotationToWrapper { + cfgs[""].MapAnnotationToWrapper(annotation, wrapper.symbol) + } if jc.mavenInstallFile != "" { cfgs[""].SetMavenInstallFile(jc.mavenInstallFile) } @@ -192,3 +198,47 @@ func (f *annotationToAttribute) Set(value string) error { (*f)[annotationClassName][key] = parsedValue return nil } + +type loadInfo struct { + from string + symbol string +} + +type annotationToWrapper map[string]loadInfo + +func (f *annotationToWrapper) String() string { + s := "annotationToWrapper{" + for a, li := range *f { + s += a + ": " + s += fmt.Sprintf(`load("%s", "%s")`, li.from, li.symbol) + } + s += "}" + return s +} + +func (f *annotationToWrapper) Set(value string) error { + parts := strings.Split(value, "=") + if len(parts) != 2 { + return fmt.Errorf("want --java-annotation-to-wrapper to have format com.example.RequiresNetwork=@some_repo//has:wrapper.bzl,wrapper_rule but didn't see exactly one equals sign") + } + annotation := parts[0] + + if _, ok := (*f)[annotation]; ok { + return fmt.Errorf("saw conflicting values for --java-annotation-to-wrapper flag for annotation %v", annotation) + } + + vParts := strings.Split(parts[1], ",") + if len(vParts) != 2 { + return fmt.Errorf("want --java-annotation-to-wrapper to have format com.example.RequiresNetwork=@some_repo//has:wrapper.bzl,wrapper_rule but didn't see exactly one comma after equals sign") + } + + from := vParts[0] + symbol := vParts[1] + + (*f)[annotation] = loadInfo{ + from: from, + symbol: symbol, + } + + return nil +} diff --git a/java/gazelle/generate.go b/java/gazelle/generate.go index 6efa8b7c..4480102d 100644 --- a/java/gazelle/generate.go +++ b/java/gazelle/generate.go @@ -36,6 +36,11 @@ func javaFileLess(l, r javaFile) bool { return l.pathRelativeToBazelWorkspaceRoot < r.pathRelativeToBazelWorkspaceRoot } +type separateJavaTestReasons struct { + attributes map[string]bzl.Expr + wrapper string +} + // GenerateRules extracts build metadata from source files in a directory. // // See language.GenerateRules for more information. @@ -114,7 +119,7 @@ func (l javaLang) GenerateRules(args language.GenerateArgs) language.GenerateRes testJavaImports := sorted_set.NewSortedSetFn([]types.PackageName{}, types.PackageNameLess) // Java Test files which need to be generated separately from any others because they have explicit attribute overrides. - separateTestJavaFiles := make(map[javaFile]map[string]bzl.Expr) + separateTestJavaFiles := make(map[javaFile]separateJavaTestReasons) // Files which are used by non-test classes in test java packages. testHelperJavaFiles := sorted_set.NewSortedSetFn([]javaFile{}, javaFileLess) @@ -234,8 +239,8 @@ func (l javaLang) GenerateRules(args language.GenerateArgs) language.GenerateRes switch cfg.TestMode() { case "file": for _, tf := range testJavaFiles.SortedSlice() { - extraAttributes := separateTestJavaFiles[tf] - l.generateJavaTest(args.File, args.Rel, cfg.MavenRepositoryName(), tf, isModule, testJavaImportsWithHelpers, nil, extraAttributes, &res) + separateJavaTestReasons := separateTestJavaFiles[tf] + l.generateJavaTest(args.File, args.Rel, cfg.MavenRepositoryName(), tf, isModule, testJavaImportsWithHelpers, nil, separateJavaTestReasons.wrapper, separateJavaTestReasons.attributes, &res) } case "suite": @@ -278,7 +283,8 @@ func (l javaLang) GenerateRules(args language.GenerateArgs) language.GenerateRes if testHelperJavaFiles.Len() > 0 { testHelperDep = ptr(testHelperLibname(suiteName)) } - l.generateJavaTest(args.File, args.Rel, cfg.MavenRepositoryName(), src, isModule, testJavaImportsWithHelpers, testHelperDep, separateTestJavaFiles[src], &res) + separateJavaTestReasons := separateTestJavaFiles[src] + l.generateJavaTest(args.File, args.Rel, cfg.MavenRepositoryName(), src, isModule, testJavaImportsWithHelpers, testHelperDep, separateJavaTestReasons.wrapper, separateJavaTestReasons.attributes, &res) } } } @@ -407,10 +413,11 @@ func addFilteringOutOwnPackage(to *sorted_set.SortedSet[types.PackageName], from } } -func accumulateJavaFile(cfg *javaconfig.Config, testJavaFiles, testHelperJavaFiles *sorted_set.SortedSet[javaFile], separateTestJavaFiles map[javaFile]map[string]bzl.Expr, file javaFile, perClassMetadata map[string]java.PerClassMetadata, log zerolog.Logger) { +func accumulateJavaFile(cfg *javaconfig.Config, testJavaFiles, testHelperJavaFiles *sorted_set.SortedSet[javaFile], separateTestJavaFiles map[javaFile]separateJavaTestReasons, file javaFile, perClassMetadata map[string]java.PerClassMetadata, log zerolog.Logger) { if cfg.IsJavaTestFile(filepath.Base(file.pathRelativeToBazelWorkspaceRoot)) { annotationClassNames := perClassMetadata[file.ClassName().FullyQualifiedClassName()].AnnotationClassNames perFileAttrs := make(map[string]bzl.Expr) + wrapper := "" for _, annotationClassName := range annotationClassNames.SortedSlice() { if attrs, ok := cfg.AttributesForAnnotation(annotationClassName); ok { for k, v := range attrs { @@ -420,10 +427,20 @@ func accumulateJavaFile(cfg *javaconfig.Config, testJavaFiles, testHelperJavaFil perFileAttrs[k] = v } } + newWrapper, ok := cfg.WrapperForAnnotation(annotationClassName) + if ok { + if wrapper != "" { + log.Error().Str("file", file.pathRelativeToBazelWorkspaceRoot).Msgf("Saw conflicting wrappers from annotations: %v and %v. Picking one at random.", wrapper, newWrapper) + } + wrapper = newWrapper + } } testJavaFiles.Add(file) - if len(perFileAttrs) > 0 { - separateTestJavaFiles[file] = perFileAttrs + if len(perFileAttrs) > 0 || wrapper != "" { + separateTestJavaFiles[file] = separateJavaTestReasons{ + attributes: perFileAttrs, + wrapper: wrapper, + } } } else { testHelperJavaFiles.Add(file) @@ -488,7 +505,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], depOnTestHelpers *string, 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, wrapper string, extraAttributes map[string]bzl.Expr, res *language.GenerateResult) { className := f.ClassName() fullyQualifiedTestClass := className.FullyQualifiedClassName() var testName string @@ -498,12 +515,12 @@ func (l javaLang) generateJavaTest(file *rule.File, pathToPackageRelativeToBazel testName = className.BareOuterClassName() } - ruleKind := "java_test" + javaRuleKind := "java_test" if importsJunit5(imports) { - ruleKind = "java_junit5_test" + javaRuleKind = "java_junit5_test" } - runtimeDeps := l.collectRuntimeDeps(ruleKind, testName, file) + runtimeDeps := l.collectRuntimeDeps(javaRuleKind, testName, file) if importsJunit5(imports) { // This should probably register imports here, and then allow the // resolver to resolve this to an artifact, but we don't currently wire @@ -514,7 +531,16 @@ func (l javaLang) generateJavaTest(file *rule.File, pathToPackageRelativeToBazel } } + ruleKind := javaRuleKind + if wrapper != "" { + ruleKind = wrapper + } + r := rule.NewRule(ruleKind, testName) + if wrapper != "" { + r.AddArg(&bzl.Ident{Name: javaRuleKind}) + } + path := strings.TrimPrefix(f.pathRelativeToBazelWorkspaceRoot, pathToPackageRelativeToBazelWorkspace+"/") r.SetAttr("srcs", []string{path}) r.SetAttr("test_class", fullyQualifiedTestClass) diff --git a/java/gazelle/generate_test.go b/java/gazelle/generate_test.go index 31564aa8..1dcc28a0 100644 --- a/java/gazelle/generate_test.go +++ b/java/gazelle/generate_test.go @@ -6,6 +6,7 @@ import ( "github.com/bazel-contrib/rules_jvm/java/gazelle/private/sorted_set" "github.com/bazel-contrib/rules_jvm/java/gazelle/private/types" "github.com/bazelbuild/bazel-gazelle/language" + bzl "github.com/bazelbuild/buildtools/build" "github.com/google/go-cmp/cmp" "github.com/rs/zerolog" "github.com/stretchr/testify/require" @@ -19,10 +20,12 @@ func TestSingleJavaTestFile(t *testing.T) { type testCase struct { includePackageInName bool importedPackages []string + wrapper string wantRuleKind string wantImports []string wantDeps []string wantRuntimeDeps []string + wantArgs []bzl.Expr } for name, tc := range map[string]testCase{ @@ -86,6 +89,14 @@ func TestSingleJavaTestFile(t *testing.T) { wantRuleKind: "java_test", wantImports: []string{"com.example", "org.junit"}, }, + "wrapper junit4": { + includePackageInName: false, + importedPackages: []string{"org.junit"}, + wrapper: "some_wrapper", + wantRuleKind: "some_wrapper", + wantImports: []string{"com.example", "org.junit"}, + wantArgs: []bzl.Expr{&bzl.Ident{Name: "java_test"}}, + }, "explicit junit5": { includePackageInName: false, importedPackages: []string{"org.junit.jupiter.api"}, @@ -119,6 +130,19 @@ func TestSingleJavaTestFile(t *testing.T) { "@maven//:org_junit_platform_junit_platform_reporting", }, }, + "wrapper junit5": { + includePackageInName: false, + importedPackages: []string{"org.junit.jupiter.api"}, + wrapper: "some_wrapper", + wantRuleKind: "some_wrapper", + wantImports: []string{"com.example", "org.junit.jupiter.api"}, + wantRuntimeDeps: []string{ + "@maven//:org_junit_jupiter_junit_jupiter_engine", + "@maven//:org_junit_platform_junit_platform_launcher", + "@maven//:org_junit_platform_junit_platform_reporting", + }, + wantArgs: []bzl.Expr{&bzl.Ident{Name: "java_junit5_test"}}, + }, "explicit both junit4 and junit5": { includePackageInName: false, importedPackages: []string{"org.junit", "org.junit.jupiter.api"}, @@ -135,7 +159,7 @@ func TestSingleJavaTestFile(t *testing.T) { var res language.GenerateResult l := newTestJavaLang(t) - l.generateJavaTest(nil, "", "maven", f, tc.includePackageInName, stringsToPackageNames(tc.importedPackages), nil, nil, &res) + l.generateJavaTest(nil, "", "maven", f, tc.includePackageInName, stringsToPackageNames(tc.importedPackages), nil, tc.wrapper, nil, &res) require.Len(t, res.Gen, 1, "want 1 generated rule") @@ -154,6 +178,7 @@ func TestSingleJavaTestFile(t *testing.T) { wantAttrs = append(wantAttrs, "runtime_deps") } require.ElementsMatch(t, wantAttrs, rule.AttrKeys()) + require.ElementsMatch(t, tc.wantArgs, rule.Args()) require.Len(t, res.Imports, 1, "want 1 generated importedPackages") wantImports := sorted_set.NewSortedSetFn([]types.PackageName{}, types.PackageNameLess) diff --git a/java/gazelle/javaconfig/config.go b/java/gazelle/javaconfig/config.go index 588987ce..c6c3103b 100644 --- a/java/gazelle/javaconfig/config.go +++ b/java/gazelle/javaconfig/config.go @@ -70,6 +70,7 @@ func (c *Config) NewChild() *Config { testMode: c.testMode, customTestFileSuffixes: c.customTestFileSuffixes, annotationToAttribute: c.annotationToAttribute, + annotationToWrapper: c.annotationToWrapper, excludedArtifacts: clonedExcludedArtifacts, mavenRepositoryName: c.mavenRepositoryName, } @@ -99,6 +100,7 @@ type Config struct { customTestFileSuffixes *[]string excludedArtifacts map[string]struct{} annotationToAttribute map[string]map[string]bzl.Expr + annotationToWrapper map[string]string mavenRepositoryName string } @@ -120,6 +122,7 @@ func New(repoRoot string) *Config { customTestFileSuffixes: nil, excludedArtifacts: make(map[string]struct{}), annotationToAttribute: make(map[string]map[string]bzl.Expr), + annotationToWrapper: make(map[string]string), mavenRepositoryName: "maven", } } @@ -244,6 +247,27 @@ func (c *Config) AttributesForAnnotation(annotation string) (map[string]bzl.Expr return m, ok } +func (c *Config) MapAnnotationToWrapper(annotation string, wrapper string) { + c.annotationToWrapper[annotation] = wrapper +} + +func (c *Config) WrapperForAnnotation(annotation string) (string, bool) { + s, ok := c.annotationToWrapper[annotation] + return s, ok +} + +func (c *Config) IsTestRule(ruleKind string) bool { + if ruleKind == "java_junit5_test" || ruleKind == "java_test" || ruleKind == "java_test_suite" { + return true + } + for _, wrapper := range c.annotationToWrapper { + if ruleKind == wrapper { + return true + } + } + return false +} + func equalStringSlices(l, r []string) bool { if len(l) != len(r) { return false diff --git a/java/gazelle/lang.go b/java/gazelle/lang.go index 9dc2baef..1340fc61 100644 --- a/java/gazelle/lang.go +++ b/java/gazelle/lang.go @@ -8,6 +8,7 @@ import ( "github.com/bazel-contrib/rules_jvm/java/gazelle/private/javaparser" "github.com/bazel-contrib/rules_jvm/java/gazelle/private/logconfig" "github.com/bazel-contrib/rules_jvm/java/gazelle/private/maven" + "github.com/bazel-contrib/rules_jvm/java/gazelle/private/sorted_multiset" "github.com/bazelbuild/bazel-gazelle/config" "github.com/bazelbuild/bazel-gazelle/language" "github.com/bazelbuild/bazel-gazelle/resolve" @@ -112,7 +113,7 @@ var javaLibraryKind = rule.KindInfo{ } func (l javaLang) Kinds() map[string]rule.KindInfo { - return map[string]rule.KindInfo{ + kinds := map[string]rule.KindInfo{ "java_binary": kindWithRuntimeDeps, "java_junit5_test": kindWithRuntimeDeps, "java_library": javaLibraryKind, @@ -121,13 +122,16 @@ func (l javaLang) Kinds() map[string]rule.KindInfo { "java_proto_library": kindWithoutRuntimeDeps, "java_grpc_library": kindWithoutRuntimeDeps, } -} -func isTestRule(kind string) bool { - return kind == "java_junit5_test" || kind == "java_test" || kind == "java_test_suite" + c := l.Configurer.(*Configurer) + for _, wrapper := range c.annotationToWrapper { + kinds[wrapper.symbol] = kindWithRuntimeDeps + } + + return kinds } -var javaLoads = []rule.LoadInfo{ +var baseJavaLoads = []rule.LoadInfo{ { Name: "@io_grpc_grpc_java//:java_grpc_library.bzl", Symbols: []string{ @@ -153,7 +157,30 @@ var javaLoads = []rule.LoadInfo{ } func (l javaLang) Loads() []rule.LoadInfo { - return javaLoads + c := l.Configurer.(*Configurer) + if len(c.annotationToWrapper) == 0 { + return baseJavaLoads + } + + s := sorted_multiset.NewSortedMultiSet[string, string]() + for _, li := range baseJavaLoads { + for _, symbol := range li.Symbols { + s.Add(li.Name, symbol) + } + } + + for _, wrapper := range c.annotationToWrapper { + s.Add(wrapper.from, wrapper.symbol) + } + + var loads []rule.LoadInfo + for _, name := range s.Keys() { + loads = append(loads, rule.LoadInfo{ + Name: name, + Symbols: s.Values(name), + }) + } + return loads } func (l javaLang) Fix(c *config.Config, f *rule.File) {} diff --git a/java/gazelle/resolve.go b/java/gazelle/resolve.go index ff9434d5..9b76d79e 100644 --- a/java/gazelle/resolve.go +++ b/java/gazelle/resolve.go @@ -88,7 +88,12 @@ func (jr Resolver) Resolve(c *config.Config, ix *resolve.RuleIndex, rc *repo.Rem if packageConfig == nil { jr.lang.logger.Fatal().Msg("failed retrieving package config") } - isTestRule := isTestRule(r.Kind()) + isTestRule := packageConfig.IsTestRule(r.Kind()) + if literalExpr, ok := r.Attr("testonly").(*build.LiteralExpr); ok { + if literalExpr.Token == "True" { + isTestRule = true + } + } jr.populateAttr(c, packageConfig, r, "deps", resolveInput.ImportedPackageNames, ix, isTestRule, from, resolveInput.PackageNames) jr.populateAttr(c, packageConfig, r, "exports", resolveInput.ExportedPackageNames, ix, isTestRule, from, resolveInput.PackageNames) diff --git a/java/gazelle/testdata/annotation_to_wrapper/WORKSPACE b/java/gazelle/testdata/annotation_to_wrapper/WORKSPACE new file mode 100644 index 00000000..e69de29b diff --git a/java/gazelle/testdata/annotation_to_wrapper/arguments.txt b/java/gazelle/testdata/annotation_to_wrapper/arguments.txt new file mode 100644 index 00000000..47aa2093 --- /dev/null +++ b/java/gazelle/testdata/annotation_to_wrapper/arguments.txt @@ -0,0 +1 @@ +-java-annotation-to-wrapper=com.example.annotations.RequiresNetwork=@some//:requires_network.bzl,requires_network diff --git a/java/gazelle/testdata/annotation_to_wrapper/maven_install.json b/java/gazelle/testdata/annotation_to_wrapper/maven_install.json new file mode 100644 index 00000000..3939c1d1 --- /dev/null +++ b/java/gazelle/testdata/annotation_to_wrapper/maven_install.json @@ -0,0 +1,344 @@ +{ + "dependency_tree": { + "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL", + "__INPUT_ARTIFACTS_HASH": -1688675623, + "__RESOLVED_ARTIFACTS_HASH": 526320599, + "conflict_resolution": {}, + "dependencies": [ + { + "coord": "org.apiguardian:apiguardian-api:1.1.2", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/repo1.maven.org/maven2/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar" + ], + "packages": [ + "org.apiguardian.api" + ], + "sha256": "b509448ac506d607319f182537f0b35d71007582ec741832a1f111e5b5b70b38", + "url": "https://repo1.maven.org/maven2/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2.jar" + }, + { + "coord": "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/repo1.maven.org/maven2/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2-sources.jar" + ], + "packages": [], + "sha256": "277a7a4315412817beb6655b324dc7276621e95ebff00b8bf65e17a27b685e2d", + "url": "https://repo1.maven.org/maven2/org/apiguardian/apiguardian-api/1.1.2/apiguardian-api-1.1.2-sources.jar" + }, + { + "coord": "org.junit.jupiter:junit-jupiter-api:5.8.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:1.1.2", + "org.junit.platform:junit-platform-commons:1.8.2", + "org.opentest4j:opentest4j:1.2.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:1.1.2", + "org.junit.platform:junit-platform-commons:1.8.2", + "org.opentest4j:opentest4j:1.2.0" + ], + "file": "v1/https/repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-api/5.8.2/junit-jupiter-api-5.8.2.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-api/5.8.2/junit-jupiter-api-5.8.2.jar" + ], + "packages": [ + "org.junit.jupiter.api", + "org.junit.jupiter.api.condition", + "org.junit.jupiter.api.extension", + "org.junit.jupiter.api.extension.support", + "org.junit.jupiter.api.function", + "org.junit.jupiter.api.io", + "org.junit.jupiter.api.parallel" + ], + "sha256": "1808ee87e0f718cd6e25f3b75afc17956ac8a3edc48c7e9bab9f19f9a79e3801", + "url": "https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-api/5.8.2/junit-jupiter-api-5.8.2.jar" + }, + { + "coord": "org.junit.jupiter:junit-jupiter-api:jar:sources:5.8.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "org.junit.platform:junit-platform-commons:jar:sources:1.8.2", + "org.opentest4j:opentest4j:jar:sources:1.2.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "org.junit.platform:junit-platform-commons:jar:sources:1.8.2", + "org.opentest4j:opentest4j:jar:sources:1.2.0" + ], + "file": "v1/https/repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-api/5.8.2/junit-jupiter-api-5.8.2-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-api/5.8.2/junit-jupiter-api-5.8.2-sources.jar" + ], + "packages": [], + "sha256": "cb38569ae9005eb54c7cbc181b842e6eb01be57ae0d785f9167d9e019b44a670", + "url": "https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-api/5.8.2/junit-jupiter-api-5.8.2-sources.jar" + }, + { + "coord": "org.junit.jupiter:junit-jupiter-engine:5.8.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:1.1.2", + "org.junit.jupiter:junit-jupiter-api:5.8.2", + "org.junit.platform:junit-platform-commons:1.8.2", + "org.junit.platform:junit-platform-engine:1.8.2", + "org.opentest4j:opentest4j:1.2.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:1.1.2", + "org.junit.jupiter:junit-jupiter-api:5.8.2", + "org.junit.platform:junit-platform-engine:1.8.2" + ], + "file": "v1/https/repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-engine/5.8.2/junit-jupiter-engine-5.8.2.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-engine/5.8.2/junit-jupiter-engine-5.8.2.jar" + ], + "packages": [ + "org.junit.jupiter.engine", + "org.junit.jupiter.engine.config", + "org.junit.jupiter.engine.descriptor", + "org.junit.jupiter.engine.discovery", + "org.junit.jupiter.engine.discovery.predicates", + "org.junit.jupiter.engine.execution", + "org.junit.jupiter.engine.extension", + "org.junit.jupiter.engine.support" + ], + "sha256": "753b7726cdd158bb34cedb94c161e2291896f47832a1e9eda53d970020a8184e", + "url": "https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-engine/5.8.2/junit-jupiter-engine-5.8.2.jar" + }, + { + "coord": "org.junit.jupiter:junit-jupiter-engine:jar:sources:5.8.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "org.junit.jupiter:junit-jupiter-api:jar:sources:5.8.2", + "org.junit.platform:junit-platform-commons:jar:sources:1.8.2", + "org.junit.platform:junit-platform-engine:jar:sources:1.8.2", + "org.opentest4j:opentest4j:jar:sources:1.2.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "org.junit.jupiter:junit-jupiter-api:jar:sources:5.8.2", + "org.junit.platform:junit-platform-engine:jar:sources:1.8.2" + ], + "file": "v1/https/repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-engine/5.8.2/junit-jupiter-engine-5.8.2-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-engine/5.8.2/junit-jupiter-engine-5.8.2-sources.jar" + ], + "packages": [], + "sha256": "9ed4edf417cbc6028c634a0b407061433327c9ef4235fca35b9183da855e2e8f", + "url": "https://repo1.maven.org/maven2/org/junit/jupiter/junit-jupiter-engine/5.8.2/junit-jupiter-engine-5.8.2-sources.jar" + }, + { + "coord": "org.junit.platform:junit-platform-commons:1.8.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:1.1.2" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:1.1.2" + ], + "file": "v1/https/repo1.maven.org/maven2/org/junit/platform/junit-platform-commons/1.8.2/junit-platform-commons-1.8.2.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-commons/1.8.2/junit-platform-commons-1.8.2.jar" + ], + "packages": [ + "org.junit.platform.commons", + "org.junit.platform.commons.annotation", + "org.junit.platform.commons.function", + "org.junit.platform.commons.logging", + "org.junit.platform.commons.support", + "org.junit.platform.commons.util" + ], + "sha256": "d2e015fca7130e79af2f4608dc54415e4b10b592d77333decb4b1a274c185050", + "url": "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-commons/1.8.2/junit-platform-commons-1.8.2.jar" + }, + { + "coord": "org.junit.platform:junit-platform-commons:jar:sources:1.8.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2" + ], + "file": "v1/https/repo1.maven.org/maven2/org/junit/platform/junit-platform-commons/1.8.2/junit-platform-commons-1.8.2-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-commons/1.8.2/junit-platform-commons-1.8.2-sources.jar" + ], + "packages": [], + "sha256": "7ae3683c452ee4259b2d205d56c7172fd178180b02d20b4430368ef6ee501c3b", + "url": "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-commons/1.8.2/junit-platform-commons-1.8.2-sources.jar" + }, + { + "coord": "org.junit.platform:junit-platform-engine:1.8.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:1.1.2", + "org.junit.platform:junit-platform-commons:1.8.2", + "org.opentest4j:opentest4j:1.2.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:1.1.2", + "org.junit.platform:junit-platform-commons:1.8.2", + "org.opentest4j:opentest4j:1.2.0" + ], + "file": "v1/https/repo1.maven.org/maven2/org/junit/platform/junit-platform-engine/1.8.2/junit-platform-engine-1.8.2.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-engine/1.8.2/junit-platform-engine-1.8.2.jar" + ], + "packages": [ + "org.junit.platform.engine", + "org.junit.platform.engine.discovery", + "org.junit.platform.engine.reporting", + "org.junit.platform.engine.support.config", + "org.junit.platform.engine.support.descriptor", + "org.junit.platform.engine.support.discovery", + "org.junit.platform.engine.support.filter", + "org.junit.platform.engine.support.hierarchical" + ], + "sha256": "0b7d000f8c3e8e5f7d6b819649936e7b9938314e87c8f983805218ea57567e59", + "url": "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-engine/1.8.2/junit-platform-engine-1.8.2.jar" + }, + { + "coord": "org.junit.platform:junit-platform-engine:jar:sources:1.8.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "org.junit.platform:junit-platform-commons:jar:sources:1.8.2", + "org.opentest4j:opentest4j:jar:sources:1.2.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "org.junit.platform:junit-platform-commons:jar:sources:1.8.2", + "org.opentest4j:opentest4j:jar:sources:1.2.0" + ], + "file": "v1/https/repo1.maven.org/maven2/org/junit/platform/junit-platform-engine/1.8.2/junit-platform-engine-1.8.2-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-engine/1.8.2/junit-platform-engine-1.8.2-sources.jar" + ], + "packages": [], + "sha256": "4cfda26b1dc0812fcf0a14b0bb5612b7c697e50afd79819d2e07b1faef9c239b", + "url": "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-engine/1.8.2/junit-platform-engine-1.8.2-sources.jar" + }, + { + "coord": "org.junit.platform:junit-platform-launcher:1.8.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:1.1.2", + "org.junit.platform:junit-platform-commons:1.8.2", + "org.junit.platform:junit-platform-engine:1.8.2", + "org.opentest4j:opentest4j:1.2.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:1.1.2", + "org.junit.platform:junit-platform-engine:1.8.2" + ], + "file": "v1/https/repo1.maven.org/maven2/org/junit/platform/junit-platform-launcher/1.8.2/junit-platform-launcher-1.8.2.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-launcher/1.8.2/junit-platform-launcher-1.8.2.jar" + ], + "packages": [ + "org.junit.platform.launcher", + "org.junit.platform.launcher.core", + "org.junit.platform.launcher.listeners", + "org.junit.platform.launcher.listeners.discovery", + "org.junit.platform.launcher.listeners.session", + "org.junit.platform.launcher.tagexpression" + ], + "sha256": "822156409fd83e682e4c5199b3460054299b538a058c2c6d0f5c9b6a5bdb7594", + "url": "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-launcher/1.8.2/junit-platform-launcher-1.8.2.jar" + }, + { + "coord": "org.junit.platform:junit-platform-launcher:jar:sources:1.8.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "org.junit.platform:junit-platform-commons:jar:sources:1.8.2", + "org.junit.platform:junit-platform-engine:jar:sources:1.8.2", + "org.opentest4j:opentest4j:jar:sources:1.2.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "org.junit.platform:junit-platform-engine:jar:sources:1.8.2" + ], + "file": "v1/https/repo1.maven.org/maven2/org/junit/platform/junit-platform-launcher/1.8.2/junit-platform-launcher-1.8.2-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-launcher/1.8.2/junit-platform-launcher-1.8.2-sources.jar" + ], + "packages": [], + "sha256": "ee8440e84c23e52519b57e77a30627f80d91ac148244162ee2eea1ba809c1bdc", + "url": "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-launcher/1.8.2/junit-platform-launcher-1.8.2-sources.jar" + }, + { + "coord": "org.junit.platform:junit-platform-reporting:1.8.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:1.1.2", + "org.junit.platform:junit-platform-commons:1.8.2", + "org.junit.platform:junit-platform-engine:1.8.2", + "org.junit.platform:junit-platform-launcher:1.8.2", + "org.opentest4j:opentest4j:1.2.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:1.1.2", + "org.junit.platform:junit-platform-launcher:1.8.2" + ], + "file": "v1/https/repo1.maven.org/maven2/org/junit/platform/junit-platform-reporting/1.8.2/junit-platform-reporting-1.8.2.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-reporting/1.8.2/junit-platform-reporting-1.8.2.jar" + ], + "packages": [ + "org.junit.platform.reporting.legacy", + "org.junit.platform.reporting.legacy.xml" + ], + "sha256": "d28048333b378d166f9ad38c2a8e34ac0fa1a29cc016cb279df53c8b54628fc3", + "url": "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-reporting/1.8.2/junit-platform-reporting-1.8.2.jar" + }, + { + "coord": "org.junit.platform:junit-platform-reporting:jar:sources:1.8.2", + "dependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "org.junit.platform:junit-platform-commons:jar:sources:1.8.2", + "org.junit.platform:junit-platform-engine:jar:sources:1.8.2", + "org.junit.platform:junit-platform-launcher:jar:sources:1.8.2", + "org.opentest4j:opentest4j:jar:sources:1.2.0" + ], + "directDependencies": [ + "org.apiguardian:apiguardian-api:jar:sources:1.1.2", + "org.junit.platform:junit-platform-launcher:jar:sources:1.8.2" + ], + "file": "v1/https/repo1.maven.org/maven2/org/junit/platform/junit-platform-reporting/1.8.2/junit-platform-reporting-1.8.2-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-reporting/1.8.2/junit-platform-reporting-1.8.2-sources.jar" + ], + "packages": [], + "sha256": "489df906d84675ba6d078e076a5ffd8c8feec62e390539d6d61938de98b269f4", + "url": "https://repo1.maven.org/maven2/org/junit/platform/junit-platform-reporting/1.8.2/junit-platform-reporting-1.8.2-sources.jar" + }, + { + "coord": "org.opentest4j:opentest4j:1.2.0", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/repo1.maven.org/maven2/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar" + ], + "packages": [ + "org.opentest4j" + ], + "sha256": "58812de60898d976fb81ef3b62da05c6604c18fd4a249f5044282479fc286af2", + "url": "https://repo1.maven.org/maven2/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0.jar" + }, + { + "coord": "org.opentest4j:opentest4j:jar:sources:1.2.0", + "dependencies": [], + "directDependencies": [], + "file": "v1/https/repo1.maven.org/maven2/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0-sources.jar", + "mirror_urls": [ + "https://repo1.maven.org/maven2/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0-sources.jar" + ], + "packages": [], + "sha256": "b63495ef700fb2af2cdee8dd68659b27822650058234a602f9ed1d14b909a1a8", + "url": "https://repo1.maven.org/maven2/org/opentest4j/opentest4j/1.2.0/opentest4j-1.2.0-sources.jar" + } + ], + "version": "0.1.0" + } +} diff --git a/java/gazelle/testdata/annotation_to_wrapper/src/main/com/example/annotations/BUILD.out b/java/gazelle/testdata/annotation_to_wrapper/src/main/com/example/annotations/BUILD.out new file mode 100644 index 00000000..2ab1cf97 --- /dev/null +++ b/java/gazelle/testdata/annotation_to_wrapper/src/main/com/example/annotations/BUILD.out @@ -0,0 +1,7 @@ +load("@rules_java//java:defs.bzl", "java_library") + +java_library( + name = "annotations", + srcs = ["RequiresNetwork.java"], + visibility = ["//:__subpackages__"], +) diff --git a/java/gazelle/testdata/annotation_to_wrapper/src/main/com/example/annotations/RequiresNetwork.java b/java/gazelle/testdata/annotation_to_wrapper/src/main/com/example/annotations/RequiresNetwork.java new file mode 100644 index 00000000..2ec27eda --- /dev/null +++ b/java/gazelle/testdata/annotation_to_wrapper/src/main/com/example/annotations/RequiresNetwork.java @@ -0,0 +1,3 @@ +package com.example.annotations; + +public @interface RequiresNetwork {} diff --git a/java/gazelle/testdata/annotation_to_wrapper/src/test/java/com/example/tests/BUILD.out b/java/gazelle/testdata/annotation_to_wrapper/src/test/java/com/example/tests/BUILD.out new file mode 100644 index 00000000..deeaa85a --- /dev/null +++ b/java/gazelle/testdata/annotation_to_wrapper/src/test/java/com/example/tests/BUILD.out @@ -0,0 +1,33 @@ +load("@contrib_rules_jvm//java:defs.bzl", "java_junit5_test", "java_test_suite") +load("@some//:requires_network.bzl", "requires_network") + +java_test_suite( + name = "tests", + srcs = ["SimpleTest.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/annotations", + "@maven//:org_junit_jupiter_junit_jupiter_api", + ], +) + +requires_network( + java_junit5_test, + name = "RequiresNetworkTest", + srcs = ["RequiresNetworkTest.java"], + test_class = "com.example.tests.RequiresNetworkTest", + 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/annotations", + "@maven//:org_junit_jupiter_junit_jupiter_api", + ], +) diff --git a/java/gazelle/testdata/annotation_to_wrapper/src/test/java/com/example/tests/RequiresNetworkTest.java b/java/gazelle/testdata/annotation_to_wrapper/src/test/java/com/example/tests/RequiresNetworkTest.java new file mode 100644 index 00000000..b95803b7 --- /dev/null +++ b/java/gazelle/testdata/annotation_to_wrapper/src/test/java/com/example/tests/RequiresNetworkTest.java @@ -0,0 +1,12 @@ +package com.example.tests; + +import com.example.annotations.RequiresNetwork; + +import org.junit.jupiter.api.Test; + +@RequiresNetwork +public class RequiresNetworkTest { + @Test + public void passes() {} +} + diff --git a/java/gazelle/testdata/annotation_to_wrapper/src/test/java/com/example/tests/SimpleTest.java b/java/gazelle/testdata/annotation_to_wrapper/src/test/java/com/example/tests/SimpleTest.java new file mode 100644 index 00000000..0dc9a4da --- /dev/null +++ b/java/gazelle/testdata/annotation_to_wrapper/src/test/java/com/example/tests/SimpleTest.java @@ -0,0 +1,8 @@ +package com.example.tests; + +import org.junit.jupiter.api.Test; + +public class SimpleTest { + @Test + public void passes() {} +}