• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1"""
2Generates a side-car JUnit suite test runner class for each
3input src.
4"""
5
6load("@rules_java//java:defs.bzl", "java_library", "java_test")
7
8_template = """import org.junit.runners.Suite;
9import org.junit.runner.RunWith;
10
11@RunWith(Suite.class)
12@Suite.SuiteClasses({%s})
13public class %s {}
14"""
15
16def _as_classname(fname, pkg):
17    path_name = [x.path for x in fname.files.to_list()][0]
18    file_name = path_name.split("/")[-1]
19    return ".".join([pkg, file_name.split(".")[0]]) + ".class"
20
21def _gen_suite_impl(ctx):
22    classes = ",".join(
23        [_as_classname(x, ctx.attr.package_name) for x in ctx.attr.srcs],
24    )
25    ctx.actions.write(output = ctx.outputs.out, content = _template % (
26        classes,
27        ctx.attr.outname,
28    ))
29
30_gen_suite = rule(
31    attrs = {
32        "srcs": attr.label_list(allow_files = True),
33        "package_name": attr.string(),
34        "outname": attr.string(),
35    },
36    outputs = {"out": "%{name}.java"},
37    implementation = _gen_suite_impl,
38)
39
40def junit_tests(name, srcs, data = [], deps = [], package_name = "com.google.protobuf", test_prefix = None, **kwargs):
41    testlib_name = "%s_lib" % name
42    java_library(
43        name = testlib_name,
44        srcs = srcs,
45        deps = deps,
46        resources = data,
47        data = data,
48        testonly = True,
49    )
50    test_names = []
51    prefix = name.replace("-", "_") + "TestSuite"
52    for src in srcs:
53        test_name = src.rsplit("/", 1)[1].split(".")[0]
54        if not test_name.endswith("Test") or test_name.startswith("Abstract"):
55            continue
56        if test_prefix:
57            test_name = "%s%s" % (test_prefix, test_name)
58        test_names = test_names + [test_name]
59        suite_name = prefix + "_" + test_name
60        _gen_suite(
61            name = suite_name,
62            srcs = [src],
63            package_name = package_name,
64            outname = suite_name,
65        )
66        java_test(
67            name = test_name,
68            test_class = suite_name,
69            srcs = [src] + [":" + suite_name],
70            deps = deps + [":%s" % testlib_name],
71            **kwargs
72        )
73    native.test_suite(
74        name = name,
75        tests = test_names,
76    )
77