xref: /aosp_15_r20/external/protobuf/java/internal/testing.bzl (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
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