|  | """ | 
|  | Generates a side-car JUnit suite test runner class for each | 
|  | input src. | 
|  | """ | 
|  | _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 | 
|  | native.java_library( | 
|  | name = testlib_name, | 
|  | srcs = srcs, | 
|  | deps = deps, | 
|  | resources = data, | 
|  | data = data, | 
|  | ) | 
|  | 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, | 
|  | ) | 
|  | native.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, | 
|  | ) |