# Copyright (c) 2020 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("${chip_root}/build/chip/chip_test.gni")
import("${chip_root}/build/chip/tests.gni")
import("${dir_pw_unit_test}/test.gni")

assert(chip_build_tests)

# Define CHIP unit tests
#
# Simple usage
# chip_test_suite("tests") {
#   output_name = "libFooTests"
#
#   sources = [
#      "Common.h",      # add common sources here
#      "Common.cpp",
#   ]
#
#   test_sources = [
#     "TestFoo.cpp",    # Files are parsed for `CHIP_REGISTER_TEST_SUITE(...)`
#     "TestBar.cpp",    # and a driver is created automatically
#   ]
#
#   public_deps = [
#     "${chip_root}/src/lib/foo",         # add dependencies here
#     "${nlunit_test_root}:nlunit-test",
#   ]
# }
#
#
# Deprecated usage (writing own driver files):
#
# chip_test_suite("tests") {
#   output_name = "libFooTests"
#
#   sources = [
#     "TestDeclarations.h",
#     "TestFoo.cpp",
#     "TestBar.cpp",
#   ]
#
#   public_deps = [
#     "${chip_root}/src/lib/foo",         # add dependencies here
#     "${nlunit_test_root}:nlunit-test",
#   ]
#
#   tests = [
#     "TestFoo",  # Assumes TestFooDriver.cpp exists
#     "TestBar",  # Assumes TestBarDriver.cpp exists
#   ]
# }

#
template("chip_test_suite") {
  _suite_name = target_name

  # Ensures that the common library has sources containing both common
  # and individual unit tests.
  if (!defined(invoker.sources)) {
    invoker.sources = []
  }

  if (defined(invoker.test_sources)) {
    invoker.sources += invoker.test_sources
  }

  if (chip_build_test_static_libraries) {
    _target_type = "static_library"
  } else {
    _target_type = "source_set"
  }
  target(_target_type, "${_suite_name}_lib") {
    forward_variables_from(invoker, "*", [ "tests" ])

    output_dir = "${root_out_dir}/lib"

    if (!defined(invoker.public_deps)) {
      public_deps = []
    }

    # TODO: figure out a way to auto-define dependency on stdio logging.
    #       This dep is required since libSupportLayer now does not include
    #       a default implementation.
    #
    #       Tests such as TestInetEndPoint need to exercise the system event
    #       loop however they do not seem to include a logging binding so this
    #       is forcefully added here.
    if (current_os != "zephyr" && current_os != "mbed") {
      public_deps += [ "${chip_root}/src/platform/logging:stdio" ]
    }
  }

  if (chip_link_tests) {
    tests = []

    if (defined(invoker.test_sources)) {
      foreach(_test, invoker.test_sources) {
        _test_name = string_replace(_test, ".cpp", "")

        _driver_name = "${root_gen_dir}/${_test_name}.driver.cpp"

        action("${_test_name}_generate_driver") {
          script = "${chip_root}/scripts/gen_test_driver.py"

          inputs = [ _test ]
          outputs = [ _driver_name ]
          args = [
            "--input_file=" + rebase_path(_test, root_build_dir),
            "--output_file=" + rebase_path(_driver_name, root_build_dir),
          ]
        }

        chip_test(_test_name) {
          sources = [ _driver_name ]
          public_deps = [
            ":${_suite_name}_lib",
            ":${_test_name}_generate_driver",
          ]
        }

        tests += [ _test_name ]
      }
    }

    if (defined(invoker.tests)) {
      foreach(_test, invoker.tests) {
        chip_test(_test) {
          sources = [ "${_test}Driver.cpp" ]

          public_deps = [ ":${_suite_name}_lib" ]
        }

        tests += [ _test ]
      }
    }

    group(_suite_name) {
      deps = []
      foreach(_test, tests) {
        deps += [ ":${_test}" ]
      }
    }

    group("${_suite_name}_run") {
      deps = []
      foreach(_test, tests) {
        deps += [ ":${_test}_run" ]
      }
    }
  } else {
    group(_suite_name) {
      deps = [ ":${_suite_name}_lib" ]
    }
  }
}
