# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/features.gni")
import("//build/config/nacl/config.gni")
import("//testing/test.gni")

# |is_nacl_nonsfi| is not used in Mojo builds.
assert(!defined(is_nacl_nonsfi))
is_nacl_nonsfi = false

if (is_android) {
  import("//build/config/android/rules.gni")
}

declare_args() {
  compile_suid_client = is_linux

  compile_credentials = is_linux

  # On Android, use plain GTest.
  use_base_test_suite = is_linux
}

if (is_nacl_nonsfi) {
  config("nacl_nonsfi_warnings") {
    # There are number of platform specific functions in
    # seccomp-bpf syscall helpers, which are not being used.
    cflags = [ "-Wno-unused-function" ]
  }
}

# We have two principal targets: sandbox and sandbox_linux_unittests
# All other targets are listed as dependencies.
# There is one notable exception: for historical reasons, chrome_sandbox is
# the setuid sandbox and is its own target.

group("sandbox") {
  deps = [
    ":sandbox_services",
  ]

  if (compile_suid_client || is_nacl_nonsfi) {
    deps += [ ":suid_sandbox_client" ]
  }
  if (use_seccomp_bpf || is_nacl_nonsfi) {
    deps += [
      ":seccomp_bpf",
      ":seccomp_bpf_helpers",
    ]
  }
}

source_set("sandbox_linux_test_utils") {
  testonly = true
  sources = [
    "tests/sandbox_test_runner.cc",
    "tests/sandbox_test_runner.h",
    "tests/sandbox_test_runner_function_pointer.cc",
    "tests/sandbox_test_runner_function_pointer.h",
    "tests/test_utils.cc",
    "tests/test_utils.h",
    "tests/unit_tests.cc",
    "tests/unit_tests.h",
  ]

  deps = [
    "//testing/gtest",
  ]

  if (use_seccomp_bpf) {
    sources += [
      "seccomp-bpf/bpf_tester_compatibility_delegate.h",
      "seccomp-bpf/bpf_tests.h",
      "seccomp-bpf/sandbox_bpf_test_runner.cc",
      "seccomp-bpf/sandbox_bpf_test_runner.h",
    ]
    deps += [ ":seccomp_bpf" ]
  }

  if (use_base_test_suite) {
    deps += [ "//base/test:test_support" ]
    defines = [ "SANDBOX_USES_BASE_TEST_SUITE" ]
  }
}

# Sources for sandbox_linux_unittests.
source_set("sandbox_linux_unittests_sources") {
  testonly = true

  sources = [
    "services/proc_util_unittest.cc",
    "services/resource_limits_unittests.cc",
    "services/scoped_process_unittest.cc",
    "services/syscall_wrappers_unittest.cc",
    "services/thread_helpers_unittests.cc",
    "services/yama_unittests.cc",
    "syscall_broker/broker_file_permission_unittest.cc",
    "syscall_broker/broker_process_unittest.cc",
    "tests/main.cc",
    "tests/scoped_temporary_file.cc",
    "tests/scoped_temporary_file.h",
    "tests/scoped_temporary_file_unittest.cc",
    "tests/test_utils_unittest.cc",
    "tests/unit_tests_unittest.cc",
  ]

  deps = [
    ":sandbox",
    ":sandbox_linux_test_utils",
    "//base",
    "//testing/gtest",
  ]

  if (use_base_test_suite) {
    deps += [ "//base/test:test_support" ]
    defines = [ "SANDBOX_USES_BASE_TEST_SUITE" ]
  }

  if (is_linux) {
    # Don't use this on Android.
    libs = [ "rt" ]
  }

  if (compile_suid_client) {
    sources += [
      "suid/client/setuid_sandbox_client_unittest.cc",
      "suid/client/setuid_sandbox_host_unittest.cc",
    ]
  }
  if (use_seccomp_bpf) {
    sources += [
      "bpf_dsl/bpf_dsl_unittest.cc",
      "bpf_dsl/codegen_unittest.cc",
      "bpf_dsl/cons_unittest.cc",
      "bpf_dsl/dump_bpf.cc",
      "bpf_dsl/dump_bpf.h",
      "bpf_dsl/syscall_set_unittest.cc",
      "bpf_dsl/test_trap_registry.cc",
      "bpf_dsl/test_trap_registry.h",
      "bpf_dsl/test_trap_registry_unittest.cc",
      "bpf_dsl/verifier.cc",
      "bpf_dsl/verifier.h",
      "integration_tests/bpf_dsl_seccomp_unittest.cc",
      "integration_tests/seccomp_broker_process_unittest.cc",
      "seccomp-bpf-helpers/baseline_policy_unittest.cc",
      "seccomp-bpf-helpers/syscall_parameters_restrictions_unittests.cc",
      "seccomp-bpf/bpf_tests_unittest.cc",
      "seccomp-bpf/sandbox_bpf_unittest.cc",
      "seccomp-bpf/syscall_unittest.cc",
      "seccomp-bpf/trap_unittest.cc",
    ]
    deps += [ ":bpf_dsl_golden" ]
  }
  if (compile_credentials) {
    sources += [
      "integration_tests/namespace_unix_domain_socket_unittest.cc",
      "services/credentials_unittest.cc",
      "services/namespace_utils_unittest.cc",
    ]

    if (use_base_test_suite) {
      # Tests that use advanced features not available in stock GTest.
      sources += [ "services/namespace_sandbox_unittest.cc" ]
    }

    # For credentials_unittest.cc
    configs += [ "//build/config/linux:libcap" ]
  }
}

