Skip to content

Commit 247fce9

Browse files
long-stripejohnynek
authored andcommitted
move scala_junit_test rule to its own file (#822)
1 parent b4dad94 commit 247fce9

File tree

3 files changed

+208
-190
lines changed

3 files changed

+208
-190
lines changed

scala/private/rule_impls.bzl

Lines changed: 0 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -1014,120 +1014,6 @@ def _pack_source_jars(ctx):
10141014
#_pack_source_jar may return None if java_common.pack_sources returned None (and it can)
10151015
return [source_jar] if source_jar else []
10161016

1017-
def _gen_test_suite_flags_based_on_prefixes_and_suffixes(ctx, archives):
1018-
return struct(
1019-
archiveFlag = "-Dbazel.discover.classes.archives.file.paths=%s" %
1020-
archives,
1021-
prefixesFlag = "-Dbazel.discover.classes.prefixes=%s" % ",".join(
1022-
ctx.attr.prefixes,
1023-
),
1024-
printFlag = "-Dbazel.discover.classes.print.discovered=%s" %
1025-
ctx.attr.print_discovered_classes,
1026-
suffixesFlag = "-Dbazel.discover.classes.suffixes=%s" % ",".join(
1027-
ctx.attr.suffixes,
1028-
),
1029-
testSuiteFlag = "-Dbazel.test_suite=%s" % ctx.attr.suite_class,
1030-
)
1031-
1032-
def _serialize_archives_short_path(archives):
1033-
archives_short_path = ""
1034-
for archive in archives:
1035-
archives_short_path += archive.short_path + ","
1036-
return archives_short_path[:-1] #remove redundant comma
1037-
1038-
def _get_test_archive_jars(ctx, test_archives):
1039-
flattened_list = []
1040-
for archive in test_archives:
1041-
class_jars = [java_output.class_jar for java_output in archive[JavaInfo].outputs.jars]
1042-
flattened_list.extend(class_jars)
1043-
return flattened_list
1044-
1045-
def scala_junit_test_impl(ctx):
1046-
if (not (ctx.attr.prefixes) and not (ctx.attr.suffixes)):
1047-
fail(
1048-
"Setting at least one of the attributes ('prefixes','suffixes') is required",
1049-
)
1050-
scalac_provider = get_scalac_provider(ctx)
1051-
1052-
unused_dependency_checker_mode = get_unused_dependency_checker_mode(ctx)
1053-
unused_dependency_checker_ignored_targets = [
1054-
target.label
1055-
for target in scalac_provider.default_classpath +
1056-
ctx.attr.unused_dependency_checker_ignored_targets
1057-
] + [
1058-
ctx.attr._junit.label,
1059-
ctx.attr._hamcrest.label,
1060-
ctx.attr.suite_label.label,
1061-
ctx.attr._bazel_test_runner.label,
1062-
]
1063-
unused_dependency_checker_is_off = unused_dependency_checker_mode == "off"
1064-
1065-
jars = collect_jars_from_common_ctx(
1066-
ctx,
1067-
scalac_provider.default_classpath,
1068-
extra_deps = [
1069-
ctx.attr._junit,
1070-
ctx.attr._hamcrest,
1071-
ctx.attr.suite_label,
1072-
ctx.attr._bazel_test_runner,
1073-
],
1074-
unused_dependency_checker_is_off = unused_dependency_checker_is_off,
1075-
)
1076-
(cjars, transitive_rjars) = (jars.compile_jars, jars.transitive_runtime_jars)
1077-
implicit_junit_deps_needed_for_java_compilation = [
1078-
ctx.attr._junit,
1079-
ctx.attr._hamcrest,
1080-
]
1081-
1082-
executable = declare_executable(ctx)
1083-
1084-
wrapper = write_java_wrapper(ctx, "", "")
1085-
out = scala_binary_common(
1086-
ctx,
1087-
executable,
1088-
cjars,
1089-
transitive_rjars,
1090-
jars.transitive_compile_jars,
1091-
jars.jars2labels,
1092-
wrapper,
1093-
implicit_junit_deps_needed_for_java_compilation =
1094-
implicit_junit_deps_needed_for_java_compilation,
1095-
unused_dependency_checker_ignored_targets =
1096-
unused_dependency_checker_ignored_targets,
1097-
unused_dependency_checker_mode = unused_dependency_checker_mode,
1098-
deps_providers = jars.deps_providers,
1099-
)
1100-
1101-
if ctx.attr.tests_from:
1102-
archives = _get_test_archive_jars(ctx, ctx.attr.tests_from)
1103-
else:
1104-
archives = [archive.class_jar for archive in out.scala.outputs.jars]
1105-
1106-
serialized_archives = _serialize_archives_short_path(archives)
1107-
test_suite = _gen_test_suite_flags_based_on_prefixes_and_suffixes(
1108-
ctx,
1109-
serialized_archives,
1110-
)
1111-
launcherJvmFlags = [
1112-
"-ea",
1113-
test_suite.archiveFlag,
1114-
test_suite.prefixesFlag,
1115-
test_suite.suffixesFlag,
1116-
test_suite.printFlag,
1117-
test_suite.testSuiteFlag,
1118-
]
1119-
write_executable(
1120-
ctx = ctx,
1121-
executable = executable,
1122-
jvm_flags = launcherJvmFlags + ctx.attr.jvm_flags,
1123-
main_class = "com.google.testing.junit.runner.BazelTestRunner",
1124-
rjars = out.transitive_rjars,
1125-
use_jacoco = False,
1126-
wrapper = wrapper,
1127-
)
1128-
1129-
return out
1130-
11311017
def _jacoco_offline_instrument(ctx, input_jar):
11321018
if not ctx.configuration.coverage_enabled or not hasattr(ctx.attr, "_code_coverage_instrumentation_worker"):
11331019
return _empty_coverage_struct
Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
"""Rules for writing tests with JUnit"""
2+
3+
load(
4+
"@io_bazel_rules_scala//scala/private:common_attributes.bzl",
5+
"common_attrs",
6+
"implicit_deps",
7+
"launcher_template",
8+
)
9+
load("@io_bazel_rules_scala//scala/private:common_outputs.bzl", "common_outputs")
10+
load(
11+
"@io_bazel_rules_scala//scala/private:rule_impls.bzl",
12+
"collect_jars_from_common_ctx",
13+
"declare_executable",
14+
"get_scalac_provider",
15+
"get_unused_dependency_checker_mode",
16+
"scala_binary_common",
17+
"write_executable",
18+
"write_java_wrapper",
19+
)
20+
21+
def _gen_test_suite_flags_based_on_prefixes_and_suffixes(ctx, archives):
22+
return struct(
23+
archiveFlag = "-Dbazel.discover.classes.archives.file.paths=%s" %
24+
archives,
25+
prefixesFlag = "-Dbazel.discover.classes.prefixes=%s" % ",".join(
26+
ctx.attr.prefixes,
27+
),
28+
printFlag = "-Dbazel.discover.classes.print.discovered=%s" %
29+
ctx.attr.print_discovered_classes,
30+
suffixesFlag = "-Dbazel.discover.classes.suffixes=%s" % ",".join(
31+
ctx.attr.suffixes,
32+
),
33+
testSuiteFlag = "-Dbazel.test_suite=%s" % ctx.attr.suite_class,
34+
)
35+
36+
def _serialize_archives_short_path(archives):
37+
archives_short_path = ""
38+
for archive in archives:
39+
archives_short_path += archive.short_path + ","
40+
return archives_short_path[:-1] #remove redundant comma
41+
42+
def _get_test_archive_jars(ctx, test_archives):
43+
flattened_list = []
44+
for archive in test_archives:
45+
class_jars = [java_output.class_jar for java_output in archive[JavaInfo].outputs.jars]
46+
flattened_list.extend(class_jars)
47+
return flattened_list
48+
49+
def _scala_junit_test_impl(ctx):
50+
if (not (ctx.attr.prefixes) and not (ctx.attr.suffixes)):
51+
fail(
52+
"Setting at least one of the attributes ('prefixes','suffixes') is required",
53+
)
54+
scalac_provider = get_scalac_provider(ctx)
55+
56+
unused_dependency_checker_mode = get_unused_dependency_checker_mode(ctx)
57+
unused_dependency_checker_ignored_targets = [
58+
target.label
59+
for target in scalac_provider.default_classpath +
60+
ctx.attr.unused_dependency_checker_ignored_targets
61+
] + [
62+
ctx.attr._junit.label,
63+
ctx.attr._hamcrest.label,
64+
ctx.attr.suite_label.label,
65+
ctx.attr._bazel_test_runner.label,
66+
]
67+
unused_dependency_checker_is_off = unused_dependency_checker_mode == "off"
68+
69+
jars = collect_jars_from_common_ctx(
70+
ctx,
71+
scalac_provider.default_classpath,
72+
extra_deps = [
73+
ctx.attr._junit,
74+
ctx.attr._hamcrest,
75+
ctx.attr.suite_label,
76+
ctx.attr._bazel_test_runner,
77+
],
78+
unused_dependency_checker_is_off = unused_dependency_checker_is_off,
79+
)
80+
(cjars, transitive_rjars) = (jars.compile_jars, jars.transitive_runtime_jars)
81+
implicit_junit_deps_needed_for_java_compilation = [
82+
ctx.attr._junit,
83+
ctx.attr._hamcrest,
84+
]
85+
86+
executable = declare_executable(ctx)
87+
88+
wrapper = write_java_wrapper(ctx, "", "")
89+
out = scala_binary_common(
90+
ctx,
91+
executable,
92+
cjars,
93+
transitive_rjars,
94+
jars.transitive_compile_jars,
95+
jars.jars2labels,
96+
wrapper,
97+
implicit_junit_deps_needed_for_java_compilation =
98+
implicit_junit_deps_needed_for_java_compilation,
99+
unused_dependency_checker_ignored_targets =
100+
unused_dependency_checker_ignored_targets,
101+
unused_dependency_checker_mode = unused_dependency_checker_mode,
102+
deps_providers = jars.deps_providers,
103+
)
104+
105+
if ctx.attr.tests_from:
106+
archives = _get_test_archive_jars(ctx, ctx.attr.tests_from)
107+
else:
108+
archives = [archive.class_jar for archive in out.scala.outputs.jars]
109+
110+
serialized_archives = _serialize_archives_short_path(archives)
111+
test_suite = _gen_test_suite_flags_based_on_prefixes_and_suffixes(
112+
ctx,
113+
serialized_archives,
114+
)
115+
launcherJvmFlags = [
116+
"-ea",
117+
test_suite.archiveFlag,
118+
test_suite.prefixesFlag,
119+
test_suite.suffixesFlag,
120+
test_suite.printFlag,
121+
test_suite.testSuiteFlag,
122+
]
123+
write_executable(
124+
ctx = ctx,
125+
executable = executable,
126+
jvm_flags = launcherJvmFlags + ctx.attr.jvm_flags,
127+
main_class = "com.google.testing.junit.runner.BazelTestRunner",
128+
rjars = out.transitive_rjars,
129+
use_jacoco = False,
130+
wrapper = wrapper,
131+
)
132+
133+
return out
134+
135+
_scala_junit_test_attrs = {
136+
"prefixes": attr.string_list(default = []),
137+
"suffixes": attr.string_list(default = []),
138+
"suite_label": attr.label(
139+
default = Label(
140+
"//src/java/io/bazel/rulesscala/test_discovery:test_discovery",
141+
),
142+
),
143+
"suite_class": attr.string(
144+
default = "io.bazel.rulesscala.test_discovery.DiscoveredTestSuite",
145+
),
146+
"print_discovered_classes": attr.bool(
147+
default = False,
148+
mandatory = False,
149+
),
150+
"_junit": attr.label(
151+
default = Label(
152+
"//external:io_bazel_rules_scala/dependency/junit/junit",
153+
),
154+
),
155+
"_hamcrest": attr.label(
156+
default = Label(
157+
"//external:io_bazel_rules_scala/dependency/hamcrest/hamcrest_core",
158+
),
159+
),
160+
"_bazel_test_runner": attr.label(
161+
default = Label(
162+
"@io_bazel_rules_scala//scala:bazel_test_runner_deploy",
163+
),
164+
allow_files = True,
165+
),
166+
}
167+
168+
_junit_resolve_deps = {
169+
"_scala_toolchain": attr.label_list(
170+
default = [
171+
Label(
172+
"//external:io_bazel_rules_scala/dependency/scala/scala_library",
173+
),
174+
Label("//external:io_bazel_rules_scala/dependency/junit/junit"),
175+
Label(
176+
"//external:io_bazel_rules_scala/dependency/hamcrest/hamcrest_core",
177+
),
178+
],
179+
allow_files = False,
180+
),
181+
}
182+
183+
_scala_junit_test_attrs.update(launcher_template)
184+
185+
_scala_junit_test_attrs.update(implicit_deps)
186+
187+
_scala_junit_test_attrs.update(common_attrs)
188+
189+
_scala_junit_test_attrs.update(_junit_resolve_deps)
190+
191+
_scala_junit_test_attrs.update({
192+
"tests_from": attr.label_list(providers = [[JavaInfo]]),
193+
})
194+
195+
scala_junit_test = rule(
196+
attrs = _scala_junit_test_attrs,
197+
fragments = ["java"],
198+
outputs = common_outputs,
199+
test = True,
200+
toolchains = ["@io_bazel_rules_scala//scala:toolchain_type"],
201+
implementation = _scala_junit_test_impl,
202+
)

0 commit comments

Comments
 (0)