# Copyright (c) 2020-2021 Project CHIP Authors
#
# 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_overrides/build.gni")
import("//build_overrides/chip.gni")

import("${build_root}/config/compiler/compiler.gni")
import("${chip_root}/build/chip/java/config.gni")
import("${chip_root}/build/chip/tests.gni")
import("${chip_root}/src/ble/ble.gni")
import("${chip_root}/src/platform/device.gni")
import("${chip_root}/src/tracing/tracing_args.gni")

# chip_root relative to root_build_dir for macro-prefix-map.
# "/." avoids trailing "/" in result when chip_root is "//"
build_relative_chip_root = rebase_path("${chip_root}/.", root_build_dir)

config("includes") {
  include_dirs = [
    "include",
    ".",
    "${root_gen_dir}/include",
  ]

  if (chip_device_platform == "external" &&
      chip_external_platform_include_dir != "") {
    include_dirs += [ "${chip_external_platform_include_dir}" ]
  }

  defines = [ "CHIP_HAVE_CONFIG_H=1" ]

  # Make __FILE__ and related macros relative to chip_root
  cflags = [ "-fmacro-prefix-map=${build_relative_chip_root}/=" ]
}

if (chip_build_tests) {
  import("${chip_root}/build/chip/chip_test_group.gni")

  chip_test_group("tests") {
    deps = []
    tests = [
      # keep-sorted: start
      "${chip_root}/src/access/tests",
      "${chip_root}/src/app/cluster-building-blocks/tests",
      "${chip_root}/src/app/clusters/access-control-server/tests",
      "${chip_root}/src/app/clusters/administrator-commissioning-server/tests",
      "${chip_root}/src/app/clusters/basic-information/tests",
      "${chip_root}/src/app/clusters/bindings/tests",
      "${chip_root}/src/app/clusters/boolean-state-configuration-server/tests",
      "${chip_root}/src/app/clusters/boolean-state-server/tests",
      "${chip_root}/src/app/clusters/bridged-device-basic-information-server/tests",
      "${chip_root}/src/app/clusters/camera-av-stream-management-server/tests",
      "${chip_root}/src/app/clusters/camera-av-settings-user-level-management-server/tests",
      "${chip_root}/src/app/clusters/chime-server/tests",
      "${chip_root}/src/app/clusters/closure-control-server/tests",
      "${chip_root}/src/app/clusters/descriptor/tests",
      "${chip_root}/src/app/clusters/device-energy-management-server/tests",
      "${chip_root}/src/app/clusters/electrical-energy-measurement-server/tests",
      "${chip_root}/src/app/clusters/electrical-power-measurement-server/tests",
      "${chip_root}/src/app/clusters/ethernet-network-diagnostics-server/tests",
      "${chip_root}/src/app/clusters/energy-evse-server/tests",
      "${chip_root}/src/app/clusters/fixed-label-server/tests",
      "${chip_root}/src/app/clusters/general-commissioning-server/tests",
      "${chip_root}/src/app/clusters/general-diagnostics-server/tests",
      "${chip_root}/src/app/clusters/groupcast/tests",
      "${chip_root}/src/app/clusters/group-key-mgmt-server/tests",
      "${chip_root}/src/app/clusters/groups-server/tests",
      "${chip_root}/src/app/clusters/icd-management-server/tests",
      "${chip_root}/src/app/clusters/identify-server/tests",
      "${chip_root}/src/app/clusters/illuminance-measurement-server/tests",
      "${chip_root}/src/app/clusters/joint-fabric-administrator-server/tests",
      "${chip_root}/src/app/clusters/level-control/tests",
      "${chip_root}/src/app/clusters/localization-configuration-server/tests",
      "${chip_root}/src/app/clusters/network-commissioning/tests",
      "${chip_root}/src/app/clusters/occupancy-sensor-server/tests",
      "${chip_root}/src/app/clusters/on-off-server/tests",
      "${chip_root}/src/app/clusters/operational-credentials-server/tests",
      "${chip_root}/src/app/clusters/ota-provider/tests",
      "${chip_root}/src/app/clusters/power-topology-server/tests",
      "${chip_root}/src/app/clusters/push-av-stream-transport-server/tests",
      "${chip_root}/src/app/clusters/resource-monitoring-server/tests",
      "${chip_root}/src/app/clusters/scenes-server/tests",
      "${chip_root}/src/app/clusters/software-diagnostics-server/tests",
      "${chip_root}/src/app/clusters/soil-measurement-server/tests",
      "${chip_root}/src/app/clusters/switch-server/tests",
      "${chip_root}/src/app/clusters/temperature-control-server/tests",
      "${chip_root}/src/app/clusters/temperature-measurement-server/tests",
      "${chip_root}/src/app/clusters/thread-network-diagnostics-server/tests",
      "${chip_root}/src/app/clusters/time-format-localization-server/tests",
      "${chip_root}/src/app/clusters/time-synchronization-server/tests",
      "${chip_root}/src/app/clusters/tls-certificate-management-server/tests",
      "${chip_root}/src/app/clusters/tls-client-management-server/tests",
      "${chip_root}/src/app/clusters/unit-localization-server/tests",
      "${chip_root}/src/app/clusters/user-label-server/tests",
      "${chip_root}/src/app/clusters/valve-configuration-and-control-server/tests",
      "${chip_root}/src/app/clusters/webrtc-transport-provider-server/tests",
      "${chip_root}/src/app/clusters/webrtc-transport-requestor-server/tests",
      "${chip_root}/src/app/clusters/wifi-network-diagnostics-server/tests",
      "${chip_root}/src/app/clusters/wifi-network-management-server/tests",
      "${chip_root}/src/app/clusters/zone-management-server/tests",
      "${chip_root}/src/app/data-model-provider/tests",
      "${chip_root}/src/app/data-model/tests",
      "${chip_root}/src/app/icd/server/tests",
      "${chip_root}/src/app/persistence/tests",
      "${chip_root}/src/app/server-cluster/tests",
      "${chip_root}/src/app/server/tests",
      "${chip_root}/src/credentials/tests/jcm",
      "${chip_root}/src/crypto/tests",
      "${chip_root}/src/data-model-providers/codedriven/endpoint/tests",
      "${chip_root}/src/inet/tests",
      "${chip_root}/src/lib/address_resolve/tests",
      "${chip_root}/src/app/server-cluster/tests",
      "${chip_root}/src/app/server/tests",
      "${chip_root}/src/lib/asn1/tests",
      "${chip_root}/src/lib/core/tests",
      "${chip_root}/src/lib/dnssd/minimal_mdns/core/tests",
      "${chip_root}/src/lib/dnssd/minimal_mdns/responders/tests",
      "${chip_root}/src/lib/dnssd/minimal_mdns/tests",
      "${chip_root}/src/lib/dnssd/tests",
      "${chip_root}/src/lib/format/tests",
      "${chip_root}/src/lib/support/verhoeff/tests",
      "${chip_root}/src/messaging/tests",
      "${chip_root}/src/protocols/bdx/tests",
      "${chip_root}/src/protocols/interaction_model/tests",
      "${chip_root}/src/protocols/secure_channel/tests",
      "${chip_root}/src/protocols/user_directed_commissioning/tests",
      "${chip_root}/src/srp/tests",
      "${chip_root}/src/system/tests",
      "${chip_root}/src/tracing/esp32_diagnostics/tests",
      "${chip_root}/src/transport/retransmit/tests",
      "${chip_root}/src/transport/tests",

      # keep-sorted: end

      # TODO(#40932): Fix and re-enable the Commodity Tariff unit tests.
      # "${chip_root}/src/app/clusters/commodity-tariff-server/tests",
    ]

    if (current_os != "zephyr") {
      tests += [ "${chip_root}/src/lib/dnssd/minimal_mdns/records/tests" ]
    }

    if (chip_device_platform == "darwin") {
      # Darwin does not include the uriparser submodule, which is required by
      # push-av-stream-transport-server tests.
      tests -= [
        "${chip_root}/src/app/clusters/push-av-stream-transport-server/tests",
      ]
    }

    if (current_os != "zephyr") {
      # Avoid these items from "one single binary" test executions. Once tests
      # are split, we can re-visit this (and likely many others).
      #
      # In particular: "data-model-providers/codegen/tests" contains
      # symbols for ember mocks which are used by other tests.

      tests += [
        "${chip_root}/src/setup_payload/tests",
        "${chip_root}/src/transport/raw/tests",
      ]
    }

    if (current_os != "zephyr" && chip_device_platform != "efr32") {
      # Disabled from "one single binary" since the "mocks" contain duplicate sybmols
      # with ember
      # Disabled on EFR32 since "include <random>" fails with `::fabs` not defined
      tests += [
        "${chip_root}/src/data-model-providers/codedriven/tests",
        "${chip_root}/src/data-model-providers/codegen/tests",
        "${chip_root}/examples/common/server-cluster-shim/tests",
      ]
    }

    if (chip_device_platform != "nrfconnect") {
      tests += [ "${chip_root}/src/app/clusters/diagnostic-logs-server/tests/" ]
    }

    if (chip_device_platform != "efr32") {
      tests += [
        "${chip_root}/src/app/tests",

        # Disabled for EFR32 because _open is not implemented.
        # https://github.com/project-chip/connectedhomeip/issues/35624
        "${chip_root}/src/credentials/tests",
        "${chip_root}/src/lib/support/tests",
      ]
    }

    if (matter_enable_tracing_support &&
        matter_trace_config == "${chip_root}/src/tracing/multiplexed") {
      tests += [ "${chip_root}/src/tracing/tests" ]
    }

    if (chip_device_platform != "none") {
      tests += [ "${chip_root}/src/lib/dnssd/minimal_mdns/tests" ]
    }

    if (chip_device_platform != "ameba") {
      tests += [ "${chip_root}/src/platform/tests" ]
    }

    if (chip_config_network_layer_ble) {
      tests += [ "${chip_root}/src/ble/tests" ]
    }

    if (chip_device_config_enable_wifipaf) {
      tests += [ "${chip_root}/src/wifipaf/tests" ]
    }

    # On nrfconnect, the controller tests run into
    # https://github.com/project-chip/connectedhomeip/issues/9630
    if (chip_device_platform != "nrfconnect") {
      tests += [
        "${chip_root}/src/controller/tests",
        "${chip_root}/src/controller/tests/data_model",
        "${chip_root}/src/controller/tests/jcm",
      ]
    }

    if (current_os != "zephyr" && chip_device_platform != "esp32" &&
        chip_device_platform != "ameba") {
      tests += [ "${chip_root}/src/lib/shell/tests" ]
    }

    if (chip_monolithic_tests) {
      deps += [ "${chip_root}/src/lib/support:pw_tests_wrapper" ]
      build_monolithic_library = true
      output_name = "libCHIP_tests"
      output_dir = "${root_out_dir}/lib"
    }
  }

  chip_test_group("example_tests") {
    deps = []
    tests = []

    # NXP: EVSE tests depend on ot-simulation; missing headers
    # in ot-nxp OpenThread cause build failure, so we exclude them here.
    if (chip_device_platform != "esp32" && chip_device_platform != "efr32" &&
        chip_device_platform != "nxp" && current_os != "android") {
      tests += [ "${chip_root}/examples/evse-app/evse-common/tests" ]
    }
  }

  chip_test_group("fake_platform_tests") {
    tests = [ "${chip_root}/src/lib/dnssd/platform/tests" ]
  }

  # Tests to run with each Crypto PAL
  chip_test_group("crypto_tests") {
    tests = [
      "${chip_root}/src/credentials/tests",
      "${chip_root}/src/crypto/tests",
    ]
  }

  if (matter_enable_java_compilation) {
    group("java_controller_tests") {
      deps = [ "${chip_root}/src/controller/java:unit_tests" ]
    }
  }
}
