blob: 3cfecc3d8523b32e8d78996390ec690677ec5681 [file] [log] [blame]
load("@bazel_skylib//lib:unittest.bzl", "asserts", "unittest")
load("//private/lib:urls.bzl", "extract_netrc_from_auth_url", "remove_auth_from_url", "split_url")
load(
"//private/rules:coursier.bzl",
"compute_dependency_inputs_signature",
"get_coursier_cache_or_default",
"get_coursier_sha256",
"get_direct_dependencies",
"get_netrc_lines_from_entries",
"strip_credentials_from_cache_path",
infer = "infer_artifact_path_from_primary_and_repos",
)
load("//private/rules:v1_lock_file.bzl", "add_netrc_entries_from_mirror_urls")
ALL_TESTS = []
def add_test(test_impl_func):
test = unittest.make(test_impl_func)
ALL_TESTS.append(test)
return test
def _infer_doc_example_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
"group/path/to/artifact/file.jar",
infer("http://a:b@c/group/path/to/artifact/file.jar", ["http://c"]),
)
return unittest.end(env)
infer_doc_example_test = add_test(_infer_doc_example_test_impl)
def _infer_basic_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
"group/artifact/version/foo.jar",
infer("https://base/group/artifact/version/foo.jar", ["https://base"]),
)
asserts.equals(
env,
"group/artifact/version/foo.jar",
infer("http://base/group/artifact/version/foo.jar", ["http://base"]),
)
return unittest.end(env)
infer_basic_test = add_test(_infer_basic_test_impl)
def _infer_auth_basic_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
"group1/artifact/version/foo.jar",
infer("https://a@c/group1/artifact/version/foo.jar", ["https://a:b@c"]),
)
asserts.equals(
env,
"group2/artifact/version/foo.jar",
infer("https://a@c/group2/artifact/version/foo.jar", ["https://a@c"]),
)
asserts.equals(
env,
"group3/artifact/version/foo.jar",
infer("https://a@c/group3/artifact/version/foo.jar", ["https://c"]),
)
return unittest.end(env)
infer_auth_basic_test = add_test(_infer_auth_basic_test_impl)
def _infer_leading_repo_miss_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
"group/artifact/version/foo.jar",
infer("https://a@c/group/artifact/version/foo.jar", ["https://a:b@c/missubdir", "https://a:b@c"]),
)
return unittest.end(env)
infer_leading_repo_miss_test = add_test(_infer_leading_repo_miss_test_impl)
def _infer_repo_trailing_slash_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
"group/artifact/version/foo.jar",
infer("https://a@c/group/artifact/version/foo.jar", ["https://a:b@c"]),
)
asserts.equals(
env,
"group/artifact/version/foo.jar",
infer("https://a@c/group/artifact/version/foo.jar", ["https://a:b@c/"]),
)
asserts.equals(
env,
"group/artifact/version/foo.jar",
infer("https://a@c/group/artifact/version/foo.jar", ["https://a:b@c//"]),
)
return unittest.end(env)
infer_repo_trailing_slash_test = add_test(_infer_repo_trailing_slash_test_impl)
def _remove_auth_basic_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
"https://c1",
remove_auth_from_url("https://a:b@c1"),
)
return unittest.end(env)
remove_auth_basic_test = add_test(_remove_auth_basic_test_impl)
def _remove_auth_basic_with_path_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
"https://c1/some/random/path",
remove_auth_from_url("https://a:b@c1/some/random/path"),
)
return unittest.end(env)
remove_auth_basic_with_path_test = add_test(_remove_auth_basic_with_path_test_impl)
def _remove_auth_only_user_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
"https://c1",
remove_auth_from_url("https://a@c1"),
)
return unittest.end(env)
remove_auth_only_user_test = add_test(_remove_auth_only_user_test_impl)
def _remove_auth_noauth_noop_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
"https://c1",
remove_auth_from_url("https://c1"),
)
return unittest.end(env)
remove_auth_noauth_noop_test = add_test(_remove_auth_noauth_noop_test_impl)
def _split_url_basic_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
("https", ["c1"]),
split_url("https://c1"),
)
return unittest.end(env)
split_url_basic_test = add_test(_split_url_basic_test_impl)
def _split_url_basic_auth_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
("https", ["a:b@c1"]),
split_url("https://a:b@c1"),
)
asserts.equals(
env,
("https", ["a@c1"]),
split_url("https://a@c1"),
)
return unittest.end(env)
split_url_basic_auth_test = add_test(_split_url_basic_auth_test_impl)
def _split_url_with_path_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
("https", ["c1", "some", "path"]),
split_url("https://c1/some/path"),
)
return unittest.end(env)
split_url_with_path_test = add_test(_split_url_with_path_test_impl)
def _extract_netrc_from_auth_url_noop_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
{},
extract_netrc_from_auth_url("https://c1"),
)
asserts.equals(
env,
{},
extract_netrc_from_auth_url("https://c2/useless@inurl"),
)
return unittest.end(env)
extract_netrc_from_auth_url_noop_test = add_test(_extract_netrc_from_auth_url_noop_test_impl)
def _extract_netrc_from_auth_url_with_auth_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
{"machine": "c", "login": "a", "password": "b"},
extract_netrc_from_auth_url("https://a:b@c"),
)
asserts.equals(
env,
{"machine": "c", "login": "a", "password": "b"},
extract_netrc_from_auth_url("https://a:b@c/some/other/stuff@thisplace/for/testing"),
)
asserts.equals(
env,
{"machine": "c", "login": "a", "password": None},
extract_netrc_from_auth_url("https://a@c"),
)
asserts.equals(
env,
{"machine": "c", "login": "a", "password": None},
extract_netrc_from_auth_url("https://a@c/some/other/stuff@thisplace/for/testing"),
)
return unittest.end(env)
extract_netrc_from_auth_url_with_auth_test = add_test(_extract_netrc_from_auth_url_with_auth_test_impl)
def _extract_netrc_from_auth_url_at_in_password_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
{"machine": "c", "login": "a", "password": "p@ssword"},
extract_netrc_from_auth_url("https://a:p@ssword@c"),
)
return unittest.end(env)
extract_netrc_from_auth_url_at_in_password_test = add_test(_extract_netrc_from_auth_url_at_in_password_test_impl)
def _add_netrc_entries_from_mirror_urls_noop_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
{},
add_netrc_entries_from_mirror_urls({}, ["https://c1", "https://c1/something@there"]),
)
return unittest.end(env)
add_netrc_entries_from_mirror_urls_noop_test = add_test(_add_netrc_entries_from_mirror_urls_noop_test_impl)
def _add_netrc_entries_from_mirror_urls_basic_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
{"c1": {"a": "b"}},
add_netrc_entries_from_mirror_urls({}, ["https://a:b@c1"]),
)
asserts.equals(
env,
{"c1": {"a": "b"}},
add_netrc_entries_from_mirror_urls(
{"c1": {"a": "b"}},
["https://a:b@c1"],
),
)
return unittest.end(env)
add_netrc_entries_from_mirror_urls_basic_test = add_test(_add_netrc_entries_from_mirror_urls_basic_test_impl)
def _add_netrc_entries_from_mirror_urls_multi_login_ignored_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
{"c1": {"a": "b"}},
add_netrc_entries_from_mirror_urls({}, ["https://a:b@c1", "https://a:b2@c1", "https://a2:b3@c1"]),
)
asserts.equals(
env,
{"c1": {"a": "b"}},
add_netrc_entries_from_mirror_urls(
{"c1": {"a": "b"}},
["https://a:b@c1", "https://a:b2@c1", "https://a2:b3@c1"],
),
)
return unittest.end(env)
add_netrc_entries_from_mirror_urls_multi_login_ignored_test = add_test(_add_netrc_entries_from_mirror_urls_multi_login_ignored_test_impl)
def _add_netrc_entries_from_mirror_urls_multi_case_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
{
"foo": {"bar": "baz"},
"c1": {"a1": "b1"},
"c2": {"a2": "b2"},
},
add_netrc_entries_from_mirror_urls(
{"foo": {"bar": "baz"}},
["https://a1:b1@c1", "https://a2:b2@c2", "https://a:b@c1", "https://a:b2@c1", "https://a2:b3@c1"],
),
)
return unittest.end(env)
add_netrc_entries_from_mirror_urls_multi_case_test = add_test(_add_netrc_entries_from_mirror_urls_multi_case_test_impl)
def _get_netrc_lines_from_entries_noop_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
[],
get_netrc_lines_from_entries({}),
)
return unittest.end(env)
get_netrc_lines_from_entries_noop_test = add_test(_get_netrc_lines_from_entries_noop_test_impl)
def _get_netrc_lines_from_entries_basic_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
["machine c", "login a", "password b"],
get_netrc_lines_from_entries({
"c": {"a": "b"},
}),
)
return unittest.end(env)
get_netrc_lines_from_entries_basic_test = add_test(_get_netrc_lines_from_entries_basic_test_impl)
def _get_netrc_lines_from_entries_no_pass_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
["machine c", "login a"],
get_netrc_lines_from_entries({
"c": {"a": ""},
}),
)
return unittest.end(env)
get_netrc_lines_from_entries_no_pass_test = add_test(_get_netrc_lines_from_entries_no_pass_test_impl)
def _get_netrc_lines_from_entries_multi_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
[
"machine c",
"login a",
"password b",
"machine c2",
"login a2",
"password p@ssword",
],
get_netrc_lines_from_entries({
"c": {"a": "b"},
"c2": {"a2": "p@ssword"},
}),
)
return unittest.end(env)
get_netrc_lines_from_entries_multi_test = add_test(_get_netrc_lines_from_entries_multi_test_impl)
def _mock_repo_path(path):
if path.startswith("/"):
return path
else:
return "/mockroot/" + path
def _mock_which(path):
return False
def _get_coursier_cache_or_default_disabled_test(ctx):
env = unittest.begin(ctx)
mock_repository_ctx = struct(
os = struct(
environ = {
"COURSIER_CACHE": _mock_repo_path("/does/not/matter"),
},
name = "linux",
),
which = _mock_which,
)
asserts.equals(
env,
"v1",
get_coursier_cache_or_default(mock_repository_ctx, False),
)
return unittest.end(env)
get_coursier_cache_or_default_disabled_test = add_test(_get_coursier_cache_or_default_disabled_test)
def _get_coursier_cache_or_default_enabled_with_default_location_linux_test(ctx):
env = unittest.begin(ctx)
mock_repository_ctx = struct(
os = struct(
environ = {
"HOME": "/home/testuser",
},
name = "linux",
),
which = _mock_which,
)
asserts.equals(
env,
"/home/testuser/.cache/coursier/v1",
get_coursier_cache_or_default(mock_repository_ctx, True),
)
return unittest.end(env)
get_coursier_cache_or_default_enabled_with_default_location_linux_test = add_test(_get_coursier_cache_or_default_enabled_with_default_location_linux_test)
def _get_coursier_cache_or_default_enabled_with_default_location_mac_test(ctx):
env = unittest.begin(ctx)
mock_repository_ctx = struct(
os = struct(
environ = {
"HOME": "/Users/testuser",
},
name = "mac",
),
which = _mock_which,
)
asserts.equals(
env,
"/Users/testuser/Library/Caches/Coursier/v1",
get_coursier_cache_or_default(mock_repository_ctx, True),
)
return unittest.end(env)
get_coursier_cache_or_default_enabled_with_default_location_mac_test = add_test(_get_coursier_cache_or_default_enabled_with_default_location_mac_test)
def _get_coursier_cache_or_default_enabled_with_custom_location_test(ctx):
env = unittest.begin(ctx)
mock_repository_ctx = struct(
os = struct(
environ = {
"COURSIER_CACHE": _mock_repo_path("/custom/location"),
},
name = "linux",
),
which = _mock_which,
)
asserts.equals(
env,
"/custom/location",
get_coursier_cache_or_default(mock_repository_ctx, True),
)
return unittest.end(env)
get_coursier_cache_or_default_enabled_with_custom_location_test = add_test(_get_coursier_cache_or_default_enabled_with_custom_location_test)
def _get_coursier_sha256_default_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
"default_sha256_value",
get_coursier_sha256({}, "default_sha256_value"),
)
return unittest.end(env)
get_coursier_sha256_default_test = add_test(_get_coursier_sha256_default_test_impl)
def _get_coursier_sha256_from_env_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
"custom_sha256_from_env",
get_coursier_sha256({"COURSIER_SHA256": "custom_sha256_from_env"}, "default_sha256_value"),
)
return unittest.end(env)
get_coursier_sha256_from_env_test = add_test(_get_coursier_sha256_from_env_test_impl)
def _mock_which_true(path):
return True
def _mock_execute(args):
if args[-1] == "/Users/testuser/Library/Caches/Coursier/v1":
return struct(return_code = 1)
else:
return struct(return_code = 0)
def _get_coursier_cache_or_default_enabled_with_home_dot_coursier_directory_test(ctx):
env = unittest.begin(ctx)
mock_repository_ctx = struct(
os = struct(
environ = {
"HOME": "/Users/testuser",
},
name = "mac",
),
which = _mock_which_true,
execute = _mock_execute,
)
asserts.equals(
env,
"/Users/testuser/.coursier/cache/v1",
get_coursier_cache_or_default(mock_repository_ctx, True),
)
return unittest.end(env)
get_coursier_cache_or_default_enabled_with_home_dot_coursier_directory_test = add_test(_get_coursier_cache_or_default_enabled_with_home_dot_coursier_directory_test)
def _calculate_inputs_hash_does_not_care_about_input_order_test(ctx):
env = unittest.begin(ctx)
boms1 = [
"""{"group": "first", "artifact": "bom", "version": "version"}""",
"""{"group": "second", "artifact": "bom", "version": "version"}""",
]
artifacts1 = [
"""{"group": "first", "artifact": "artifact", "version": "version"}""",
"""{"group": "second", "artifact": "artifact", "version": "version"}""",
]
repositories1 = [
"https://maven.google.com",
"https://repo1.maven.org/maven2",
]
boms2 = [
"""{"group": "second", "artifact": "bom", "version": "version"}""",
"""{"group": "first", "artifact": "bom", "version": "version"}""",
]
artifacts2 = [
"""{"group": "second", "artifact": "artifact", "version": "version"}""",
"""{"group": "first", "artifact": "artifact", "version": "version"}""",
]
repositories2 = [
"https://repo1.maven.org/maven2",
"https://maven.google.com",
]
# Order of artifacts is switched in each hash
hash1, _ = compute_dependency_inputs_signature(
boms = boms1,
artifacts = artifacts1,
repositories = repositories1,
excluded_artifacts = artifacts2,
)
hash2, _ = compute_dependency_inputs_signature(
boms = boms2,
artifacts = artifacts2,
repositories = repositories2,
excluded_artifacts = artifacts1,
)
asserts.equals(env, hash1, hash2)
return unittest.end(env)
calculate_inputs_hash_does_not_care_about_input_order_test = add_test(_calculate_inputs_hash_does_not_care_about_input_order_test)
def _calculate_inputs_hash_is_different_for_different_repositories_test(ctx):
env = unittest.begin(ctx)
boms1 = [
"""{"group": "first", "artifact": "bom", "version": "version"}""",
"""{"group": "second", "artifact": "bom", "version": "version"}""",
]
artifacts1 = [
"""{"group": "first", "artifact": "artifact", "version": "version"}""",
"""{"group": "second", "artifact": "artifact", "version": "version"}""",
]
repositories1 = [
"https://maven.google.com",
"https://repo1.maven.org/maven2",
]
boms2 = [
"""{"group": "second", "artifact": "bom", "version": "version"}""",
"""{"group": "first", "artifact": "bom", "version": "version"}""",
]
artifacts2 = [
"""{"group": "second", "artifact": "artifact", "version": "version"}""",
"""{"group": "first", "artifact": "artifact", "version": "version"}""",
]
repositories2 = [
"https://repo1.maven.org/maven2",
]
# Order of artifacts is switched in each hash
hash1, _ = compute_dependency_inputs_signature(
boms = boms1,
artifacts = artifacts1,
repositories = repositories1,
excluded_artifacts = [],
)
hash2, _ = compute_dependency_inputs_signature(
boms = boms2,
artifacts = artifacts2,
repositories = repositories2,
excluded_artifacts = [],
)
asserts.false(env, hash1 == hash2)
return unittest.end(env)
calculate_inputs_hash_is_different_for_different_repositories_test = add_test(_calculate_inputs_hash_is_different_for_different_repositories_test)
def _calculate_inputs_hash_uses_excluded_artifacts_test(ctx):
env = unittest.begin(ctx)
boms1 = [
"""{"group": "first", "artifact": "bom", "version": "version"}""",
"""{"group": "second", "artifact": "bom", "version": "version"}""",
]
artifacts1 = [
"""{"group": "first", "artifact": "artifact", "version": "version"}""",
"""{"group": "second", "artifact": "artifact", "version": "version"}""",
]
repositories1 = [
"https://maven.google.com",
"https://repo1.maven.org/maven2",
]
boms2 = [
"""{"group": "second", "artifact": "bom", "version": "version"}""",
"""{"group": "first", "artifact": "bom", "version": "version"}""",
]
artifacts2 = [
"""{"group": "second", "artifact": "artifact", "version": "version"}""",
"""{"group": "first", "artifact": "artifact", "version": "version"}""",
]
excluded1 = ["""{"group": "first", "artifact": "artifact", "version": "version1"}"""]
excluded2 = ["""{"group": "first", "artifact": "artifact", "version": "version2"}"""]
hash1, old_hashes1 = compute_dependency_inputs_signature(
boms = boms1,
artifacts = artifacts1,
repositories = repositories1,
excluded_artifacts = excluded1,
)
hash2, old_hashes2 = compute_dependency_inputs_signature(
boms = boms2,
artifacts = artifacts1,
repositories = repositories1,
excluded_artifacts = excluded2,
)
asserts.false(env, hash1 == hash2)
asserts.true(env, old_hashes1[0] == old_hashes2[0])
asserts.false(env, old_hashes1[1] == old_hashes2[1])
return unittest.end(env)
calculate_inputs_hash_uses_excluded_artifacts_test = add_test(_calculate_inputs_hash_uses_excluded_artifacts_test)
def _get_direct_dependencies_test_impl(ctx):
env = unittest.begin(ctx)
all_artifacts = [
{"coordinates": "com.google.guava:guava:31.0-jre"},
{"coordinates": "com.google.code.gson:gson:2.10.1"},
{"coordinates": "junit:junit:4.13.2"},
{"coordinates": "io.netty:netty-tcnative:2.0.61.Final"},
{"coordinates": "io.netty:netty-tcnative:2.0.61.Final:linux-x86_64"},
{"coordinates": "com.example:lib:1.0@aar"},
]
input_artifacts = [
# Basic: should resolve to 31.0-jre even though 30.0-jre was requested
{"group": "com.google.guava", "artifact": "guava", "version": "30.0-jre"},
# Duplicate: same artifact requested again, should be deduplicated
{"group": "com.google.guava", "artifact": "guava", "version": "29.0-jre"},
# With classifier: should match the linux-x86_64 variant
{"group": "io.netty", "artifact": "netty-tcnative", "version": "2.0.60.Final", "classifier": "linux-x86_64"},
# With packaging: should match the aar
{"group": "com.example", "artifact": "lib", "version": "1.0", "packaging": "aar"},
# Missing: should be skipped
{"group": "com.example", "artifact": "not-present", "version": "1.0"},
]
result = get_direct_dependencies(all_artifacts, input_artifacts)
# Should have 3 results: guava (deduplicated), netty with classifier, and aar
asserts.equals(env, 3, len(result))
asserts.true(env, "com.google.guava:guava:31.0-jre" in result)
asserts.true(env, "io.netty:netty-tcnative:2.0.61.Final:linux-x86_64" in result)
asserts.true(env, "com.example:lib:1.0@aar" in result)
return unittest.end(env)
get_direct_dependencies_test = add_test(_get_direct_dependencies_test_impl)
def _strip_credentials_no_credentials_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
"/https/c1/group/artifact/version/foo.jar",
strip_credentials_from_cache_path("/https/c1/group/artifact/version/foo.jar"),
)
return unittest.end(env)
strip_credentials_no_credentials_test = add_test(_strip_credentials_no_credentials_test_impl)
def _strip_credentials_simple_username_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
"/https/c1/group/artifact/version/foo.jar",
strip_credentials_from_cache_path("/https/a%40c1/group/artifact/version/foo.jar"),
)
return unittest.end(env)
strip_credentials_simple_username_test = add_test(_strip_credentials_simple_username_test_impl)
def _strip_credentials_email_username_test_impl(ctx):
env = unittest.begin(ctx)
asserts.equals(
env,
"/https/c1/group/artifact/version/foo.jar",
strip_credentials_from_cache_path("/https/a%40b%40c1/group/artifact/version/foo.jar"),
)
return unittest.end(env)
strip_credentials_email_username_test = add_test(_strip_credentials_email_username_test_impl)
def coursier_test_suite():
unittest.suite(
"coursier_tests",
*ALL_TESTS
)