# Copyright (c) 2022-2024 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("//build/test.gni")
import("//foundation/communication/netstack/netstack_config.gni")

TLS = "$NETSTACK_NATIVE_ROOT/tls_socket"
TLS_NAPI = "$NETSTACK_DIR/frameworks/js/napi/tls"
SOCKET = "$NETSTACK_DIR/frameworks/js/napi/socket"
TLS_SOCKET_TEST = "$NETSTACK_DIR/test/unittest/tlssocket/client"

tls_sources = [
  "$TLS/src/secure_data.cpp",
  "$TLS/src/socket_error.cpp",
  "$TLS/src/tls_certificate.cpp",
  "$TLS/src/tls_configuration.cpp",
  "$TLS/src/tls_context.cpp",
  "$TLS/src/tls_context_server.cpp",
  "$TLS/src/tls_key.cpp",
  "$TLS/src/tls_socket.cpp",
  "$TLS/src/tls_socket_server.cpp",
  "$TLS/src/tls_utils.cpp",
]

tls_napi_sources = [
  "$TLS_NAPI/src/context/tls_bind_context.cpp",
  "$TLS_NAPI/src/context/tls_connect_context.cpp",
  "$TLS_NAPI/src/context/tls_extra_context.cpp",
  "$TLS_NAPI/src/context/tls_init_context.cpp",
  "$TLS_NAPI/src/context/tls_napi_context.cpp",
  "$TLS_NAPI/src/context/tls_send_context.cpp",
  "$TLS_NAPI/src/context/tls_server_close_context.cpp",
  "$TLS_NAPI/src/context/tls_server_napi_context.cpp",
  "$TLS_NAPI/src/context/tls_server_send_context.cpp",
  "$TLS_NAPI/src/monitor.cpp",
  "$TLS_NAPI/src/monitor_server.cpp",
  "$TLS_NAPI/src/tlssocket_async_work.cpp",
  "$TLS_NAPI/src/tlssocket_exec.cpp",
  "$TLS_NAPI/src/tlssocket_module.cpp",
  "$TLS_NAPI/src/tlssocketserver_async_work.cpp",
  "$TLS_NAPI/src/tlssocketserver_exec.cpp",
  "$TLS_NAPI/src/tlssocketserver_module.cpp",
]

socket_sources = [
  "$SOCKET/async_context/src/bind_context.cpp",
  "$SOCKET/async_context/src/common_context.cpp",
  "$SOCKET/async_context/src/connect_context.cpp",
  "$SOCKET/async_context/src/local_socket_context.cpp",
  "$SOCKET/async_context/src/local_socket_server_context.cpp",
  "$SOCKET/async_context/src/multicast_get_loopback_context.cpp",
  "$SOCKET/async_context/src/multicast_get_ttl_context.cpp",
  "$SOCKET/async_context/src/multicast_membership_context.cpp",
  "$SOCKET/async_context/src/multicast_set_loopback_context.cpp",
  "$SOCKET/async_context/src/multicast_set_ttl_context.cpp",
  "$SOCKET/async_context/src/tcp_extra_context.cpp",
  "$SOCKET/async_context/src/tcp_send_context.cpp",
  "$SOCKET/async_context/src/tcp_server_common_context.cpp",
  "$SOCKET/async_context/src/tcp_server_extra_context.cpp",
  "$SOCKET/async_context/src/tcp_server_listen_context.cpp",
  "$SOCKET/async_context/src/tcp_server_send_context.cpp",
  "$SOCKET/async_context/src/udp_extra_context.cpp",
  "$SOCKET/async_context/src/udp_send_context.cpp",
  "$SOCKET/async_work/src/socket_async_work.cpp",
  "$SOCKET/options/src/extra_options_base.cpp",
  "$SOCKET/options/src/local_socket_options.cpp",
  "$SOCKET/options/src/net_address.cpp",
  "$SOCKET/options/src/socket_remote_info.cpp",
  "$SOCKET/options/src/socket_state_base.cpp",
  "$SOCKET/options/src/tcp_connect_options.cpp",
  "$SOCKET/options/src/tcp_extra_options.cpp",
  "$SOCKET/options/src/tcp_send_options.cpp",
  "$SOCKET/options/src/udp_extra_options.cpp",
  "$SOCKET/options/src/udp_send_options.cpp",
  "$SOCKET/socket_exec/src/local_socket_exec.cpp",
  "$SOCKET/socket_exec/src/socket_exec.cpp",
  "$SOCKET/socket_exec/src/socket_extra_exec.cpp",
  "$SOCKET/socket_module/src/socket_module.cpp",
]

