# Copyright 2019 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/bind/bind.gni")
import("//build/components.gni")
import("//build/config/fuchsia/rules.gni")
import("//build/test.gni")

fuchsia_system_package("serial-ppp") {
  testonly = false

  deps = [ ":serial-ppp_driver" ]

  allowed_in_extra_deps = true
}

source_set("driver") {
  sources = [
    "serial-ppp.cc",
    "serial-ppp.h",
  ]

  include_dirs = [ "//src/connectivity/ppp" ]

  public_deps = [
    ":serial-ppp-bind",
    "//sdk/banjo/fuchsia.hardware.network.device",
    "//sdk/banjo/fuchsia.hardware.serial",
    "//sdk/fidl/fuchsia.hardware.network:fuchsia.hardware.network_llcpp",
    "//sdk/lib/fit-promise",
    "//src/connectivity/ppp/lib/common",
    "//src/connectivity/ppp/lib/hdlc:frame",
    "//src/devices/lib/driver",
    "//src/lib/ddk",
    "//src/lib/ddktl",
    "//src/lib/vmo_store",
    "//zircon/public/lib/async-cpp",
    "//zircon/public/lib/fbl",
    "//zircon/public/lib/fidl",
    "//zircon/public/lib/fidl-llcpp",
    "//zircon/public/lib/zx",
    "//zircon/system/ulib/async-default",
    "//zircon/system/ulib/async-loop",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/fidl-async:fidl-async-cpp",
  ]
}

test("driver-test") {
  sources = [ "serial-ppp-test.cc" ]

  include_dirs = [ "//src/connectivity/ppp" ]

  deps = [
    ":driver",
    "//sdk/lib/stdcompat",
    "//zircon/public/lib/zx",
    "//zircon/public/lib/zxtest",
  ]
}

fuchsia_unittest_package("serial-ppp-driver-test") {
  deps = [ ":driver-test" ]
}

bind_rules("serial-ppp-bind") {
  rules = "serial-ppp.bind"
  output = "serial-ppp-bind.h"
  tests = "bind_tests.json"
  deps = [ "//src/devices/bind/fuchsia.serial" ]
}

driver_module("serial-ppp_driver") {
  output_name = "serial-ppp"
  testonly = false

  include_dirs = [ "//src/connectivity/ppp" ]

  deps = [ ":driver" ]
}

group("tests") {
  testonly = true
  deps = [
    ":serial-ppp-bind_test",
    ":serial-ppp-driver-test",
  ]
}
