testing.bzl 2.1 KB

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