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