# 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.

# Basic target with protocol definitions and no logic, suitable for test
# emulation.
source_set("definitions") {
  sources = [
    "gatt_defs.cc",
    "gatt_defs.h",
  ]

  public_deps = [
    "//garnet/drivers/bluetooth/lib/att:definitions",
  ]
}

static_library("gatt") {
  sources = [
    "client.cc",
    "client.h",
    "connection.cc",
    "connection.h",
    "gatt.cc",
    "gatt.h",
    "generic_attribute_service.cc",
    "generic_attribute_service.h",
    "local_service_manager.cc",
    "local_service_manager.h",
    "remote_characteristic.cc",
    "remote_characteristic.h",
    "remote_service.cc",
    "remote_service.h",
    "remote_service_manager.cc",
    "remote_service_manager.h",
    "server.cc",
    "server.h",
    "types.cc",
    "types.h",
  ]

  public_deps = [
    ":definitions",
    "//garnet/drivers/bluetooth/lib/att",
    "//garnet/public/lib/fidl/cpp",
    "//zircon/public/lib/fit",
  ]
}

source_set("testing") {
  testonly = true

  sources = [
    "fake_layer.cc",
    "fake_layer.h",
  ]

  public_deps = [
    ":gatt",
    "//garnet/drivers/bluetooth/lib/common",
    "//garnet/public/lib/fxl",
    "//zircon/public/lib/fbl",
  ]
}

source_set("tests") {
  testonly = true

  sources = [
    "client_unittest.cc",
    "fake_client.cc",
    "fake_client.h",
    "generic_attribute_service_unittest.cc",
    "local_service_manager_unittest.cc",
    "remote_service_manager_unittest.cc",
    "server_unittest.cc"
  ]

  deps = [
    ":gatt",
    "//garnet/drivers/bluetooth/lib/att",
    "//garnet/drivers/bluetooth/lib/l2cap:testing",
    "//garnet/drivers/bluetooth/lib/testing",
    "//garnet/public/lib/gtest",
    "//third_party/googletest:gtest",
  ]
}
