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