tls_socket_test_sources = [ "$TLS_SOCKET_TEST/tls_utils_test.cpp" ]

config("tls_test_config") {
  include_dirs = [
    "$TLS/include",
    "$TLS_NAPI/include",
    "$TLS_NAPI/include/context",
    "$NETSTACK_INNERKITS_DIR/tls_socket/include",
    "$NETSTACK_DIR/utils/napi_utils/include",
    "$SOCKET/async_context/include",
    "$SOCKET/async_work/include",
    "$SOCKET/constant/include",
    "$SOCKET/socket_exec/include",
    "$SOCKET/socket_module/include",
    "$SOCKET/options/include",
    "$SOCKET/task_queue/include",
  ]
}

ohos_unittest("two_way_tls_socket_unittest") {
  sanitize = {
    cfi = true
    cfi_cross_dso = true
    debug = false
  }

  branch_protector_ret = "pac_ret"

  sources = [ "TlsSocketTest.cpp" ]
  sources += tls_sources
  sources += tls_napi_sources
  sources += socket_sources
  sources += tls_socket_test_sources

  configs = [ ":tls_test_config" ]

  deps = [
    "$NETSTACK_DIR/utils:stack_utils_common",
    "$NETSTACK_DIR/utils/napi_utils:napi_utils",
  ]
  external_deps = [
    "c_utils:utils",
    "hilog:libhilog",
    "napi:ace_napi",
    "openssl:libcrypto_shared",
    "openssl:libssl_shared",
  ]

  defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ]
  if (defined(global_parts_info) &&
      defined(global_parts_info.communication_netmanager_base) &&
      global_parts_info.communication_netmanager_base) {
    external_deps += [ "netmanager_base:net_conn_manager_if" ]
    defines += [ "HAS_NETMANAGER_BASE=1" ]
  } else {
    defines += [ "HAS_NETMANAGER_BASE=0" ]
  }

  module_out_path = "netstack/tls_socket_unittest"
  part_name = "netstack"
  subsystem_name = "communication"
}

ohos_unittest("one_way_tls_socket_unittest") {
  sanitize = {
    cfi = true
    cfi_cross_dso = true
    debug = false
  }

  branch_protector_ret = "pac_ret"

  sources = [ "TlsSocketOneWayTest.cpp" ]
  sources += tls_sources
  sources += tls_napi_sources
  sources += socket_sources
  sources += tls_socket_test_sources

  configs = [ ":tls_test_config" ]

  deps = [
    "$NETSTACK_DIR/utils:stack_utils_common",
    "$NETSTACK_DIR/utils/napi_utils:napi_utils",
  ]
  external_deps = [
    "c_utils:utils",
    "hilog:libhilog",
    "napi:ace_napi",
    "openssl:libcrypto_shared",
    "openssl:libssl_shared",
  ]

  defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ]
  if (defined(global_parts_info) &&
      defined(global_parts_info.communication_netmanager_base) &&
      global_parts_info.communication_netmanager_base) {
    external_deps += [ "netmanager_base:net_conn_manager_if" ]
    defines += [ "HAS_NETMANAGER_BASE=1" ]
  } else {
    defines += [ "HAS_NETMANAGER_BASE=0" ]
  }

  module_out_path = "netstack/tls_socket_unittest"
  part_name = "netstack"
  subsystem_name = "communication"
}

