# Conformance testing for Protobuf.

load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "cc_proto_library")
load(
    "@rules_pkg//:mappings.bzl",
    "pkg_attributes",
    "pkg_filegroup",
    "pkg_files",
    "strip_prefix",
)

exports_files([
    "conformance_test_runner.sh",
    "failure_list_java.txt",
    "failure_list_java_lite.txt",
    "text_format_failure_list_java.txt",
    "text_format_failure_list_java_lite.txt",
])

cc_proto_library(
    name = "test_messages_proto2_proto_cc",
    deps = ["//:test_messages_proto2_proto"],
)

cc_proto_library(
    name = "test_messages_proto3_proto_cc",
    deps = ["//:test_messages_proto3_proto"],
)

proto_library(
    name = "conformance_proto",
    srcs = ["conformance.proto"],
    visibility = ["//visibility:public"],
)

cc_proto_library(
    name = "conformance_proto_cc",
    deps = [":conformance_proto"],
)

java_proto_library(
    name = "conformance_java_proto",
    visibility = [
        "//java:__subpackages__",
    ],
    deps = [":conformance_proto"],
)

java_lite_proto_library(
    name = "conformance_java_proto_lite",
    visibility = [
        "//java:__subpackages__",
    ],
    deps = [":conformance_proto"],
)

cc_library(
    name = "jsoncpp",
    srcs = ["third_party/jsoncpp/jsoncpp.cpp"],
    hdrs = ["third_party/jsoncpp/json.h"],
    includes = ["."],
)

cc_library(
    name = "conformance_test",
    srcs = [
        "conformance_test.cc",
        "conformance_test_runner.cc",
    ],
    hdrs = [
        "conformance_test.h",
    ],
    includes = ["."],
    deps = [":conformance_proto_cc"],
)

cc_library(
    name = "binary_json_conformance_suite",
    srcs = ["binary_json_conformance_suite.cc"],
    hdrs = ["binary_json_conformance_suite.h"],
    deps = [
        ":conformance_test",
        ":jsoncpp",
        ":test_messages_proto2_proto_cc",
        ":test_messages_proto3_proto_cc",
    ],
)

cc_library(
    name = "text_format_conformance_suite",
    srcs = ["text_format_conformance_suite.cc"],
    hdrs = ["text_format_conformance_suite.h"],
    deps = [
        ":conformance_test",
        ":test_messages_proto2_proto_cc",
        ":test_messages_proto3_proto_cc",
    ],
)

cc_binary(
    name = "conformance_test_runner",
    srcs = ["conformance_test_main.cc"],
    visibility = ["//visibility:public"],
    deps = [
        ":binary_json_conformance_suite",
        ":conformance_test",
        ":text_format_conformance_suite",
    ],
)

java_binary(
    name = "conformance_java",
    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",
    ],
)

java_binary(
    name = "conformance_java_lite",
    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",
    ],
)

filegroup(
    name = "all_files",
    srcs = glob(["**/*"]),
    visibility = ["//:__pkg__"],
)

pkg_files(
    name = "dist_files",
    srcs = glob(
        ["**/*"],
        exclude = [
            # Handled by dist_scripts:
            "conformance_test_runner.sh",

            # The following are not in autotools dist:
            "autoload.php",
            "conformance_nodejs.js",
            "failure_list_jruby.txt",
            "update_failure_list.py",
        ],
    ),
    strip_prefix = strip_prefix.from_root(""),
    visibility = ["//pkg:__pkg__"],
)

pkg_files(
    name = "dist_scripts",
    srcs = ["conformance_test_runner.sh"],
    attributes = pkg_attributes(mode = "0555"),
    strip_prefix = strip_prefix.from_root(""),
    visibility = ["//pkg:__pkg__"],
)

pkg_filegroup(
    name = "all_dist_files",
    srcs = [
        ":dist_files",
        ":dist_scripts",
    ],
    visibility = ["//pkg:__pkg__"],
)
