blob: dd7bbe5fccab572f214e4f86cad9cb50c59cd84e [file]
""" 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", "should_encode_label_in_crate_name")
def _encode_label_as_crate_name_test_impl(ctx):
env = unittest.begin(ctx)
# Typical cases.
asserts.equals(
env,
"x_slash_y_colon_z",
encode_label_as_crate_name("x/y", "z"),
)
asserts.equals(
env,
"some_slash_package_colon_target",
encode_label_as_crate_name("some/package", "target"),
)
# Target name includes a character illegal in crate names.
asserts.equals(
env,
"some_slash_package_colon_foo_slash_target",
encode_label_as_crate_name("some/package", "foo/target"),
)
# Package/target includes some of the encodings.
asserts.equals(
env,
"some_quoteslash__slash_package_colon_target_quotedot_foo",
encode_label_as_crate_name("some_slash_/package", "target_dot_foo"),
)
# Some pathological cases: test that round-tripping the encoding works as
# expected.
# Label includes a quoted encoding.
package = "_quotedot_"
target = "target"
asserts.equals(env, "_quotequote_dot__colon_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_slash_y"
target = "z"
asserts.equals(env, "x_quoteslash_y_colon_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 = "_quotequote_dot__colon_target"
target = "target"
asserts.equals(env, "_quotequote_quote_quotedot__quotecolon_target_colon_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 _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)
def utils_test_suite(name):
unittest.suite(
name,
encode_label_as_crate_name_test,
is_third_party_crate_test,
)