# Copyright 2017 The Fuchsia 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/fuzzing/fuzzer.gni")
import("//src/connectivity/bluetooth/core/bt-host/build/bt_gtest_package.gni")

# Basic target with protocol definitions and no logic, suitable for test
# emulation.
source_set("definitions") {
  sources = [
    "connection_parameters.cc",
    "connection_parameters.h",
    "hci.h",
    "hci_constants.h",
    "hci_defs.h",
    "link_key.cc",
    "link_key.h",
    "status.cc",
    "status.h",
    "util.cc",
    "util.h",
  ]

  public_deps = [ "//src/connectivity/bluetooth/core/bt-host/common" ]
}

static_library("hci") {
  sources = [
    "acl_data_channel.cc",
    "acl_data_channel.h",
    "acl_data_packet.cc",
    "acl_data_packet.h",
    "advertising_report_parser.cc",
    "advertising_report_parser.h",
    "bredr_connection_request.cc",
    "bredr_connection_request.h",
    "command_channel.cc",
    "command_channel.h",
    "command_handler.h",
    "connection.cc",
    "connection.h",
    "control_packets.cc",
    "control_packets.h",
    "defaults.h",
    "device_wrapper.cc",
    "device_wrapper.h",
    "legacy_low_energy_advertiser.cc",
    "legacy_low_energy_advertiser.h",
    "legacy_low_energy_scanner.cc",
    "legacy_low_energy_scanner.h",
    "local_address_delegate.h",
    "low_energy_advertiser.h",
    "low_energy_connector.cc",
    "low_energy_connector.h",
    "low_energy_scanner.cc",
    "low_energy_scanner.h",
    "packet.h",
    "sequential_command_runner.cc",
    "sequential_command_runner.h",
    "slab_allocators.h",
    "transport.cc",
    "transport.h",
  ]

  public_deps = [
    ":definitions",
    "//sdk/banjo/fuchsia.hardware.bt.hci",
    "//sdk/banjo/fuchsia.hardware.bt.vendor",
    "//sdk/fidl/fuchsia.hardware.bluetooth:fuchsia.hardware.bluetooth_c",
    "//sdk/fidl/fuchsia.hardware.bluetooth:fuchsia.hardware.bluetooth_c_client",
    "//sdk/lib/fdio",
    "//sdk/lib/fit",
    "//sdk/lib/fit-promise",
    "//src/lib/ddk",
    "//src/lib/files",
    "//src/lib/fxl",
    "//zircon/public/lib/fbl",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/fzl",
    "//zircon/system/ulib/trace:trace-driver",
  ]
}

source_set("testing") {
  testonly = true

  sources = [
    "fake_connection.cc",
    "fake_connection.h",
    "fake_local_address_delegate.cc",
    "fake_local_address_delegate.h",
    "mock_acl_data_channel.h",
  ]

  public_deps = [ ":hci" ]

  deps = [ "//src/lib/fxl" ]
}

source_set("tests") {
  testonly = true

  sources = [
    "acl_data_channel_unittest.cc",
    "advertising_report_parser_unittest.cc",
    "command_channel_unittest.cc",
    "command_handler_unittest.cc",
    "connection_unittest.cc",
    "device_wrapper_unittest.cc",
    "legacy_low_energy_advertiser_unittest.cc",
    "legacy_low_energy_scanner_unittest.cc",
    "low_energy_connector_unittest.cc",
    "packet_unittest.cc",
    "sequential_command_runner_unittest.cc",
    "slab_allocators_unittest.cc",
    "status_unittest.cc",
    "transport_unittest.cc",
    "util_unittest.cc",
  ]

  deps = [
    ":testing",
    "//src/connectivity/bluetooth/core/bt-host/testing",
    "//third_party/googletest:gtest",
  ]
}

bt_gtest_package("bt-host-hci-tests") {
  with_death_tests = true
  deps = [ ":tests" ]
}

fuzzer("read_acl_data_packet_fuzzer") {
  sources = [ "acl_data_channel_read_acl_data_packet_fuzztest.cc" ]
  deps = [
    ":testing",
    "//src/connectivity/bluetooth/core/bt-host/testing",
    "//src/connectivity/bluetooth/core/bt-host/testing:fuzztest_driver",
  ]
}

fuzzer("read_command_event_packet_fuzzer") {
  sources = [ "command_channel_read_event_packet_fuzztest.cc" ]
  deps = [
    ":testing",
    "//src/connectivity/bluetooth/core/bt-host/testing",
    "//src/connectivity/bluetooth/core/bt-host/testing:fuzztest_driver",
  ]
}
