blob: e99bc35f2b895a8e106dcbad3d52a560ed4d9674 [file] [log] [blame]
""" Unit tests for functions defined in utils.bzl. """
load("@bazel_skylib//lib:unittest.bzl", "asserts", "unittest")
# buildifier: disable=bzl-visibility
load("//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")
def _encode_label_as_crate_name_test_impl(ctx):
env = unittest.begin(ctx)
# Typical cases.
asserts.equals(
env,
"x_s_y_c_z",
encode_label_as_crate_name("x/y", "z"),
)
asserts.equals(
env,
"some_s_package_c_target",
encode_label_as_crate_name("some/package", "target"),
)
# Target name includes a character illegal in crate names.
asserts.equals(
env,
"some_s_package_c_foo_s_target",
encode_label_as_crate_name("some/package", "foo/target"),
)
# Package/target includes some of the encodings.
asserts.equals(
env,
"some_zs__s_package_c_target_zdot_foo",
encode_label_as_crate_name("some_s_/package", "target_dot_foo"),
)
# Some pathological cases: test that round-tripping the encoding works as
# expected.
# Label includes a quoted encoding.
package = "_zdot_"
target = "target"
asserts.equals(env, "_zz_dot__c_target", encode_label_as_crate_name(package, target))
asserts.equals(env, package + ":" + target, decode_crate_name_as_label_for_testing(encode_label_as_crate_name(package, target)))
package = "x_s_y"
target = "z"
asserts.equals(env, "x_zs_y_c_z", encode_label_as_crate_name(package, target))
asserts.equals(env, package + ":" + target, decode_crate_name_as_label_for_testing(encode_label_as_crate_name(package, target)))
# Package is identical to a valid encoding already.
package = "_zz_dot__c_target"
target = "target"
asserts.equals(env, "_zz_z_zdot__zc_target_c_target", encode_label_as_crate_name(package, target))
asserts.equals(env, package + ":" + target, decode_crate_name_as_label_for_testing(encode_label_as_crate_name(package, target)))
return unittest.end(env)
def _substitutions_concatenate_test_impl(ctx):
env = unittest.begin(ctx)
# Every combination of orig + orig, orig + encoded, encoded + orig, and
# encoded + encoded round trips the encoding successfully.
all_symbols = [s for pair in substitutions_for_testing for s in pair]
for s in all_symbols:
for t in all_symbols:
concatenated = s + t
asserts.equals(env, decode_crate_name_as_label_for_testing(encode_raw_string_for_testing(concatenated)), concatenated)
return unittest.end(env)
def _encode_raw_string_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(env, encode_raw_string_for_testing("some_project:utils"), "some_project_c_utils")
asserts.equals(env, encode_raw_string_for_testing("_zdot_"), "_zz_dot_")
# No surprises in the application of the substitutions, everything is
# encoded as expected.
for (orig, encoded) in substitutions_for_testing:
asserts.equals(env, encode_raw_string_for_testing(orig), encoded)
return unittest.end(env)
#
def _decode_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(env, decode_crate_name_as_label_for_testing("some_project_c_utils"), "some_project:utils")
asserts.equals(env, decode_crate_name_as_label_for_testing("_zz_dot_"), "_zdot_")
# No surprises in the application of the substitutions, everything is
# decoded as expected.
for (orig, encoded) in substitutions_for_testing:
asserts.equals(env, decode_crate_name_as_label_for_testing(encoded), orig)
return unittest.end(env)
def _is_third_party_crate_test_impl(ctx):
env = unittest.begin(ctx)
# A target at the root of the third-party dir is considered third-party:
asserts.false(env, should_encode_label_in_crate_name("some_workspace", Label("//third_party:foo"), "//third_party"))
# Targets in subpackages are detected properly:
asserts.false(env, should_encode_label_in_crate_name("some_workspace", Label("//third_party/serde:serde"), "//third_party"))
asserts.false(env, should_encode_label_in_crate_name("some_workspace", Label("//third_party/serde/v1:serde"), "//third_party"))
# Ensure the directory name truly matches, and doesn't just include the
# third-party dir as a substring (or vice versa).
asserts.true(env, should_encode_label_in_crate_name("some_workspace", Label("//third_party_decoy:thing"), "//third_party"))
asserts.true(env, should_encode_label_in_crate_name("some_workspace", Label("//decoy_third_party:thing"), "//third_party"))
asserts.true(env, should_encode_label_in_crate_name("some_workspace", Label("//third_:thing"), "//third_party"))
asserts.true(env, should_encode_label_in_crate_name("some_workspace", Label("//third_party_decoy/serde:serde"), "//third_party"))
# Targets in rules_rust's repo should never be renamed.
asserts.false(env, should_encode_label_in_crate_name("rules_rust", Label("//some_package:foo"), "//third_party"))
return unittest.end(env)
encode_label_as_crate_name_test = unittest.make(_encode_label_as_crate_name_test_impl)
is_third_party_crate_test = unittest.make(_is_third_party_crate_test_impl)
substitutions_concatenate_test = unittest.make(_substitutions_concatenate_test_impl)
encode_raw_string_test = unittest.make(_encode_raw_string_test_impl)
decode_test = unittest.make(_decode_test_impl)
def utils_test_suite(name):
unittest.suite(
name,
encode_label_as_crate_name_test,
is_third_party_crate_test,
substitutions_concatenate_test,
encode_raw_string_test,
decode_test,
)