ohos_unittest("two_way_tls_socket_certchain_unittest") {
  sanitize = {
    cfi = true
    cfi_cross_dso = true
    debug = false
  }

  branch_protector_ret = "pac_ret"

  sources = [ "TlsSocketCertChainTest.cpp" ]
  sources += tls_sources
  sources += tls_napi_sources
  sources += socket_sources
  sources += tls_socket_test_sources

  configs = [ ":tls_test_config" ]

  deps = [
    "$NETSTACK_DIR/utils:stack_utils_common",
    "$NETSTACK_DIR/utils/napi_utils:napi_utils",
  ]
  external_deps = [
    "c_utils:utils",
    "hilog:libhilog",
    "napi:ace_napi",
    "openssl:libcrypto_shared",
    "openssl:libssl_shared",
  ]

  defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ]
  if (defined(global_parts_info) &&
      defined(global_parts_info.communication_netmanager_base) &&
      global_parts_info.communication_netmanager_base) {
    external_deps += [ "netmanager_base:net_conn_manager_if" ]
    defines += [ "HAS_NETMANAGER_BASE=1" ]
  } else {
    defines += [ "HAS_NETMANAGER_BASE=0" ]
  }

  module_out_path = "netstack/tls_socket_unittest"
  part_name = "netstack"
  subsystem_name = "communication"
}

ohos_unittest("one_way_tls_socket_certchain_unittest") {
  sanitize = {
    cfi = true
    cfi_cross_dso = true
    debug = false
  }

  branch_protector_ret = "pac_ret"

  sources = [ "TlsSocketCertChainOneWayTest.cpp" ]
  sources += tls_sources
  sources += tls_napi_sources
  sources += socket_sources
  sources += tls_socket_test_sources

  configs = [ ":tls_test_config" ]

  deps = [
    "$NETSTACK_DIR/utils:stack_utils_common",
    "$NETSTACK_DIR/utils/napi_utils:napi_utils",
  ]
  external_deps = [
    "c_utils:utils",
    "hilog:libhilog",
    "napi:ace_napi",
    "openssl:libcrypto_shared",
    "openssl:libssl_shared",
  ]

  defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ]
  if (defined(global_parts_info) &&
      defined(global_parts_info.communication_netmanager_base) &&
      global_parts_info.communication_netmanager_base) {
    external_deps += [ "netmanager_base:net_conn_manager_if" ]
    defines += [ "HAS_NETMANAGER_BASE=1" ]
  } else {
    defines += [ "HAS_NETMANAGER_BASE=0" ]
  }

  module_out_path = "netstack/tls_socket_unittest"
  part_name = "netstack"
  subsystem_name = "communication"
}

ohos_unittest("tls_socket_unilateral_connection") {
  sanitize = {
    cfi = true
    cfi_cross_dso = true
    debug = false
  }

  branch_protector_ret = "pac_ret"

  sources = [ "TlsSocketUnilateralConnection.cpp" ]
  sources += tls_sources
  sources += tls_napi_sources
  sources += socket_sources
  sources += tls_socket_test_sources

  configs = [ ":tls_test_config" ]

  deps = [
    "$NETSTACK_DIR/utils:stack_utils_common",
    "$NETSTACK_DIR/utils/napi_utils:napi_utils",
  ]
  external_deps = [
    "access_token:libaccesstoken_sdk",
    "access_token:libnativetoken",
    "access_token:libtoken_setproc",
    "c_utils:utils",
    "hilog:libhilog",
    "napi:ace_napi",
    "openssl:libcrypto_shared",
    "openssl:libssl_shared",
  ]

  defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ]
  if (defined(global_parts_info) &&
      defined(global_parts_info.communication_netmanager_base) &&
      global_parts_info.communication_netmanager_base) {
    external_deps += [ "netmanager_base:net_conn_manager_if" ]
    defines += [ "HAS_NETMANAGER_BASE=1" ]
  } else {
    defines += [ "HAS_NETMANAGER_BASE=0" ]
  }

  module_out_path = "netstack/tls_socket_unittest"
  part_name = "netstack"
  subsystem_name = "communication"
}

