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