load("@fbsource//tools/build_defs:fb_xplat_cxx_test.bzl", "fb_xplat_cxx_test")
load("@fbsource//tools/build_defs:platform_defs.bzl", "ANDROID", "CXX", "FBCODE")
load("@fbsource//tools/build_defs/dirsync:fb_dirsync_cpp_unittest.bzl", "fb_dirsync_cpp_unittest")
load("@fbsource//tools/target_determinator/macros:ci.bzl", "ci")
load("@fbsource//xplat/pfh/triage_InfrastructureSupermoduleOptou:DEFS.bzl", "triage_InfrastructureSupermoduleOptou")

# Android API level gate for ashmem tests.  ASharedMemory_create() requires
# API 26+.  FOLLY_TEST_HAS_ASHMEM is passed as a compiler flag so the C++
# source does not duplicate the threshold.
_ASHMEM_FLAG = ["-DFOLLY_TEST_HAS_ASHMEM=1"]

_ASHMEM_TOOLCHAIN = ["fbsource//third-party/toolchains:android"]

_ASHMEM_COMPILER_FLAGS = select({
    "DEFAULT": [],
    "ovr_config//os/version/android:api-level-26": _ASHMEM_FLAG,
    "ovr_config//os/version/android:api-level-27": _ASHMEM_FLAG,
    "ovr_config//os/version/android:api-level-28": _ASHMEM_FLAG,
    "ovr_config//os/version/android:api-level-29": _ASHMEM_FLAG,
    "ovr_config//os/version/android:api-level-30": _ASHMEM_FLAG,
    "ovr_config//os/version/android:api-level-31": _ASHMEM_FLAG,
    "ovr_config//os/version/android:api-level-32": _ASHMEM_FLAG,
    "ovr_config//os/version/android:api-level-33": _ASHMEM_FLAG,
    "ovr_config//os/version/android:api-level-34": _ASHMEM_FLAG,
    "ovr_config//os/version/android:api-level-35": _ASHMEM_FLAG,
    "ovr_config//os/version/android:api-level-36": _ASHMEM_FLAG,
})

_ASHMEM_DEPS = select({
    "DEFAULT": [],
    "ovr_config//os/version/android:api-level-26": _ASHMEM_TOOLCHAIN,
    "ovr_config//os/version/android:api-level-27": _ASHMEM_TOOLCHAIN,
    "ovr_config//os/version/android:api-level-28": _ASHMEM_TOOLCHAIN,
    "ovr_config//os/version/android:api-level-29": _ASHMEM_TOOLCHAIN,
    "ovr_config//os/version/android:api-level-30": _ASHMEM_TOOLCHAIN,
    "ovr_config//os/version/android:api-level-31": _ASHMEM_TOOLCHAIN,
    "ovr_config//os/version/android:api-level-32": _ASHMEM_TOOLCHAIN,
    "ovr_config//os/version/android:api-level-33": _ASHMEM_TOOLCHAIN,
    "ovr_config//os/version/android:api-level-34": _ASHMEM_TOOLCHAIN,
    "ovr_config//os/version/android:api-level-35": _ASHMEM_TOOLCHAIN,
    "ovr_config//os/version/android:api-level-36": _ASHMEM_TOOLCHAIN,
})

oncall("fbcode_entropy_wardens_folly")

fb_dirsync_cpp_unittest(
    name = "at_fork_test",
    srcs = ["AtForkTest.cpp"],
    feature = triage_InfrastructureSupermoduleOptou,
    deps = [
        "fbsource//third-party/glog:glog",
        "//folly:utility",
        "//folly/portability:gmock",
        "//folly/portability:gtest",
        "//folly/system:at_fork",
    ],
)

fb_dirsync_cpp_unittest(
    name = "aux_vector_test",
    srcs = ["AuxVectorTest.cpp"],
    feature = triage_InfrastructureSupermoduleOptou,
    deps = [
        "//folly/portability:gtest",
        "//folly/system:aux_vector",
    ],
)

fb_dirsync_cpp_unittest(
    name = "env_util_test",
    srcs = ["EnvUtilTest.cpp"],
    feature = triage_InfrastructureSupermoduleOptou,
    deps = [
        "fbsource//third-party/glog:glog",
        "//folly:subprocess",
        "//folly/container:array",
        "//folly/portability:fcntl",
        "//folly/portability:gflags",
        "//folly/portability:gtest",
        "//folly/portability:stdlib",
        "//folly/system:env_util",
    ],
    external_deps = [
        ("boost", None, "boost_algorithm"),
    ],
)

fb_dirsync_cpp_unittest(
    name = "pid_test",
    srcs = ["PidTest.cpp"],
    feature = triage_InfrastructureSupermoduleOptou,
    deps = [
        "fbsource//third-party/glog:glog",
        "//folly/portability:gtest",
        "//folly/system:pid",
    ],
)

fb_dirsync_cpp_unittest(
    name = "memory_mapping_test",
    srcs = ["MemoryMappingTest.cpp"],
    compiler_flags = _ASHMEM_COMPILER_FLAGS,
    # Run with arvr Android API 34 mode so the ashmem test (gated on
    # __ANDROID_API__ >= _ASHMEM_MIN_API) compiles and executes in CI.
    # Scoped to Android only: under unified v2 the unsuffixed/Default target is a
    # plain cxx_test, and applying this Android APK mode to it cross-compiles an
    # aarch64 binary that fails test listing (qemu can't load the Android linker).
    fbandroid_labels = ci.labels(
        ci.linux(ci.mode("fbsource//arvr/mode/android/apk/linux/dev")),
    ),
    fbandroid_run_individual_tests_ait = False,
    feature = triage_InfrastructureSupermoduleOptou,
    platforms = (ANDROID, CXX, FBCODE),
    use_instrumentation_test = True,
    # TODO(T263893609): Drop this explicit override once folly_xplat_cxx_test
    # forwards Android test attrs correctly for xplat/folly tests.
    xplat_impl = fb_xplat_cxx_test,
    deps = [
        "fbsource//third-party/glog:glog",
        "//folly:file_util",
        "//folly:random",
        "//folly/portability:gtest",
        "//folly/portability:sys_mman",
        "//folly/system:memory_mapping",
    ]
    + _ASHMEM_DEPS,
)

fb_dirsync_cpp_unittest(
    name = "shell_test",
    srcs = ["ShellTest.cpp"],
    feature = triage_InfrastructureSupermoduleOptou,
    deps = [
        "fbsource//third-party/glog:glog",
        "//folly/portability:gtest",
        "//folly/system:shell",
    ],
)

fb_dirsync_cpp_unittest(
    name = "thread_id_test",
    srcs = ["ThreadIdTest.cpp"],
    feature = triage_InfrastructureSupermoduleOptou,
    deps = [
        "//folly:benchmark",
        "//folly/portability:gtest",
        "//folly/portability:unistd",
        "//folly/system:thread_id",
    ],
)

fb_dirsync_cpp_unittest(
    name = "thread_name_test",
    srcs = ["ThreadNameTest.cpp"],
    feature = triage_InfrastructureSupermoduleOptou,
    deps = [
        "//folly:scope_guard",
        "//folly/portability:gtest",
        "//folly/synchronization:baton",
        "//folly/system:thread_name",
    ],
)

fb_dirsync_cpp_unittest(
    name = "hardware_concurrency_test",
    srcs = ["HardwareConcurrencyTest.cpp"],
    headers = [],
    feature = triage_InfrastructureSupermoduleOptou,
    deps = [
        "//folly/portability:gtest",
        "//folly/system:env_util",
        "//folly/system:hardware_concurrency",
    ],
)