ohos_unittest("secure_data_unittest") {
  sanitize = {
    cfi = true
    cfi_cross_dso = true
    debug = false
  }

  branch_protector_ret = "pac_ret"

  sources = [
    "$TLS/src/secure_data.cpp",
    "SecureDataTest.cpp",
  ]

  configs = [ ":tls_test_config" ]

  deps = [ "$NETSTACK_DIR/utils:stack_utils_common" ]
  external_deps = [
    "c_utils:utils",
    "hilog:libhilog",
  ]

  module_out_path = "netstack/tls_socket_unittest"
  part_name = "netstack"
  subsystem_name = "communication"
}

ohos_unittest("tls_key_test") {
  sanitize = {
    cfi = true
    cfi_cross_dso = true
    debug = false
  }

  branch_protector_ret = "pac_ret"

  sources = [ "TlsKeyTest.cpp" ]
  sources += tls_sources
  sources += tls_napi_sources
  sources += socket_sources

  configs = [ ":tls_test_config" ]

  deps = [
    "$NETSTACK_DIR/utils:stack_utils_common",
    "$NETSTACK_DIR/utils/napi_utils:napi_utils",
  ]
  external_deps = [
    "c_utils:utils",
    "hilog:libhilog",
    "napi:ace_napi",
    "openssl:libcrypto_shared",
    "openssl:libssl_shared",
  ]

  defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ]
  if (defined(global_parts_info) &&
      defined(global_parts_info.communication_netmanager_base) &&
      global_parts_info.communication_netmanager_base) {
    external_deps += [ "netmanager_base:net_conn_manager_if" ]
    defines += [ "HAS_NETMANAGER_BASE=1" ]
  } else {
    defines += [ "HAS_NETMANAGER_BASE=0" ]
  }

  module_out_path = "netstack/tls_socket_unittest"
  part_name = "netstack"
  subsystem_name = "communication"
}

ohos_unittest("tls_cert_test") {
  sanitize = {
    cfi = true
    cfi_cross_dso = true
    debug = false
  }

  branch_protector_ret = "pac_ret"

  sources = [ "TlsCertificateTest.cpp" ]
  sources += tls_sources
  sources += tls_napi_sources
  sources += socket_sources

  configs = [ ":tls_test_config" ]

  deps = [
    "$NETSTACK_DIR/utils:stack_utils_common",
    "$NETSTACK_DIR/utils/napi_utils:napi_utils",
  ]
  external_deps = [
    "c_utils:utils",
    "hilog:libhilog",
    "napi:ace_napi",
    "openssl:libcrypto_shared",
    "openssl:libssl_shared",
  ]

  defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ]
  if (defined(global_parts_info) &&
      defined(global_parts_info.communication_netmanager_base) &&
      global_parts_info.communication_netmanager_base) {
    external_deps += [ "netmanager_base:net_conn_manager_if" ]
    defines += [ "HAS_NETMANAGER_BASE=1" ]
  } else {
    defines += [ "HAS_NETMANAGER_BASE=0" ]
  }

  module_out_path = "netstack/tls_socket_unittest"
  part_name = "netstack"
  subsystem_name = "communication"
}

ohos_unittest("tls_configuration_test") {
  sanitize = {
    cfi = true
    cfi_cross_dso = true
    debug = false
  }

  branch_protector_ret = "pac_ret"

  sources = [ "TlsConfigurationTest.cpp" ]
  sources += tls_sources
  sources += tls_napi_sources
  sources += socket_sources

  configs = [ ":tls_test_config" ]

  deps = [
    "$NETSTACK_DIR/utils:stack_utils_common",
    "$NETSTACK_DIR/utils/napi_utils:napi_utils",
  ]
  external_deps = [
    "c_utils:utils",
    "hilog:libhilog",
    "napi:ace_napi",
    "openssl:libcrypto_shared",
    "openssl:libssl_shared",
  ]

  defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ]
  if (defined(global_parts_info) &&
      defined(global_parts_info.communication_netmanager_base) &&
      global_parts_info.communication_netmanager_base) {
    external_deps += [ "netmanager_base:net_conn_manager_if" ]
    defines += [ "HAS_NETMANAGER_BASE=1" ]
  } else {
    defines += [ "HAS_NETMANAGER_BASE=0" ]
  }

  module_out_path = "netstack/tls_socket_unittest"
  part_name = "netstack"
  subsystem_name = "communication"
}

