xref: /aosp_15_r20/external/bazelbuild-rules_rust/test/unit/utils/utils_test.bzl (revision d4726bddaa87cc4778e7472feed243fa4b6c267f)
1""" Unit tests for functions defined in utils.bzl. """
2
3load("@bazel_skylib//lib:unittest.bzl", "asserts", "unittest")
4
5# buildifier: disable=bzl-visibility
6load("//rust/private:utils.bzl", "decode_crate_name_as_label_for_testing", "encode_label_as_crate_name", "encode_raw_string_for_testing", "should_encode_label_in_crate_name", "substitutions_for_testing")
7
8def _encode_label_as_crate_name_test_impl(ctx):
9    env = unittest.begin(ctx)
10
11    # Typical cases.
12    asserts.equals(
13        env,
14        "x_y_y_x_z",
15        encode_label_as_crate_name("x/y", "z"),
16    )
17    asserts.equals(
18        env,
19        "some_y_package_x_target",
20        encode_label_as_crate_name("some/package", "target"),
21    )
22
23    # Target name includes a character illegal in crate names.
24    asserts.equals(
25        env,
26        "some_y_package_x_foo_y_target",
27        encode_label_as_crate_name("some/package", "foo/target"),
28    )
29
30    # Package/target includes some of the encodings.
31    asserts.equals(
32        env,
33        "some_zy__y_package_x_target_zpd_foo",
34        encode_label_as_crate_name("some_y_/package", "target_pd_foo"),
35    )
36
37    # Some pathological cases: test that round-tripping the encoding works as
38    # expected.
39
40    # Label includes a quoted encoding.
41    package = "_zpd_"
42    target = "target"
43    asserts.equals(env, "_zz_pd__x_target", encode_label_as_crate_name(package, target))
44    asserts.equals(env, package + ":" + target, decode_crate_name_as_label_for_testing(encode_label_as_crate_name(package, target)))
45
46    package = "x_y_y"
47    target = "z"
48    asserts.equals(env, "x_zy_y_x_z", encode_label_as_crate_name(package, target))
49    asserts.equals(env, package + ":" + target, decode_crate_name_as_label_for_testing(encode_label_as_crate_name(package, target)))
50
51    # Package is identical to a valid encoding already.
52    package = "_zz_pd__x_target"
53    target = "target"
54    asserts.equals(env, "_zz_z_zpd__zx_target_x_target", encode_label_as_crate_name(package, target))
55    asserts.equals(env, package + ":" + target, decode_crate_name_as_label_for_testing(encode_label_as_crate_name(package, target)))
56    return unittest.end(env)
57
58def _substitutions_concatenate_test_impl(ctx):
59    env = unittest.begin(ctx)
60
61    # Every combination of orig + orig, orig + encoded, encoded + orig, and
62    # encoded + encoded round trips the encoding successfully.
63    all_symbols = [s for pair in substitutions_for_testing for s in pair]
64    for s in all_symbols:
65        for t in all_symbols:
66            concatenated = s + t
67            asserts.equals(env, decode_crate_name_as_label_for_testing(encode_raw_string_for_testing(concatenated)), concatenated)
68
69    return unittest.end(env)
70
71def _encode_raw_string_test_impl(ctx):
72    env = unittest.begin(ctx)
73    asserts.equals(env, encode_raw_string_for_testing("some_project:utils"), "some_project_x_utils")
74    asserts.equals(env, encode_raw_string_for_testing("_zpd_"), "_zz_pd_")
75
76    # No surprises in the application of the substitutions, everything is
77    # encoded as expected.
78    for (orig, encoded) in substitutions_for_testing:
79        asserts.equals(env, encode_raw_string_for_testing(orig), encoded)
80
81    return unittest.end(env)
82
83#
84def _decode_test_impl(ctx):
85    env = unittest.begin(ctx)
86    asserts.equals(env, decode_crate_name_as_label_for_testing("some_project_x_utils"), "some_project:utils")
87    asserts.equals(env, decode_crate_name_as_label_for_testing("_zz_pd_"), "_zpd_")
88
89    # No surprises in the application of the substitutions, everything is
90    # decoded as expected.
91    for (orig, encoded) in substitutions_for_testing:
92        asserts.equals(env, decode_crate_name_as_label_for_testing(encoded), orig)
93
94    return unittest.end(env)
95
96def _is_third_party_crate_test_impl(ctx):
97    env = unittest.begin(ctx)
98
99    # A target at the root of the third-party dir is considered third-party:
100    asserts.false(env, should_encode_label_in_crate_name("some_workspace", Label("//third_party:foo"), "//third_party"))
101
102    # Targets in subpackages are detected properly:
103    asserts.false(env, should_encode_label_in_crate_name("some_workspace", Label("//third_party/serde:serde"), "//third_party"))
104    asserts.false(env, should_encode_label_in_crate_name("some_workspace", Label("//third_party/serde/v1:serde"), "//third_party"))
105
106    # Ensure the directory name truly matches, and doesn't just include the
107    # third-party dir as a substring (or vice versa).
108    asserts.true(env, should_encode_label_in_crate_name("some_workspace", Label("//third_party_decoy:thing"), "//third_party"))
109    asserts.true(env, should_encode_label_in_crate_name("some_workspace", Label("//decoy_third_party:thing"), "//third_party"))
110    asserts.true(env, should_encode_label_in_crate_name("some_workspace", Label("//third_:thing"), "//third_party"))
111    asserts.true(env, should_encode_label_in_crate_name("some_workspace", Label("//third_party_decoy/serde:serde"), "//third_party"))
112
113    # Targets in rules_rust's repo should never be renamed.
114    asserts.false(env, should_encode_label_in_crate_name("rules_rust", Label("//some_package:foo"), "//third_party"))
115
116    return unittest.end(env)
117
118encode_label_as_crate_name_test = unittest.make(_encode_label_as_crate_name_test_impl)
119is_third_party_crate_test = unittest.make(_is_third_party_crate_test_impl)
120substitutions_concatenate_test = unittest.make(_substitutions_concatenate_test_impl)
121encode_raw_string_test = unittest.make(_encode_raw_string_test_impl)
122decode_test = unittest.make(_decode_test_impl)
123
124def utils_test_suite(name):
125    unittest.suite(
126        name,
127        encode_label_as_crate_name_test,
128        is_third_party_crate_test,
129        substitutions_concatenate_test,
130        encode_raw_string_test,
131        decode_test,
132    )
133