Skip to content

Commit 450aab7

Browse files
committed
Add example analysis_test with configuration
1 parent 054d6a7 commit 450aab7

File tree

4 files changed

+175
-0
lines changed

4 files changed

+175
-0
lines changed

src/test/starlark/rules/BUILD.bazel

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
load(":experimental_prune_transitive_deps_tests.bzl", "experimental_prune_transitive_deps_tests")
2+
3+
experimental_prune_transitive_deps_tests(
4+
name = "experimental_prune_transitive_deps_tests",
5+
)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
load("//kotlin:jvm.bzl", "kt_jvm_import", "kt_jvm_library")
2+
3+
def arrange(test):
4+
dependency_a_trans_dep_jar = test.artifact(
5+
name = "dependency_a_trans_dep.abi.jar",
6+
)
7+
8+
dependency_a = test.have(
9+
kt_jvm_library,
10+
name = "dependency_a",
11+
srcs = [
12+
test.artifact(
13+
name = "dependency_a.kt",
14+
),
15+
],
16+
deps = [
17+
test.have(
18+
kt_jvm_import,
19+
name = "dependency_a_dep_jar_import",
20+
jars = [
21+
dependency_a_trans_dep_jar,
22+
],
23+
),
24+
],
25+
)
26+
27+
main_target_library = test.got(
28+
kt_jvm_library,
29+
name = "main_target_library",
30+
srcs = [
31+
test.artifact(
32+
name = "main_target_library.kt",
33+
),
34+
],
35+
deps = [
36+
dependency_a,
37+
],
38+
)
39+
40+
return (dependency_a_trans_dep_jar, dependency_a, main_target_library)
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
load("@rules_testing//lib:analysis_test.bzl", "analysis_test")
2+
load("//src/test/starlark:case.bzl", "suite")
3+
load(":arrangement.bzl", "arrange")
4+
load(":util.bzl", "abi_jar_of", "values_for_flag_of")
5+
6+
def _classpath_assertions_(env, target):
7+
action = env.expect.that_target(target).action_named(env.ctx.attr.on_action_mnemonic)
8+
action.inputs().contains_at_least([abi_jar_of(f.short_path) for f in env.ctx.files.want_inputs if not f.short_path.endswith("jdeps")])
9+
10+
values_for_flag_of(action, "--classpath").contains_at_least([abi_jar_of(f.path) for f in env.ctx.files.want_classpath if not f.short_path.endswith("jdeps")])
11+
values_for_flag_of(action, "--classpath").contains_none_of([f.path for f in env.ctx.files.not_want_classpath])
12+
13+
def _test_classpath_experimental_prune_transitive_deps_False(test):
14+
(dependency_a_trans_dep_jar, dependency_a, main_target_library) = arrange(test)
15+
16+
analysis_test(
17+
name = test.name,
18+
impl = _classpath_assertions_,
19+
target = main_target_library,
20+
config_settings = {
21+
str(Label("@rules_kotlin//kotlin/settings:experimental_prune_transitive_deps")): False,
22+
str(Label("@rules_kotlin//kotlin/settings:experimental_strict_associate_dependencies")): False,
23+
},
24+
attr_values = {
25+
"on_action_mnemonic": "KotlinCompile",
26+
"want_inputs": [
27+
dependency_a,
28+
dependency_a_trans_dep_jar,
29+
],
30+
"want_direct_dependencies": [
31+
dependency_a,
32+
dependency_a_trans_dep_jar,
33+
],
34+
"want_classpath": [
35+
dependency_a,
36+
dependency_a_trans_dep_jar,
37+
],
38+
"not_want_classpath": [],
39+
},
40+
attrs = {
41+
"on_action_mnemonic": attr.string(),
42+
"want_inputs": attr.label_list(providers = [DefaultInfo], allow_files = True),
43+
"want_direct_dependencies": attr.label_list(providers = [DefaultInfo], allow_files = True),
44+
"want_classpath": attr.label_list(providers = [DefaultInfo], allow_files = True),
45+
"not_want_classpath": attr.label_list(providers = [DefaultInfo], allow_files = True),
46+
},
47+
)
48+
49+
def _test_classpath_experimental_prune_transitive_deps_True(test):
50+
(dependency_a_trans_dep_jar, dependency_a, main_target_library) = arrange(test)
51+
52+
analysis_test(
53+
name = test.name,
54+
impl = _classpath_assertions_,
55+
target = main_target_library,
56+
config_settings = {
57+
str(Label("@rules_kotlin//kotlin/settings:experimental_prune_transitive_deps")): True,
58+
str(Label("@rules_kotlin//kotlin/settings:experimental_strict_associate_dependencies")): False,
59+
},
60+
attr_values = {
61+
"on_action_mnemonic": "KotlinCompile",
62+
"want_inputs": [
63+
dependency_a,
64+
],
65+
"want_direct_dependencies": [
66+
dependency_a,
67+
],
68+
"want_classpath": [
69+
dependency_a,
70+
],
71+
"not_want_classpath": [
72+
dependency_a_trans_dep_jar,
73+
],
74+
},
75+
attrs = {
76+
"on_action_mnemonic": attr.string(),
77+
"want_inputs": attr.label_list(providers = [DefaultInfo], allow_files = True),
78+
"want_direct_dependencies": attr.label_list(providers = [DefaultInfo], allow_files = True),
79+
"want_classpath": attr.label_list(providers = [DefaultInfo], allow_files = True),
80+
"not_want_classpath": attr.label_list(providers = [DefaultInfo], allow_files = True),
81+
},
82+
)
83+
84+
def experimental_prune_transitive_deps_tests(name):
85+
suite(
86+
name,
87+
enabled = _test_classpath_experimental_prune_transitive_deps_True,
88+
disabled = _test_classpath_experimental_prune_transitive_deps_False,
89+
)

src/test/starlark/rules/util.bzl

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
def values_for_flag_of(action_subject, flag):
2+
return action_subject.argv().transform(desc = "parsed()", loop = _curry_denormalise_flags_with(flag))
3+
4+
def _curry_denormalise_flags_with(flag):
5+
def _denormalise_flags(argv):
6+
parsed_flags = []
7+
8+
# argv might be none for e.g. builtin actions
9+
if argv == None:
10+
return parsed_flags
11+
last_flag = None
12+
for arg in argv:
13+
value = None
14+
if arg == "--":
15+
# skip the rest of the arguments, this is standard end of the flags.
16+
break
17+
if arg.startswith("-"):
18+
if "=" in arg:
19+
last_flag, value = arg.split("=", 1)
20+
else:
21+
last_flag = arg
22+
elif last_flag:
23+
# have a flag, therefore this is probably an associated argument
24+
value = arg
25+
else:
26+
# skip non-flag arguments
27+
continue
28+
29+
# only set the value if it exists
30+
if value:
31+
if last_flag == flag:
32+
parsed_flags.append(value)
33+
return parsed_flags
34+
35+
return _denormalise_flags
36+
37+
def abi_jar_of(jar):
38+
if jar.endswith(".abi.jar"):
39+
return jar
40+
else:
41+
return jar.replace(".jar", ".abi.jar")

0 commit comments

Comments
 (0)