# 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/package.gni")
import("//build/rust/rustc_binary.gni")
import("//build/test/test_package.gni")
import("//build/testing/environments.gni")

rustc_binary("bin") {
  name = "battery-manager"
  with_unit_tests = true
  edition = "2018"

  deps = [
    "//garnet/lib/rust/fidl_fuchsia_power_ext",
    "//garnet/lib/rust/io_util",
    "//sdk/fidl/fuchsia.hardware.power:fuchsia.hardware.power-rustc",
    "//sdk/fidl/fuchsia.power:fuchsia.power-rustc",
    "//sdk/fidl/fuchsia.power:fuchsia.power.test-rustc",
    "//src/lib/fdio/rust:fdio",
    "//src/lib/fidl/rust/fidl",
    "//src/lib/fuchsia-async",
    "//src/lib/fuchsia-component",
    "//src/lib/storage/fuchsia-vfs-watcher",
    "//src/lib/syslog/rust:syslog",
    "//src/lib/zircon/rust:fuchsia-zircon",
    "//third_party/rust_crates:anyhow",
    "//third_party/rust_crates:futures",
    "//third_party/rust_crates:libc",
    "//third_party/rust_crates:log",
    "//third_party/rust_crates:parking_lot",
    "//third_party/rust_crates:thiserror",
  ]
}

package("battery-manager") {
  deps = [ ":bin" ]

  binary = "battery_manager"

  meta = [
    {
      path = rebase_path("meta/battery_manager.cmx")
      dest = "battery_manager.cmx"
    },
  ]
}

test_package("battery-manager-tests") {
  deps = [ ":bin_test" ]

  tests = [
    {
      name = "battery_manager_bin_test"
      environments = basic_envs
    },
  ]
}

group("tests") {
  testonly = true
  public_deps = [
    ":battery-manager-tests",
    "//src/power/battery-manager/tests:battery-manager-gotests",
  ]
}
