blob: 1d9ea1585c735bb7517300e90bd608312589ea01 [file] [log] [blame]
David L. Jones637a6992022-05-06 13:30:48 -07001# Conformance testing for Protobuf.
2
Mike Kruskaled5c57a2022-08-10 22:51:29 -07003load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_proto_library", "objc_library")
Mike Kruskal633e8f72023-01-03 12:11:31 -08004load("@rules_ruby//ruby:defs.bzl", "ruby_binary")
Mike Kruskal571b7272023-11-21 12:08:51 -08005load("//ruby:defs.bzl", "internal_ruby_proto_library")
6load("//:protobuf.bzl", "internal_csharp_proto_library", "internal_objc_proto_library", "internal_php_proto_library", "internal_py_proto_library")
Mike Kruskaled5c57a2022-08-10 22:51:29 -07007load("//build_defs:internal_shell.bzl", "inline_sh_binary")
David L. Jones354aba82022-05-09 16:32:59 -07008load(
9 "@rules_pkg//:mappings.bzl",
David L. Jones354aba82022-05-09 16:32:59 -070010 "pkg_filegroup",
11 "pkg_files",
12 "strip_prefix",
13)
David L. Jones637a6992022-05-06 13:30:48 -070014
15exports_files([
Mike Kruskal6b46e5f2022-08-16 08:14:25 -070016 "bazel_conformance_test_runner.sh",
Mike Kruskaled5c57a2022-08-10 22:51:29 -070017 "failure_list_cpp.txt",
18 "failure_list_csharp.txt",
David L. Jones637a6992022-05-06 13:30:48 -070019 "failure_list_java.txt",
20 "failure_list_java_lite.txt",
Mike Kruskaled5c57a2022-08-10 22:51:29 -070021 "failure_list_objc.txt",
22 "failure_list_php.txt",
23 "failure_list_php_c.txt",
24 "failure_list_python.txt",
25 "failure_list_python_cpp.txt",
Mike Kruskalc23d5332023-11-10 15:18:00 -080026 "failure_list_python_upb.txt",
Mike Kruskaled5c57a2022-08-10 22:51:29 -070027 "failure_list_ruby.txt",
28 "failure_list_jruby.txt",
Jason Lunnc52d80c2023-07-24 23:13:47 -070029 "failure_list_jruby_ffi.txt",
Mike Kruskaled5c57a2022-08-10 22:51:29 -070030 "text_format_failure_list_cpp.txt",
31 "text_format_failure_list_csharp.txt",
David L. Jones637a6992022-05-06 13:30:48 -070032 "text_format_failure_list_java.txt",
33 "text_format_failure_list_java_lite.txt",
Mike Kruskaled5c57a2022-08-10 22:51:29 -070034 "text_format_failure_list_php.txt",
35 "text_format_failure_list_php_c.txt",
36 "text_format_failure_list_python.txt",
37 "text_format_failure_list_python_cpp.txt",
Mike Kruskalc23d5332023-11-10 15:18:00 -080038 "text_format_failure_list_python_upb.txt",
Mike Kruskaled5c57a2022-08-10 22:51:29 -070039 "text_format_failure_list_ruby.txt",
40 "text_format_failure_list_jruby.txt",
Jason Lunnc52d80c2023-07-24 23:13:47 -070041 "text_format_failure_list_jruby_ffi.txt",
David L. Jones637a6992022-05-06 13:30:48 -070042])
43
44cc_proto_library(
45 name = "test_messages_proto2_proto_cc",
Mike Kruskaled5c57a2022-08-10 22:51:29 -070046 deps = ["//src/google/protobuf:test_messages_proto2_proto"],
David L. Jones637a6992022-05-06 13:30:48 -070047)
48
49cc_proto_library(
50 name = "test_messages_proto3_proto_cc",
Mike Kruskaled5c57a2022-08-10 22:51:29 -070051 deps = ["//src/google/protobuf:test_messages_proto3_proto"],
David L. Jones637a6992022-05-06 13:30:48 -070052)
53
54proto_library(
55 name = "conformance_proto",
56 srcs = ["conformance.proto"],
57 visibility = ["//visibility:public"],
58)
59
60cc_proto_library(
Mike Kruskaled5c57a2022-08-10 22:51:29 -070061 name = "conformance_cc_proto",
David L. Jones637a6992022-05-06 13:30:48 -070062 deps = [":conformance_proto"],
63)
64
Mike Kruskaled5c57a2022-08-10 22:51:29 -070065internal_csharp_proto_library(
66 name = "conformance_csharp_proto",
67 srcs = ["conformance.proto"],
68 visibility = [
69 "//csharp:__subpackages__",
70 ],
71)
72
David L. Jones637a6992022-05-06 13:30:48 -070073java_proto_library(
74 name = "conformance_java_proto",
75 visibility = [
76 "//java:__subpackages__",
77 ],
78 deps = [":conformance_proto"],
79)
80
81java_lite_proto_library(
82 name = "conformance_java_proto_lite",
83 visibility = [
84 "//java:__subpackages__",
85 ],
86 deps = [":conformance_proto"],
87)
88
Mike Kruskaled5c57a2022-08-10 22:51:29 -070089internal_objc_proto_library(
90 name = "conformance_objc_proto",
91 srcs = ["conformance.proto"],
92 visibility = [
93 "//conformance:__pkg__",
94 "//objc:__pkg__",
95 ],
96)
97
98internal_py_proto_library(
99 name = "conformance_py_proto",
100 srcs = ["conformance.proto"],
Mike Kruskalca4b0632022-08-11 20:55:01 -0700101 srcs_version = "PY2AND3",
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700102 visibility = [
103 "//python:__subpackages__",
104 ],
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700105)
106
107internal_php_proto_library(
108 name = "conformance_php_proto",
109 srcs = ["conformance.proto"],
110 outs = [
111 "Conformance/ConformanceRequest.php",
112 "Conformance/ConformanceResponse.php",
113 "Conformance/FailureSet.php",
114 "Conformance/JspbEncodingConfig.php",
115 "Conformance/TestCategory.php",
116 "Conformance/WireFormat.php",
117 "GPBMetadata/Conformance.php",
118 ],
119 visibility = [
120 "//conformance:__pkg__",
121 "//php:__pkg__",
122 ],
123)
124
125internal_ruby_proto_library(
126 name = "conformance_ruby_proto",
127 srcs = ["conformance.proto"],
128 visibility = [
129 "//conformance:__pkg__",
130 "//ruby:__pkg__",
131 ],
132)
133
David L. Jones637a6992022-05-06 13:30:48 -0700134cc_library(
David L. Jones637a6992022-05-06 13:30:48 -0700135 name = "conformance_test",
Mike Kruskala2ba8bc2023-10-18 13:12:07 -0700136 testonly = 1,
David L. Jones637a6992022-05-06 13:30:48 -0700137 srcs = [
138 "conformance_test.cc",
139 "conformance_test_runner.cc",
140 ],
141 hdrs = [
142 "conformance_test.h",
143 ],
144 includes = ["."],
Mike Kruskale99b2812022-09-23 14:27:46 -0700145 deps = [
146 ":conformance_cc_proto",
Mike Kruskalf5192302023-04-06 13:18:30 -0700147 "//src/google/protobuf/util:differencer",
148 "//src/google/protobuf/util:json_util",
149 "//src/google/protobuf/util:type_resolver_util",
Mike Kruskale99b2812022-09-23 14:27:46 -0700150 "@com_google_absl//absl/strings",
151 "@com_google_absl//absl/strings:str_format",
152 ],
David L. Jones637a6992022-05-06 13:30:48 -0700153)
154
155cc_library(
156 name = "binary_json_conformance_suite",
Mike Kruskala2ba8bc2023-10-18 13:12:07 -0700157 testonly = 1,
David L. Jones637a6992022-05-06 13:30:48 -0700158 srcs = ["binary_json_conformance_suite.cc"],
159 hdrs = ["binary_json_conformance_suite.h"],
160 deps = [
161 ":conformance_test",
David L. Jones637a6992022-05-06 13:30:48 -0700162 ":test_messages_proto2_proto_cc",
163 ":test_messages_proto3_proto_cc",
Mike Kruskala2ba8bc2023-10-18 13:12:07 -0700164 "//src/google/protobuf/editions:test_messages_proto2_editions_cc_proto",
165 "//src/google/protobuf/editions:test_messages_proto3_editions_cc_proto",
Mike Kruskal8c80a322023-10-17 16:37:25 -0700166 "@com_google_absl//absl/log:die_if_null",
Mike Kruskala3c8e2d2022-08-24 10:46:33 -0700167 "@com_google_absl//absl/status",
Mike Kruskal407aa2d2022-10-19 16:10:10 -0700168 "@jsoncpp",
David L. Jones637a6992022-05-06 13:30:48 -0700169 ],
170)
171
172cc_library(
173 name = "text_format_conformance_suite",
Mike Kruskala2ba8bc2023-10-18 13:12:07 -0700174 testonly = 1,
David L. Jones637a6992022-05-06 13:30:48 -0700175 srcs = ["text_format_conformance_suite.cc"],
176 hdrs = ["text_format_conformance_suite.h"],
177 deps = [
178 ":conformance_test",
179 ":test_messages_proto2_proto_cc",
180 ":test_messages_proto3_proto_cc",
Mike Kruskala2ba8bc2023-10-18 13:12:07 -0700181 "//src/google/protobuf/editions:test_messages_proto2_editions_cc_proto",
182 "//src/google/protobuf/editions:test_messages_proto3_editions_cc_proto",
Mike Kruskal28e573e2023-10-17 17:26:08 -0700183 "@com_google_absl//absl/log:absl_log",
184 "@com_google_absl//absl/log:die_if_null",
185 "@com_google_absl//absl/strings",
David L. Jones637a6992022-05-06 13:30:48 -0700186 ],
187)
188
189cc_binary(
190 name = "conformance_test_runner",
Mike Kruskala2ba8bc2023-10-18 13:12:07 -0700191 testonly = 1,
David L. Jones637a6992022-05-06 13:30:48 -0700192 srcs = ["conformance_test_main.cc"],
193 visibility = ["//visibility:public"],
194 deps = [
195 ":binary_json_conformance_suite",
196 ":conformance_test",
197 ":text_format_conformance_suite",
Mike Kruskale99b2812022-09-23 14:27:46 -0700198 "@com_google_absl//absl/strings:str_format",
David L. Jones637a6992022-05-06 13:30:48 -0700199 ],
200)
201
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700202cc_binary(
203 name = "conformance_cpp",
Mike Kruskalca4b0632022-08-11 20:55:01 -0700204 testonly = 1,
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700205 srcs = ["conformance_cpp.cc"],
Mike Kruskalca4b0632022-08-11 20:55:01 -0700206 visibility = ["//src:__subpackages__"],
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700207 deps = [
208 ":conformance_cc_proto",
209 "//:protobuf",
210 "//:test_messages_proto2_cc_proto",
211 "//:test_messages_proto3_cc_proto",
Mike Kruskala2ba8bc2023-10-18 13:12:07 -0700212 "//src/google/protobuf/editions:test_messages_proto2_editions_cc_proto",
213 "//src/google/protobuf/editions:test_messages_proto3_editions_cc_proto",
Mike Kruskala3c8e2d2022-08-24 10:46:33 -0700214 "@com_google_absl//absl/status",
215 "@com_google_absl//absl/status:statusor",
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700216 ],
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700217)
218
David L. Jones637a6992022-05-06 13:30:48 -0700219java_binary(
220 name = "conformance_java",
Mike Kruskalca4b0632022-08-11 20:55:01 -0700221 testonly = 1,
David L. Jones637a6992022-05-06 13:30:48 -0700222 srcs = ["ConformanceJava.java"],
223 main_class = "ConformanceJava",
224 visibility = [
225 "//java:__subpackages__",
226 ],
227 deps = [
228 ":conformance_java_proto",
229 "//:protobuf_java",
230 "//:protobuf_java_util",
231 "//:test_messages_proto2_java_proto",
232 "//:test_messages_proto3_java_proto",
233 ],
234)
235
236java_binary(
237 name = "conformance_java_lite",
Mike Kruskalca4b0632022-08-11 20:55:01 -0700238 testonly = 1,
David L. Jones637a6992022-05-06 13:30:48 -0700239 srcs = ["ConformanceJavaLite.java"],
240 main_class = "ConformanceJavaLite",
241 visibility = [
242 "//java:__subpackages__",
243 ],
244 deps = [
245 ":conformance_java_proto_lite",
246 "//:protobuf_java_util",
247 "//:protobuf_javalite",
248 "//:test_messages_proto2_java_proto_lite",
249 "//:test_messages_proto3_java_proto_lite",
250 ],
251)
252
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700253py_binary(
254 name = "conformance_python",
Mike Kruskalca4b0632022-08-11 20:55:01 -0700255 testonly = 1,
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700256 srcs = ["conformance_python.py"],
Mike Kruskalca4b0632022-08-11 20:55:01 -0700257 imports = [
258 "..",
259 "../python",
260 ],
261 srcs_version = "PY2AND3",
262 visibility = ["//python:__subpackages__"],
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700263 deps = [
264 ":conformance_py_proto",
265 "//:protobuf_python",
Mike Kruskalc23d5332023-11-10 15:18:00 -0800266 "//python:_message", # Make upb visible if we need it.
Mike Kruskal15eccf32023-11-07 14:37:40 -0800267 "//python:conformance_test_py_proto",
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700268 ],
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700269)
270
271inline_sh_binary(
272 name = "conformance_php",
Mike Kruskalca4b0632022-08-11 20:55:01 -0700273 testonly = 1,
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700274 srcs = [
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700275 "autoload.php",
Mike Kruskalca4b0632022-08-11 20:55:01 -0700276 "conformance_php.php",
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700277 ],
278 cmd = """
279 php -d include_path=conformance:src/google/protobuf \\
280 -d auto_prepend_file=$(rootpath autoload.php) \\
281 $(rootpath conformance_php.php)
282 """,
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700283 visibility = ["//php:__subpackages__"],
Mike Kruskalca4b0632022-08-11 20:55:01 -0700284 deps = [
285 ":conformance_php_proto",
286 "//:test_messages_proto3_php_proto",
287 "//php:source_files",
288 ],
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700289)
290
291inline_sh_binary(
292 name = "conformance_php_c",
Mike Kruskalca4b0632022-08-11 20:55:01 -0700293 testonly = 1,
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700294 srcs = [
295 "conformance_php.php",
296 "//php:extension",
297 ],
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700298 cmd = """
299 php -dextension=$(rootpath //php:extension) \\
300 -d include_path=conformance:src/google/protobuf \\
301 $(rootpath conformance_php.php)
302 """,
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700303 visibility = ["//php:__subpackages__"],
Mike Kruskalca4b0632022-08-11 20:55:01 -0700304 deps = [
305 ":conformance_php_proto",
306 "//:test_messages_proto3_php_proto",
307 ],
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700308)
309
310inline_sh_binary(
311 name = "conformance_csharp",
Mike Kruskalca4b0632022-08-11 20:55:01 -0700312 testonly = 1,
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700313 srcs = ["//csharp/src/Google.Protobuf.Conformance:conformance_dll"],
Mike Kruskalca4b0632022-08-11 20:55:01 -0700314 cmd = "dotnet $(rootpath //csharp/src/Google.Protobuf.Conformance:conformance_dll)",
315 visibility = ["//csharp:__subpackages__"],
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700316 deps = [
317 "//csharp/src/Google.Protobuf.Conformance:conformance_runfiles",
318 ],
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700319)
320
321objc_library(
322 name = "conformance_objc_lib",
Mike Kruskalca4b0632022-08-11 20:55:01 -0700323 testonly = 1,
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700324 non_arc_srcs = ["conformance_objc.m"],
Mike Kruskalca4b0632022-08-11 20:55:01 -0700325 # See https://github.com/bazelbuild/bazel/issues/12897.
326 tags = ["manual"],
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700327 deps = [
328 ":conformance_objc_proto",
329 "//:test_messages_proto2_objc_proto",
330 "//:test_messages_proto3_objc_proto",
Thomas Van Lenten6c7c5a52023-12-12 14:03:01 -0800331 "//src/google/protobuf/editions:test_messages_proto2_editions_objc_proto",
332 "//src/google/protobuf/editions:test_messages_proto3_editions_objc_proto",
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700333 ],
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700334)
335
336cc_binary(
337 name = "conformance_objc",
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700338 testonly = 1,
339 # See https://github.com/bazelbuild/bazel/issues/12897.
340 tags = ["manual"],
341 visibility = ["//objectivec:__subpackages__"],
Mike Kruskalca4b0632022-08-11 20:55:01 -0700342 deps = [":conformance_objc_lib"],
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700343)
344
Mike Kruskal633e8f72023-01-03 12:11:31 -0800345ruby_binary(
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700346 name = "conformance_ruby",
Mike Kruskal633e8f72023-01-03 12:11:31 -0800347 testonly = True,
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700348 srcs = ["conformance_ruby.rb"],
Jason Lunnc52d80c2023-07-24 23:13:47 -0700349 visibility = ["//ruby:__subpackages__"],
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700350 deps = [
351 ":conformance_ruby_proto",
Mike Kruskal571b7272023-11-21 12:08:51 -0800352 "//ruby:conformance_test_ruby_proto",
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700353 ],
Mike Kruskaled5c57a2022-08-10 22:51:29 -0700354)
355
356################################################################################
357# Distribution files
358################################################################################
359
David L. Jones637a6992022-05-06 13:30:48 -0700360filegroup(
361 name = "all_files",
362 srcs = glob(["**/*"]),
David L. Jonescbd1adc2022-05-17 16:39:47 -0700363 visibility = ["//src/google/protobuf/compiler/csharp:__pkg__"],
David L. Jones637a6992022-05-06 13:30:48 -0700364)
365
366pkg_files(
367 name = "dist_files",
368 srcs = glob(
369 ["**/*"],
370 exclude = [
David L. Jones354aba82022-05-09 16:32:59 -0700371 # Handled by dist_scripts:
Mike Kruskal6b46e5f2022-08-16 08:14:25 -0700372 "bazel_conformance_test_runner.sh",
David L. Jones354aba82022-05-09 16:32:59 -0700373
David L. Jones637a6992022-05-06 13:30:48 -0700374 # The following are not in autotools dist:
David L. Jones354aba82022-05-09 16:32:59 -0700375 "autoload.php",
David L. Jones354aba82022-05-09 16:32:59 -0700376 "failure_list_jruby.txt",
377 "update_failure_list.py",
David L. Jones637a6992022-05-06 13:30:48 -0700378 ],
379 ),
380 strip_prefix = strip_prefix.from_root(""),
381 visibility = ["//pkg:__pkg__"],
382)
David L. Jones354aba82022-05-09 16:32:59 -0700383
David L. Jones354aba82022-05-09 16:32:59 -0700384pkg_filegroup(
385 name = "all_dist_files",
386 srcs = [
387 ":dist_files",
David L. Jones354aba82022-05-09 16:32:59 -0700388 ],
389 visibility = ["//pkg:__pkg__"],
390)