# 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 = [
    "frame_headers.h",
    "l2cap_defs.h",
  ]

  public_deps = [
    "//src/connectivity/bluetooth/core/bt-host/hci-spec",
    "//src/connectivity/bluetooth/core/bt-host/sm:definitions",
  ]
}

static_library("l2cap") {
  sources = [
    "basic_mode_rx_engine.cc",
    "basic_mode_rx_engine.h",
    "basic_mode_tx_engine.cc",
    "basic_mode_tx_engine.h",
    "bredr_command_handler.cc",
    "bredr_command_handler.h",
    "bredr_dynamic_channel.cc",
    "bredr_dynamic_channel.h",
    "bredr_signaling_channel.cc",
    "bredr_signaling_channel.h",
    "channel.cc",
    "channel.h",
    "channel_configuration.cc",
    "channel_configuration.h",
    "channel_manager.cc",
    "channel_manager.h",
    "command_handler.cc",
    "command_handler.h",
    "dynamic_channel.cc",
    "dynamic_channel.h",
    "dynamic_channel_registry.cc",
    "dynamic_channel_registry.h",
    "enhanced_retransmission_mode_engines.cc",
    "enhanced_retransmission_mode_engines.h",
    "enhanced_retransmission_mode_rx_engine.cc",
    "enhanced_retransmission_mode_rx_engine.h",
    "enhanced_retransmission_mode_tx_engine.cc",
    "enhanced_retransmission_mode_tx_engine.h",
    "fcs.cc",
    "fcs.h",
    "fragmenter.cc",
    "fragmenter.h",
    "l2cap.h",
    "le_signaling_channel.cc",
    "le_signaling_channel.h",
    "logical_link.cc",
    "logical_link.h",
    "low_energy_command_handler.cc",
    "low_energy_command_handler.h",
    "pdu.cc",
    "pdu.h",
    "recombiner.cc",
    "recombiner.h",
    "rx_engine.h",
    "scoped_channel.cc",
    "scoped_channel.h",
    "signaling_channel.cc",
    "signaling_channel.h",
    "tx_engine.h",
    "types.h",
  ]

  public_deps = [
    ":definitions",
    "//sdk/lib/fit",
    "//sdk/lib/fit-promise",
    "//src/connectivity/bluetooth/core/bt-host/hci",
    "//src/connectivity/bluetooth/core/bt-host/transport",
    "//src/lib/fxl",
    "//zircon/system/ulib/inspect",
  ]

  # TODO(https://fxbug.dev/58162): delete the below and fix compiler warnings
  configs += [ "//build/config:Wno-conversion" ]
}

source_set("testing") {
  testonly = true

  sources = [
    "fake_channel.cc",
    "fake_channel.h",
    "fake_channel_test.cc",
    "fake_channel_test.h",
    "fake_l2cap.cc",
    "fake_l2cap.h",
    "fake_signaling_channel.cc",
    "fake_signaling_channel.h",
    "test_packets.cc",
    "test_packets.h",
  ]

  public_deps = [
    ":l2cap",
    "//src/connectivity/bluetooth/core/bt-host/common",
    "//src/connectivity/bluetooth/core/bt-host/hci",
    "//src/lib/fxl",
    "//src/lib/testing/loop_fixture",
    "//third_party/googletest:gtest",
  ]

  # TODO(https://fxbug.dev/58162): delete the below and fix compiler warnings
  configs += [ "//build/config:Wno-conversion" ]
}

source_set("tests") {
  testonly = true

  sources = [
    "basic_mode_rx_engine_unittest.cc",
    "basic_mode_tx_engine_unittest.cc",
    "bredr_command_handler_unittest.cc",
    "bredr_dynamic_channel_unittest.cc",
    "bredr_signaling_channel_unittest.cc",
    "channel_configuration_unittest.cc",
    "channel_manager_unittest.cc",
    "channel_unittest.cc",
    "command_handler_unittest.cc",
    "dynamic_channel_registry_unittest.cc",
    "enhanced_retransmission_mode_engines_unittest.cc",
    "enhanced_retransmission_mode_rx_engine_unittest.cc",
    "enhanced_retransmission_mode_tx_engine_unittest.cc",
    "fcs_unittest.cc",
    "fragmenter_unittest.cc",
    "frame_headers_unittest.cc",
    "l2cap_integration_unittest.cc",
    "le_signaling_channel_unittest.cc",
    "logical_link_unittest.cc",
    "low_energy_command_handler_unittest.cc",
    "pdu_unittest.cc",
    "recombiner_unittest.cc",
    "scoped_channel_unittest.cc",
    "signaling_channel_unittest.cc",
  ]

  deps = [
    ":l2cap",
    ":testing",
    "//sdk/lib/inspect/testing/cpp",
    "//src/connectivity/bluetooth/core/bt-host/hci",
    "//src/connectivity/bluetooth/core/bt-host/hci:testing",
    "//src/connectivity/bluetooth/core/bt-host/socket",
    "//src/connectivity/bluetooth/core/bt-host/testing",
    "//src/connectivity/bluetooth/core/bt-host/transport:testing",
    "//src/lib/testing/loop_fixture",
    "//third_party/googletest:gmock",
    "//third_party/googletest:gtest",
  ]

  # TODO(https://fxbug.dev/58162): delete the below and fix compiler warnings
  configs += [ "//build/config:Wno-conversion" ]

  # TODO(fxbug.dev/95833): This target uses the deprecated C bindings.
  # Consider switching to the C++ bindings. See linked bug for details.
  configs += [ "//build/c:fidl-deprecated-c-bindings" ]
}

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

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

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

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

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

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

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

  # TODO(https://fxbug.dev/58162): delete the below and fix compiler warnings
  configs += [ "//build/config:Wno-conversion" ]
}
