| # Copyright (c) 2024, Google LLC | |
| # 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 | |
| # Protobuf conformance tests. | |
| load("@rules_cc//cc:cc_library.bzl", "cc_library") | |
| load("@rules_cc//cc:cc_test.bzl", "cc_test") | |
| load("@rules_cc//cc:defs.bzl", "cc_binary", "objc_library") | |
| load("@rules_java//java:defs.bzl", "java_binary") | |
| load("@rules_python//python:py_binary.bzl", "py_binary") | |
| load("@rules_ruby//ruby:defs.bzl", "rb_binary") | |
| load( | |
| "//:protobuf.bzl", | |
| "internal_csharp_proto_library", | |
| "internal_objc_proto_library", | |
| "internal_php_proto_library", | |
| "internal_py_proto_library", | |
| "internal_ruby_proto_library", | |
| ) | |
| load("//bazel:cc_proto_library.bzl", "cc_proto_library") | |
| load("//bazel:java_lite_proto_library.bzl", "java_lite_proto_library") | |
| load("//bazel:java_proto_library.bzl", "java_proto_library") | |
| load("//bazel:proto_library.bzl", "proto_library") | |
| load("//build_defs:internal_shell.bzl", "inline_sh_binary") | |
| load("//ruby:defs.bzl", "internal_ruby_proto_library") | |
| exports_files([ | |
| "bazel_conformance_test_runner.sh", | |
| "failure_list_cpp.txt", | |
| "failure_list_csharp.txt", | |
| "failure_list_java.txt", | |
| "failure_list_java_lite.txt", | |
| "failure_list_objc.txt", | |
| "failure_list_php.txt", | |
| "failure_list_php_c.txt", | |
| "failure_list_python.txt", | |
| "failure_list_python_cpp.txt", | |
| "failure_list_python_upb.txt", | |
| "failure_list_ruby.txt", | |
| "failure_list_jruby.txt", | |
| "failure_list_jruby_ffi.txt", | |
| "text_format_failure_list_cpp.txt", | |
| "text_format_failure_list_java.txt", | |
| "text_format_failure_list_java_lite.txt", | |
| "text_format_failure_list_php.txt", | |
| "text_format_failure_list_php_c.txt", | |
| "text_format_failure_list_python.txt", | |
| ]) | |
| cc_library( | |
| name = "conformance_test_lib", | |
| testonly = 1, | |
| srcs = [ | |
| "conformance_test.cc", | |
| "conformance_test_runner.cc", | |
| ], | |
| hdrs = [ | |
| "conformance_test.h", | |
| ], | |
| deps = [ | |
| ":conformance_cc_proto", | |
| ":failure_list_trie_node", | |
| ":fork_pipe_runner", | |
| ":test_runner", | |
| "//src/google/protobuf", | |
| "//src/google/protobuf:descriptor_legacy", | |
| "//src/google/protobuf:endian", | |
| "//src/google/protobuf/util:differencer", | |
| "@abseil-cpp//absl/container:btree", | |
| "@abseil-cpp//absl/container:flat_hash_set", | |
| "@abseil-cpp//absl/log:absl_check", | |
| "@abseil-cpp//absl/log:absl_log", | |
| "@abseil-cpp//absl/status", | |
| "@abseil-cpp//absl/strings", | |
| "@abseil-cpp//absl/strings:str_format", | |
| ], | |
| ) | |
| cc_library( | |
| name = "conformance_test_main", | |
| testonly = 1, | |
| srcs = ["conformance_test_main.cc"], | |
| deps = [ | |
| ":binary_json_conformance_suite", | |
| ":conformance_test_lib", | |
| ":text_format_conformance_suite", | |
| ], | |
| ) | |
| cc_library( | |
| name = "failure_list_trie_node", | |
| srcs = ["failure_list_trie_node.cc"], | |
| hdrs = ["failure_list_trie_node.h"], | |
| deps = [ | |
| "@abseil-cpp//absl/status", | |
| "@abseil-cpp//absl/strings", | |
| "@abseil-cpp//absl/strings:str_format", | |
| ], | |
| ) | |
| cc_test( | |
| name = "failure_list_trie_node_test", | |
| srcs = ["failure_list_trie_node_test.cc"], | |
| deps = [ | |
| ":failure_list_trie_node", | |
| "@abseil-cpp//absl/status", | |
| "@abseil-cpp//absl/status:statusor", | |
| "@abseil-cpp//absl/strings", | |
| "@googletest//:gtest", | |
| "@googletest//:gtest_main", | |
| ], | |
| ) | |
| # Add more meta-testing here. This is not to be confused with a conformance test itself. | |
| test_suite( | |
| name = "conformance_framework_tests", | |
| tests = [ | |
| "binary_wireformat_test", | |
| "failure_list_trie_node_test", | |
| "naming_test", | |
| "test_manager_test", | |
| "testee_test", | |
| ], | |
| ) | |
| cc_library( | |
| name = "binary_json_conformance_suite", | |
| testonly = 1, | |
| srcs = ["binary_json_conformance_suite.cc"], | |
| hdrs = ["binary_json_conformance_suite.h"], | |
| deps = [ | |
| ":binary_wireformat", | |
| ":conformance_cc_proto", | |
| ":conformance_test_lib", | |
| "//:test_messages_proto2_cc_proto", | |
| "//:test_messages_proto3_cc_proto", | |
| "//conformance/test_protos:test_messages_edition2023_cc_proto", | |
| "//editions:test_messages_proto2_editions_cc_proto", | |
| "//editions:test_messages_proto3_editions_cc_proto", | |
| "//src/google/protobuf", | |
| "//src/google/protobuf:endian", | |
| "//src/google/protobuf:protobuf_lite", | |
| "//src/google/protobuf/json", | |
| "//src/google/protobuf/util:type_resolver", | |
| "@abseil-cpp//absl/log:absl_check", | |
| "@abseil-cpp//absl/log:absl_log", | |
| "@abseil-cpp//absl/log:die_if_null", | |
| "@abseil-cpp//absl/status", | |
| "@abseil-cpp//absl/strings", | |
| "@abseil-cpp//absl/strings:str_format", | |
| "@abseil-cpp//absl/strings:string_view", | |
| "@jsoncpp", | |
| ], | |
| ) | |
| cc_library( | |
| name = "text_format_conformance_suite", | |
| testonly = 1, | |
| srcs = ["text_format_conformance_suite.cc"], | |
| hdrs = ["text_format_conformance_suite.h"], | |
| deps = [ | |
| ":conformance_test_lib", | |
| "//:test_messages_proto2_cc_proto", | |
| "//:test_messages_proto3_cc_proto", | |
| "//conformance/test_protos:test_messages_edition2023_cc_proto", | |
| "//editions:test_messages_proto2_editions_cc_proto", | |
| "//editions:test_messages_proto3_editions_cc_proto", | |
| "//src/google/protobuf", | |
| "@abseil-cpp//absl/log:absl_log", | |
| "@abseil-cpp//absl/log:die_if_null", | |
| "@abseil-cpp//absl/strings", | |
| "@abseil-cpp//absl/strings:str_format", | |
| ], | |
| ) | |
| cc_library( | |
| name = "test_runner", | |
| hdrs = ["test_runner.h"], | |
| deps = ["@abseil-cpp//absl/strings:string_view"], | |
| ) | |
| cc_library( | |
| name = "fork_pipe_runner", | |
| srcs = ["fork_pipe_runner.cc"], | |
| hdrs = ["fork_pipe_runner.h"], | |
| deps = [ | |
| ":conformance_cc_proto", | |
| ":test_runner", | |
| "//src/google/protobuf:endian", | |
| "@abseil-cpp//absl/log:absl_log", | |
| "@abseil-cpp//absl/strings:str_format", | |
| "@abseil-cpp//absl/strings:string_view", | |
| "@abseil-cpp//absl/types:span", | |
| ], | |
| ) | |
| cc_library( | |
| name = "binary_wireformat", | |
| testonly = 1, | |
| srcs = ["binary_wireformat.cc"], | |
| hdrs = ["binary_wireformat.h"], | |
| deps = [ | |
| "//src/google/protobuf:endian", | |
| "//src/google/protobuf:protobuf_lite", | |
| "@abseil-cpp//absl/strings", | |
| ], | |
| ) | |
| cc_library( | |
| name = "test_manager", | |
| testonly = True, | |
| srcs = ["test_manager.cc"], | |
| hdrs = ["test_manager.h"], | |
| deps = [ | |
| ":conformance_cc_proto", | |
| ":failure_list_trie_node", | |
| "//src/google/protobuf/stubs", | |
| "@abseil-cpp//absl/container:btree", | |
| "@abseil-cpp//absl/container:flat_hash_map", | |
| "@abseil-cpp//absl/container:flat_hash_set", | |
| "@abseil-cpp//absl/log:absl_check", | |
| "@abseil-cpp//absl/log:absl_log", | |
| "@abseil-cpp//absl/status", | |
| "@abseil-cpp//absl/strings", | |
| "@abseil-cpp//absl/strings:string_view", | |
| ], | |
| ) | |
| cc_library( | |
| name = "naming", | |
| hdrs = ["naming.h"], | |
| deps = [ | |
| ":conformance_cc_proto", | |
| "//src/google/protobuf", | |
| "//src/google/protobuf:descriptor_legacy", | |
| "@abseil-cpp//absl/log:absl_log", | |
| "@abseil-cpp//absl/strings", | |
| ], | |
| ) | |
| cc_test( | |
| name = "naming_test", | |
| srcs = ["naming_test.cc"], | |
| deps = [ | |
| ":naming", | |
| "//:test_messages_proto2_cc_proto", | |
| "//:test_messages_proto3_cc_proto", | |
| "//conformance/test_protos:test_messages_edition2023_cc_proto", | |
| "//editions:test_messages_proto2_editions_cc_proto", | |
| "//editions:test_messages_proto3_editions_cc_proto", | |
| "@googletest//:gtest", | |
| "@googletest//:gtest_main", | |
| ], | |
| ) | |
| cc_library( | |
| name = "testee", | |
| testonly = True, | |
| srcs = ["testee.cc"], | |
| hdrs = ["testee.h"], | |
| deps = [ | |
| ":binary_wireformat", | |
| ":conformance_cc_proto", | |
| ":naming", | |
| ":test_runner", | |
| "//src/google/protobuf", | |
| "@abseil-cpp//absl/container:flat_hash_set", | |
| "@abseil-cpp//absl/log:absl_check", | |
| "@abseil-cpp//absl/log:absl_log", | |
| "@abseil-cpp//absl/strings", | |
| "@abseil-cpp//absl/strings:string_view", | |
| ], | |
| ) | |
| cc_test( | |
| name = "testee_test", | |
| srcs = ["testee_test.cc"], | |
| deps = [ | |
| ":binary_wireformat", | |
| ":test_runner", | |
| ":testee", | |
| "//:test_messages_proto2_cc_proto", | |
| "//:test_messages_proto3_cc_proto", | |
| "//src/google/protobuf", | |
| "//src/google/protobuf:test_textproto", | |
| "//src/google/protobuf/util:differencer", | |
| "@abseil-cpp//absl/strings:string_view", | |
| "@googletest//:gtest", | |
| "@googletest//:gtest_main", | |
| ], | |
| ) | |
| cc_test( | |
| name = "test_manager_test", | |
| srcs = ["test_manager_test.cc"], | |
| deps = [ | |
| ":test_manager", | |
| "//src/google/protobuf/testing", | |
| "//src/google/protobuf/testing:file", | |
| "@abseil-cpp//absl/log:absl_check", | |
| "@abseil-cpp//absl/status", | |
| "@abseil-cpp//absl/status:status_matchers", | |
| "@abseil-cpp//absl/strings", | |
| "@googletest//:gtest", | |
| "@googletest//:gtest_main", | |
| ], | |
| ) | |
| cc_test( | |
| name = "binary_wireformat_test", | |
| srcs = ["binary_wireformat_test.cc"], | |
| deps = [ | |
| ":binary_wireformat", | |
| "@abseil-cpp//absl/strings", | |
| "@abseil-cpp//absl/strings:string_view", | |
| "@googletest//:gtest", | |
| "@googletest//:gtest_main", | |
| ], | |
| ) | |
| cc_binary( | |
| name = "conformance_test_runner", | |
| testonly = 1, | |
| visibility = ["//visibility:public"], | |
| deps = [":conformance_test_main"], | |
| ) | |
| proto_library( | |
| name = "conformance_proto", | |
| srcs = ["conformance.proto"], | |
| visibility = ["//visibility:public"], | |
| ) | |
| cc_proto_library( | |
| name = "conformance_cc_proto", | |
| deps = [":conformance_proto"], | |
| ) | |
| java_proto_library( | |
| name = "conformance_java_proto", | |
| deps = [":conformance_proto"], | |
| ) | |
| java_lite_proto_library( | |
| name = "conformance_java_proto_lite", | |
| deps = [":conformance_proto"], | |
| ) | |
| exports_files([ | |
| "bazel_conformance_test_runner.sh", | |
| "failure_list_cpp.txt", | |
| "failure_list_csharp.txt", | |
| "failure_list_java.txt", | |
| "failure_list_java_lite.txt", | |
| "failure_list_objc.txt", | |
| "failure_list_php.txt", | |
| "failure_list_php_c.txt", | |
| "failure_list_python.txt", | |
| "failure_list_python_cpp.txt", | |
| "failure_list_python_upb.txt", | |
| "failure_list_ruby.txt", | |
| "failure_list_jruby.txt", | |
| "failure_list_jruby_ffi.txt", | |
| "text_format_failure_list_cpp.txt", | |
| "text_format_failure_list_java.txt", | |
| "text_format_failure_list_java_lite.txt", | |
| "text_format_failure_list_php.txt", | |
| "text_format_failure_list_php_c.txt", | |
| "text_format_failure_list_python.txt", | |
| ]) | |
| internal_csharp_proto_library( | |
| name = "conformance_csharp_proto", | |
| srcs = ["conformance.proto"], | |
| visibility = [ | |
| "//csharp:__subpackages__", | |
| ], | |
| ) | |
| internal_objc_proto_library( | |
| name = "conformance_objc_proto", | |
| srcs = ["conformance.proto"], | |
| visibility = [ | |
| "//conformance:__pkg__", | |
| "//objc:__pkg__", | |
| ], | |
| ) | |
| internal_py_proto_library( | |
| name = "conformance_py_proto", | |
| srcs = ["conformance.proto"], | |
| srcs_version = "PY2AND3", | |
| visibility = [ | |
| "//python:__subpackages__", | |
| ], | |
| ) | |
| internal_php_proto_library( | |
| name = "conformance_php_proto", | |
| srcs = ["conformance.proto"], | |
| outs = [ | |
| "Conformance/ConformanceRequest.php", | |
| "Conformance/ConformanceResponse.php", | |
| "Conformance/FailureSet.php", | |
| "Conformance/JspbEncodingConfig.php", | |
| "Conformance/TestCategory.php", | |
| "Conformance/WireFormat.php", | |
| "GPBMetadata/Conformance.php", | |
| ], | |
| visibility = [ | |
| "//conformance:__pkg__", | |
| "//php:__pkg__", | |
| ], | |
| ) | |
| internal_ruby_proto_library( | |
| name = "conformance_ruby_proto", | |
| srcs = ["conformance.proto"], | |
| visibility = [ | |
| "//conformance:__pkg__", | |
| "//ruby:__pkg__", | |
| ], | |
| ) | |
| cc_binary( | |
| name = "conformance_cpp", | |
| testonly = 1, | |
| srcs = ["conformance_cpp.cc"], | |
| visibility = [ | |
| "//pkg:__pkg__", | |
| "//src:__subpackages__", | |
| ], | |
| deps = [ | |
| ":conformance_cc_proto", | |
| "//:any_cc_proto", | |
| "//:api_cc_proto", | |
| "//:duration_cc_proto", | |
| "//:empty_cc_proto", | |
| "//:field_mask_cc_proto", | |
| "//:protobuf", | |
| "//:struct_cc_proto", | |
| "//:test_messages_proto2_cc_proto", | |
| "//:test_messages_proto3_cc_proto", | |
| "//:timestamp_cc_proto", | |
| "//:type_cc_proto", | |
| "//:wrappers_cc_proto", | |
| "//conformance/test_protos:test_messages_edition2023_cc_proto", | |
| "//editions:test_messages_proto2_editions_cc_proto", | |
| "//editions:test_messages_proto3_editions_cc_proto", | |
| "//src/google/protobuf", | |
| "//src/google/protobuf:port", | |
| "//src/google/protobuf:protobuf_lite", | |
| "//src/google/protobuf/json", | |
| "//src/google/protobuf/stubs", | |
| "//src/google/protobuf/util:json_util", | |
| "//src/google/protobuf/util:type_resolver", | |
| "@abseil-cpp//absl/log:absl_check", | |
| "@abseil-cpp//absl/log:absl_log", | |
| "@abseil-cpp//absl/status", | |
| "@abseil-cpp//absl/status:statusor", | |
| "@abseil-cpp//absl/strings", | |
| ], | |
| ) | |
| java_binary( | |
| name = "conformance_java", | |
| testonly = 1, | |
| srcs = ["ConformanceJava.java"], | |
| main_class = "ConformanceJava", | |
| visibility = [ | |
| "//java:__subpackages__", | |
| ], | |
| deps = [ | |
| ":conformance_java_proto", | |
| "//:protobuf_java", | |
| "//:protobuf_java_util", | |
| "//:test_messages_proto2_java_proto", | |
| "//:test_messages_proto3_java_proto", | |
| "//conformance/test_protos:test_messages_edition2023_java_proto", | |
| "//editions:test_messages_proto2_editions_java_proto", | |
| "//editions:test_messages_proto3_editions_java_proto", | |
| ], | |
| ) | |
| java_binary( | |
| name = "conformance_java_lite", | |
| testonly = 1, | |
| srcs = ["ConformanceJavaLite.java"], | |
| main_class = "ConformanceJavaLite", | |
| visibility = [ | |
| "//java:__subpackages__", | |
| ], | |
| deps = [ | |
| ":conformance_java_proto_lite", | |
| "//:protobuf_java_util", | |
| "//:protobuf_javalite", | |
| "//:test_messages_proto2_java_proto_lite", | |
| "//:test_messages_proto3_java_proto_lite", | |
| "//conformance/test_protos:test_messages_edition2023_java_proto_lite", | |
| "//editions:test_messages_proto2_editions_java_proto_lite", | |
| "//editions:test_messages_proto3_editions_java_proto_lite", | |
| ], | |
| ) | |
| py_binary( | |
| name = "conformance_python", | |
| testonly = 1, | |
| srcs = ["conformance_python.py"], | |
| imports = [ | |
| "..", | |
| "../python", | |
| ], | |
| srcs_version = "PY2AND3", | |
| visibility = ["//python:__subpackages__"], | |
| deps = [ | |
| ":conformance_py_proto", | |
| "//:protobuf_python", | |
| "//conformance/test_protos:test_messages_edition2023_py_pb2", | |
| "//editions:test_messages_proto2_editions_py_pb2", | |
| "//editions:test_messages_proto3_editions_py_pb2", | |
| "//python:_message", # Make upb visible if we need it. | |
| "//python:conformance_test_py_proto", | |
| ], | |
| ) | |
| py_binary( | |
| name = "update_failure_list", | |
| srcs = ["update_failure_list.py"], | |
| ) | |
| inline_sh_binary( | |
| name = "conformance_php", | |
| testonly = 1, | |
| srcs = [ | |
| "autoload.php", | |
| "conformance_php.php", | |
| ], | |
| cmd = """ | |
| php -d include_path=php/generated:conformance:src/google/protobuf:editions/golden \\ | |
| -d auto_prepend_file=$(rootpath autoload.php) \\ | |
| $(rootpath conformance_php.php) | |
| """, | |
| visibility = ["//php:__subpackages__"], | |
| deps = [ | |
| ":conformance_php_proto", | |
| "//:test_messages_proto3_php_proto", | |
| "//editions:test_messages_proto3_editions_php_proto", | |
| "//php:source_files", | |
| ], | |
| ) | |
| inline_sh_binary( | |
| name = "conformance_php_c", | |
| testonly = 1, | |
| srcs = [ | |
| "conformance_php.php", | |
| "//php:extension", | |
| ], | |
| cmd = """ | |
| php -dextension=$(rootpath //php:extension) \\ | |
| -d include_path=conformance:src/google/protobuf:editions/golden \\ | |
| $(rootpath conformance_php.php) | |
| """, | |
| visibility = ["//php:__subpackages__"], | |
| deps = [ | |
| ":conformance_php_proto", | |
| "//:test_messages_proto3_php_proto", | |
| "//editions:test_messages_proto3_editions_php_proto", | |
| ], | |
| ) | |
| inline_sh_binary( | |
| name = "conformance_csharp", | |
| testonly = 1, | |
| srcs = ["//csharp/src/Google.Protobuf.Conformance:conformance_dll"], | |
| cmd = "dotnet $(rootpath //csharp/src/Google.Protobuf.Conformance:conformance_dll)", | |
| visibility = ["//csharp:__subpackages__"], | |
| deps = [ | |
| "//conformance/test_protos:test_messages_edition2023_csharp_proto", | |
| "//csharp/src/Google.Protobuf.Conformance:conformance_runfiles", | |
| ], | |
| ) | |
| objc_library( | |
| name = "conformance_objc_lib", | |
| testonly = 1, | |
| non_arc_srcs = ["conformance_objc.m"], | |
| # See https://github.com/bazelbuild/bazel/issues/12897. | |
| tags = ["manual"], | |
| deps = [ | |
| ":conformance_objc_proto", | |
| "//:test_messages_proto2_objc_proto", | |
| "//:test_messages_proto3_objc_proto", | |
| "//conformance/test_protos:test_messages_edition2023_objc_proto", | |
| "//editions:test_messages_proto2_editions_objc_proto", | |
| "//editions:test_messages_proto3_editions_objc_proto", | |
| ], | |
| ) | |
| cc_binary( | |
| name = "conformance_objc", | |
| testonly = 1, | |
| # See https://github.com/bazelbuild/bazel/issues/12897. | |
| tags = ["manual"], | |
| visibility = ["//objectivec:__subpackages__"], | |
| deps = [":conformance_objc_lib"], | |
| ) | |
| rb_binary( | |
| name = "conformance_ruby", | |
| testonly = True, | |
| srcs = ["conformance_ruby.rb"], | |
| main = "conformance_ruby.rb", | |
| visibility = ["//ruby:__subpackages__"], | |
| deps = [ | |
| ":conformance_ruby_proto", | |
| "//conformance/test_protos:test_messages_edition2023_ruby_proto", | |
| "//ruby:conformance_editions_test_ruby_proto", | |
| "//ruby:conformance_test_ruby_proto", | |
| "//ruby:protobuf", | |
| ], | |
| ) | |
| ################################################################################ | |
| # Distribution files | |
| ################################################################################ | |
| filegroup( | |
| name = "all_files", | |
| srcs = glob(["**/*"]), | |
| visibility = ["//src/google/protobuf/compiler/csharp:__pkg__"], | |
| ) |