action("bpf_dsl_golden") {
  script = "bpf_dsl/golden/generate.py"
  inputs = [
    "bpf_dsl/golden/i386/ArgSizePolicy.txt",
    "bpf_dsl/golden/i386/BasicPolicy.txt",
    "bpf_dsl/golden/i386/ElseIfPolicy.txt",
    "bpf_dsl/golden/i386/MaskingPolicy.txt",
    "bpf_dsl/golden/i386/MoreBooleanLogicPolicy.txt",
    "bpf_dsl/golden/i386/NegativeConstantsPolicy.txt",
    "bpf_dsl/golden/i386/SwitchPolicy.txt",
    "bpf_dsl/golden/x86-64/ArgSizePolicy.txt",
    "bpf_dsl/golden/x86-64/BasicPolicy.txt",
    "bpf_dsl/golden/x86-64/BooleanLogicPolicy.txt",
    "bpf_dsl/golden/x86-64/ElseIfPolicy.txt",
    "bpf_dsl/golden/x86-64/MaskingPolicy.txt",
    "bpf_dsl/golden/x86-64/MoreBooleanLogicPolicy.txt",
    "bpf_dsl/golden/x86-64/NegativeConstantsPolicy.txt",
    "bpf_dsl/golden/x86-64/SwitchPolicy.txt",
  ]
  outputs = [
    "$target_gen_dir/bpf_dsl/golden/golden_files.h",
  ]
  args =
      rebase_path(outputs, root_build_dir) + rebase_path(inputs, root_build_dir)
}

# TODO(GYP): Delete this after we've converted everything to GN.
# The _run targets exist only for compatibility w/ GYP.
group("sandbox_linux_unittests_run") {
  testonly = true
  deps = [
    ":sandbox_linux_unittests",
  ]
}

# The main sandboxing test target. "sandbox_linux_unittests" cannot use the
# test() template because the test is run as an executable not as an APK on
# Android.
executable("sandbox_linux_unittests") {
  testonly = true
  deps = [
    ":sandbox_linux_unittests_sources",
    "//build/config/sanitizers:deps",
  ]
}

