load("@fbcode//quic:defs.bzl", "mvfst_cpp_binary", "mvfst_cpp_library")

oncall("traffic_protocols")

mvfst_cpp_library(
    name = "tperf_client",
    srcs = [
        "TperfClient.cpp",
    ],
    headers = [
        "TperfClient.h",
    ],
    deps = [
        "//fizz/crypto:utils",
        "//folly/io/async:async_udp_socket",
        "//quic/common:mvfst_logging",
        "//quic/common/test:test_client_utils",
        "//quic/common/udpsocket:folly_async_udp_socket",
        "//quic/fizz/client/handshake:fizz_client_handshake",
    ],
    exported_deps = [
        "//folly/io/async:async_base",
        "//folly/stats:histogram",
        "//quic/client:client",
        "//quic/common/events:folly_eventbase",
    ],
)

mvfst_cpp_library(
    name = "tperf_server",
    srcs = [
        "TperfServer.cpp",
    ],
    headers = [
        "TperfServer.h",
    ],
    deps = [
        ":pacing_observer",
        "//fizz/crypto:utils",
        "//folly/io:iobuf",
        "//folly/stats:histogram",
        "//quic/common/test:test_utils",
        "//quic/common/udpsocket:folly_async_udp_socket",
        "//quic/congestion_control:static_cwnd_congestion_controller",
        "//quic/logging/oops_logger:glog_oops_logger",
    ],
    exported_deps = [
        "//folly/io/async:async_udp_socket",
        "//quic/api:quic_batch_writer",
        "//quic/common:mvfst_logging",
        "//quic/logging:file_qlogger",
        "//quic/observer:socket_observer_types",
        "//quic/server:accept_observer",
        "//quic/server:server",
    ],
)

mvfst_cpp_library(
    name = "tperf_tcp",
    srcs = [
        "TperfTcp.cpp",
    ],
    headers = [
        "TperfTcp.h",
    ],
    deps = [
        "//fizz/client:async_fizz_client",
        "//fizz/client:fizz_client_context",
        "//fizz/crypto:utils",
        "//fizz/protocol:certificate_verifier",
        "//fizz/server:async_fizz_server",
        "//fizz/server:fizz_server_context",
        "//folly:network_address",
        "//folly/container:f14_hash",
        "//folly/io:iobuf",
        "//folly/io/async:async_base",
        "//folly/io/async:async_socket",
        "//folly/io/async:server_socket",
        "//quic/common:mvfst_logging",
        "//quic/common/test:test_client_utils",
        "//quic/common/test:test_utils",
    ],
)

_TPERF_DEPS = [
    ":tperf_client",
    ":tperf_server",
    ":tperf_tcp",
    "//folly/init:init",
    "//folly/portability:gflags",
    "//quic/common:mvfst_logging",
] + select({
    "DEFAULT": ["//folly:memcpy-use"],
    "ovr_config//os:windows": [],
})

mvfst_cpp_binary(
    name = "tperf",
    srcs = [
        "tperf.cpp",
    ],
    deps = _TPERF_DEPS,
)

# Same tperf binary, built with the xsec_crypto AEAD backend instead of
# fizz/OpenSSL, matching prod revproxy (encrypt via xsec, decrypt via OpenSSL).
# The constraints are applied as cfg modifiers (like revproxy's proxygend) so
# they compose with the selected platform/build mode rather than pinning one.
# use_alt_crypto -> QUIC_DEFAULT_AEAD = XSecCryptoAead; force_alt_crypto -> the
# bridge always uses xsec (bypasses the JK). No flag; :tperf is the OpenSSL
# baseline. (xsec is linux-only; on other platforms this builds like :tperf.)
mvfst_cpp_binary(
    name = "tperf-xsec",
    srcs = [
        "tperf.cpp",
    ],
    modifiers = [
        "fbcode//quic:use_alt_crypto-enabled",
        "fbcode//quic:force_alt_crypto-enabled",
    ],
    deps = _TPERF_DEPS,
)

mvfst_cpp_library(
    name = "pacing_observer",
    headers = [
        "PacingObserver.h",
    ],
    exported_deps = [
        "//quic:constants",
        "//quic/api:transport",
        "//quic/common:mvfst_logging",
        "//quic/congestion_control:bandwidth",
        "//quic/state:quic_state_machine",
    ],
)
