# Protocol Buffers - Google's data interchange format # Copyright 2025 Google Inc. All rights reserved. # # Use of this source code is governed by a BSD-style # license that can be found in the LICENSE file or at # https://developers.google.com/open-source/licenses/bsd # """Tests for `proto_common.check_collocated` function.""" load("@rules_testing//lib:analysis_test.bzl", "analysis_test", "test_suite") load("@rules_testing//lib:truth.bzl", "matching") load("@rules_testing//lib:util.bzl", "util") load("//bazel/common:proto_common.bzl", "proto_common") load("//bazel/common:proto_info.bzl", "ProtoInfo") load("//bazel/common:proto_lang_toolchain_info.bzl", "ProtoLangToolchainInfo") load("//bazel/toolchains:proto_lang_toolchain.bzl", "proto_lang_toolchain") def proto_common_check_collocated_test_suite(name): test_suite( name = name, tests = [ _test_allowed_in_different_package, _test_disallowed_in_different_package, _test_export_not_allowed, _test_export_allowed, ], ) def _impl(ctx): proto_common.check_collocated( ctx.label, ctx.attr.proto_dep[ProtoInfo], ctx.attr.toolchain[ProtoLangToolchainInfo], ) return None check_collocated = rule( _impl, attrs = { "proto_dep": attr.label(), "toolchain": attr.label(default = "//bazel/tests/testdata:toolchain"), }, ) # Verifies `proto_common.check_collocated` call. def _test_allowed_in_different_package(name): util.helper_target( proto_lang_toolchain, name = name + "_toolchain", allowlist_different_package = name + "_allowed", command_line = "", ) native.package_group( name = name + "_allowed", packages = ["//..."], ) util.helper_target( check_collocated, name = name + "_check_collocated", proto_dep = "//bazel/tests/testdata:simple_proto", toolchain = name + "_toolchain", ) analysis_test( name = name, target = name + "_check_collocated", impl = _test_allowed_in_different_package_impl, ) def _test_allowed_in_different_package_impl(env, target): env.expect.that_target(target).failures().has_size(0) # Verifies `proto_common.check_collocated` call, when disallowed on toolchain. def _test_disallowed_in_different_package(name): util.helper_target( proto_lang_toolchain, name = name + "_toolchain", allowlist_different_package = name + "_disallowed", command_line = "", ) native.package_group( name = name + "_disallowed", packages = [], ) util.helper_target( check_collocated, name = name + "_check_collocated", proto_dep = "//bazel/tests/testdata:simple_proto", toolchain = name + "_toolchain", ) analysis_test( name = name, target = name + "_check_collocated", impl = _test_disallowed_in_different_package_impl, expect_failure = True, ) def _test_disallowed_in_different_package_impl(env, target): env.expect.that_target(target).failures().contains_predicate( matching.str_matches( "Error in fail: lang_proto_library '*_check_collocated'" + " may only be created in the same package as proto_library " + "'*/testdata:simple_proto'", ), ) # Verifies `proto_common.check_collocated` call, when disallowed on proto. def _test_export_not_allowed(name): util.helper_target( check_collocated, name = name + "_check_collocated", proto_dep = "//bazel/tests/testdata:disallow_exports_proto", ) analysis_test( name = name, target = name + "_check_collocated", impl = _test_export_not_allowed_impl, expect_failure = True, ) def _test_export_not_allowed_impl(env, target): env.expect.that_target(target).failures().contains_predicate( matching.str_matches( "Error in fail: lang_proto_library '*_check_collocated'" + " may only be created in the same package as proto_library " + "'*/testdata:disallow_exports_proto'", ), ) # Verifies `proto_common.check_collocated` call, when allowed on proto. def _test_export_allowed(name): util.helper_target( check_collocated, name = name + "_check_collocated", proto_dep = "//bazel/tests/testdata:allow_exports_proto", ) analysis_test( name = name, target = name + "_check_collocated", impl = _test_export_allowed_impl, ) def _test_export_allowed_impl(env, target): env.expect.that_target(target).failures().has_size(0)