| """ | |
| 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, | |
| ) |