component("seccomp_bpf") {
  sources = [
    "bpf_dsl/bpf_dsl.cc",
    "bpf_dsl/bpf_dsl.h",
    "bpf_dsl/bpf_dsl_forward.h",
    "bpf_dsl/bpf_dsl_impl.h",
    "bpf_dsl/codegen.cc",
    "bpf_dsl/codegen.h",
    "bpf_dsl/cons.h",
    "bpf_dsl/errorcode.h",
    "bpf_dsl/linux_syscall_ranges.h",
    "bpf_dsl/policy.cc",
    "bpf_dsl/policy.h",
    "bpf_dsl/policy_compiler.cc",
    "bpf_dsl/policy_compiler.h",
    "bpf_dsl/seccomp_macros.h",
    "bpf_dsl/syscall_set.cc",
    "bpf_dsl/syscall_set.h",
    "bpf_dsl/trap_registry.h",
    "seccomp-bpf/die.cc",
    "seccomp-bpf/die.h",
    "seccomp-bpf/sandbox_bpf.cc",
    "seccomp-bpf/sandbox_bpf.h",
    "seccomp-bpf/syscall.cc",
    "seccomp-bpf/syscall.h",
    "seccomp-bpf/trap.cc",
    "seccomp-bpf/trap.h",
  ]
  defines = [ "SANDBOX_IMPLEMENTATION" ]

  deps = [
    ":sandbox_services",
    ":sandbox_services_headers",
    "//base",
  ]

  if (is_nacl_nonsfi) {
    cflags = [ "-fgnu-inline-asm" ]
    sources -= [
      "bpf_dsl/bpf_dsl_forward.h",
      "bpf_dsl/bpf_dsl_impl.h",
      "bpf_dsl/cons.h",
      "bpf_dsl/errorcode.h",
      "bpf_dsl/linux_syscall_ranges.h",
      "bpf_dsl/seccomp_macros.h",
      "bpf_dsl/trap_registry.h",
    ]
  }
}

component("seccomp_bpf_helpers") {
  sources = [
    "seccomp-bpf-helpers/baseline_policy.cc",
    "seccomp-bpf-helpers/baseline_policy.h",
    "seccomp-bpf-helpers/sigsys_handlers.cc",
    "seccomp-bpf-helpers/sigsys_handlers.h",
    "seccomp-bpf-helpers/syscall_parameters_restrictions.cc",
    "seccomp-bpf-helpers/syscall_parameters_restrictions.h",
    "seccomp-bpf-helpers/syscall_sets.cc",
    "seccomp-bpf-helpers/syscall_sets.h",
  ]
  defines = [ "SANDBOX_IMPLEMENTATION" ]

  deps = [
    ":sandbox_services",
    ":seccomp_bpf",
    "//base",
  ]

  if (is_nacl_nonsfi) {
    sources -= [
      "seccomp-bpf-helpers/baseline_policy.cc",
      "seccomp-bpf-helpers/baseline_policy.h",
      "seccomp-bpf-helpers/syscall_sets.cc",
      "seccomp-bpf-helpers/syscall_sets.h",
    ]
    configs += [ ":nacl_nonsfi_warnings" ]
  }
}

if (is_linux) {
  # The setuid sandbox for Linux.
  executable("chrome_sandbox") {
    sources = [
      "suid/common/sandbox.h",
      "suid/common/suid_unsafe_environment_variables.h",
      "suid/process_util.h",
      "suid/process_util_linux.c",
      "suid/sandbox.c",
    ]

    cflags = [
      # For ULLONG_MAX
      "-std=gnu99",

      # These files have a suspicious comparison.
      # TODO fix this and re-enable this warning.
      "-Wno-sign-compare",
    ]

    deps = [
      "//build/config/sanitizers:deps",
    ]
  }
}