ohos_unittest("tls_context_test") {
  sanitize = {
    cfi = true
    cfi_cross_dso = true
    debug = false
  }

  branch_protector_ret = "pac_ret"

  sources = [ "TlsContextTest.cpp" ]
  sources += tls_sources
  sources += tls_napi_sources
  sources += socket_sources

  configs = [ ":tls_test_config" ]

  deps = [
    "$NETSTACK_DIR/utils:stack_utils_common",
    "$NETSTACK_DIR/utils/napi_utils:napi_utils",
  ]
  external_deps = [
    "c_utils:utils",
    "hilog:libhilog",
    "napi:ace_napi",
    "openssl:libcrypto_shared",
    "openssl:libssl_shared",
  ]

  defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ]
  if (defined(global_parts_info) &&
      defined(global_parts_info.communication_netmanager_base) &&
      global_parts_info.communication_netmanager_base) {
    external_deps += [ "netmanager_base:net_conn_manager_if" ]
    defines += [ "HAS_NETMANAGER_BASE=1" ]
  } else {
    defines += [ "HAS_NETMANAGER_BASE=0" ]
  }

  module_out_path = "netstack/tls_socket_unittest"
  part_name = "netstack"
  subsystem_name = "communication"
}

ohos_unittest("socket_error_unittest") {
  sanitize = {
    cfi = true
    cfi_cross_dso = true
    debug = false
  }

  branch_protector_ret = "pac_ret"

  sources = [ "SocketErrorTest.cpp" ]
  sources += tls_sources
  sources += tls_napi_sources
  sources += socket_sources

  configs = [ ":tls_test_config" ]

  deps = [
    "$NETSTACK_DIR/utils:stack_utils_common",
    "$NETSTACK_DIR/utils/napi_utils:napi_utils",
  ]
  external_deps = [
    "c_utils:utils",
    "hilog:libhilog",
    "napi:ace_napi",
    "openssl:libcrypto_shared",
    "openssl:libssl_shared",
  ]

  defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ]
  if (defined(global_parts_info) &&
      defined(global_parts_info.communication_netmanager_base) &&
      global_parts_info.communication_netmanager_base) {
    external_deps += [ "netmanager_base:net_conn_manager_if" ]
    defines += [ "HAS_NETMANAGER_BASE=1" ]
  } else {
    defines += [ "HAS_NETMANAGER_BASE=0" ]
  }

  module_out_path = "netstack/tls_socket_unittest"
  part_name = "netstack"
  subsystem_name = "communication"
}

ohos_unittest("tls_socket_branch_test") {
  sanitize = {
    cfi = true
    cfi_cross_dso = true
    debug = false
  }

  branch_protector_ret = "pac_ret"

  sources = [ "TlsSocketBranchTest.cpp" ]
  sources += tls_sources
  sources += tls_napi_sources
  sources += socket_sources

  configs = [ ":tls_test_config" ]

  deps = [
    "$NETSTACK_DIR/utils:stack_utils_common",
    "$NETSTACK_DIR/utils/napi_utils:napi_utils",
  ]
  external_deps = [
    "access_token:libaccesstoken_sdk",
    "access_token:libnativetoken",
    "access_token:libtoken_setproc",
    "c_utils:utils",
    "hilog:libhilog",
    "napi:ace_napi",
    "openssl:libcrypto_shared",
    "openssl:libssl_shared",
  ]

  defines = [ "OPENSSL_SUPPRESS_DEPRECATED" ]
  if (defined(global_parts_info) &&
      defined(global_parts_info.communication_netmanager_base) &&
      global_parts_info.communication_netmanager_base) {
    external_deps += [ "netmanager_base:net_conn_manager_if" ]
    defines += [ "HAS_NETMANAGER_BASE=1" ]
  } else {
    defines += [ "HAS_NETMANAGER_BASE=0" ]
  }

  module_out_path = "netstack/tls_socket_unittest"
  part_name = "netstack"
  subsystem_name = "communication"
}