| """ |
| Generates a side-car JUnit suite test runner class for each |
| input src. |
| """ |
| |
| load("@rules_java//java:defs.bzl", "java_library", "java_test") |
| |
| _template = """import org.junit.runners.Suite; |
| import org.junit.runner.RunWith; |
| |
| @RunWith(Suite.class) |
| @Suite.SuiteClasses({%s}) |
| public class %s {} |
| """ |
| |
| def _as_classname(fname, pkg): |
| path_name = [x.path for x in fname.files.to_list()][0] |
| file_name = path_name.split("/")[-1] |
| return ".".join([pkg, file_name.split(".")[0]]) + ".class" |
| |
| def _gen_suite_impl(ctx): |
| classes = ",".join( |
| [_as_classname(x, ctx.attr.package_name) for x in ctx.attr.srcs], |
| ) |
| ctx.actions.write(output = ctx.outputs.out, content = _template % ( |
| classes, |
| ctx.attr.outname, |
| )) |
| |
| _gen_suite = rule( |
| attrs = { |
| "srcs": attr.label_list(allow_files = True), |
| "package_name": attr.string(), |
| "outname": attr.string(), |
| }, |
| outputs = {"out": "%{name}.java"}, |
| implementation = _gen_suite_impl, |
| ) |
| |
| def junit_tests(name, srcs, data = [], deps = [], package_name = "com.google.protobuf", test_prefix = None, **kwargs): |
| testlib_name = "%s_lib" % name |
| java_library( |
| name = testlib_name, |
| srcs = srcs, |
| deps = deps, |
| resources = data, |
| data = data, |
| testonly = True, |
| ) |
| test_names = [] |
| prefix = name.replace("-", "_") + "TestSuite" |
| for src in srcs: |
| test_name = src.rsplit("/", 1)[1].split(".")[0] |
| if not test_name.endswith("Test") or test_name.startswith("Abstract"): |
| continue |
| if test_prefix: |
| test_name = "%s%s" % (test_prefix, test_name) |
| test_names = test_names + [test_name] |
| suite_name = prefix + "_" + test_name |
| _gen_suite( |
| name = suite_name, |
| srcs = [src], |
| package_name = package_name, |
| outname = suite_name, |
| ) |
| java_test( |
| name = test_name, |
| test_class = suite_name, |
| srcs = [src] + [":" + suite_name], |
| deps = deps + [":%s" % testlib_name], |
| **kwargs |
| ) |
| native.test_suite( |
| name = name, |
| tests = test_names, |
| ) |