component("sandbox_services") {
  sources = [
    "services/init_process_reaper.cc",
    "services/init_process_reaper.h",
    "services/proc_util.cc",
    "services/proc_util.h",
    "services/resource_limits.cc",
    "services/resource_limits.h",
    "services/scoped_process.cc",
    "services/scoped_process.h",
    "services/syscall_wrappers.cc",
    "services/syscall_wrappers.h",
    "services/thread_helpers.cc",
    "services/thread_helpers.h",
    "services/yama.cc",
    "services/yama.h",
    "syscall_broker/broker_channel.cc",
    "syscall_broker/broker_channel.h",
    "syscall_broker/broker_client.cc",
    "syscall_broker/broker_client.h",
    "syscall_broker/broker_common.h",
    "syscall_broker/broker_file_permission.cc",
    "syscall_broker/broker_file_permission.h",
    "syscall_broker/broker_host.cc",
    "syscall_broker/broker_host.h",
    "syscall_broker/broker_policy.cc",
    "syscall_broker/broker_policy.h",
    "syscall_broker/broker_process.cc",
    "syscall_broker/broker_process.h",
  ]

  defines = [ "SANDBOX_IMPLEMENTATION" ]

  deps = [
    "//base",
  ]

  if (compile_credentials || is_nacl_nonsfi) {
    sources += [
      "services/credentials.cc",
      "services/credentials.h",
      "services/namespace_sandbox.cc",
      "services/namespace_sandbox.h",
      "services/namespace_utils.cc",
      "services/namespace_utils.h",
    ]

    deps += [ ":sandbox_services_headers" ]
  }

  if (is_nacl_nonsfi) {
    cflags = [ "-fgnu-inline-asm" ]

    sources -= [
      "services/init_process_reaper.cc",
      "services/init_process_reaper.h",
      "services/scoped_process.cc",
      "services/scoped_process.h",
      "services/yama.cc",
      "services/yama.h",
      "syscall_broker/broker_channel.cc",
      "syscall_broker/broker_channel.h",
      "syscall_broker/broker_client.cc",
      "syscall_broker/broker_client.h",
      "syscall_broker/broker_common.h",
      "syscall_broker/broker_file_permission.cc",
      "syscall_broker/broker_file_permission.h",
      "syscall_broker/broker_host.cc",
      "syscall_broker/broker_host.h",
      "syscall_broker/broker_policy.cc",
      "syscall_broker/broker_policy.h",
      "syscall_broker/broker_process.cc",
      "syscall_broker/broker_process.h",
    ]
  }
}

source_set("sandbox_services_headers") {
  sources = [
    "system_headers/arm64_linux_syscalls.h",
    "system_headers/arm64_linux_ucontext.h",
    "system_headers/arm_linux_syscalls.h",
    "system_headers/arm_linux_ucontext.h",
    "system_headers/i386_linux_ucontext.h",
    "system_headers/linux_futex.h",
    "system_headers/linux_seccomp.h",
    "system_headers/linux_signal.h",
    "system_headers/linux_syscalls.h",
    "system_headers/linux_time.h",
    "system_headers/linux_ucontext.h",
    "system_headers/x86_32_linux_syscalls.h",
    "system_headers/x86_64_linux_syscalls.h",
  ]
}

if (compile_suid_client || is_nacl_nonsfi) {
  component("suid_sandbox_client") {
    sources = [
      "suid/client/setuid_sandbox_client.cc",
      "suid/client/setuid_sandbox_client.h",
      "suid/client/setuid_sandbox_host.cc",
      "suid/client/setuid_sandbox_host.h",
      "suid/common/sandbox.h",
      "suid/common/suid_unsafe_environment_variables.h",
    ]
    defines = [ "SANDBOX_IMPLEMENTATION" ]

    deps = [
      ":sandbox_services",
      "//base",
    ]

    if (is_nacl_nonsfi) {
      sources -= [
        "suid/client/setuid_sandbox_host.cc",
        "suid/client/setuid_sandbox_host.h",
        "suid/common/sandbox.h",
        "suid/common/suid_unsafe_environment_variables.h",
      ]
    }
  }
}

if (is_android) {
  create_native_executable_dist("sandbox_linux_unittests_deps") {
    testonly = true
    dist_dir = "$root_out_dir/sandbox_linux_unittests_deps"
    binary = "$root_out_dir/sandbox_linux_unittests"
    deps = [
      ":sandbox_linux_unittests",
    ]

    if (is_component_build) {
      deps += [ "//build/android:cpplib_stripped" ]
    }
  }

  test_runner_script("sandbox_linux_unittests__test_runner_script") {
    test_name = "sandbox_linux_unittests"
    test_type = "gtest"
    test_suite = "sandbox_linux_unittests"
    isolate_file = "//sandbox/sandbox_linux_unittests_android.isolate"
  }
}
