blob: ec1c8de46c817b3b3f2558573c654f5e8b456a59 [file] [log] [blame]
# 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__"],
)