# 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/config.gni")
import("//build/go/go_library.gni")
import("//build/go/go_test.gni")
import("//build/go/toolchain.gni")
import("//build/host.gni")
import("//build/images/manifest.gni")
import("//build/package.gni")
import("//build/package/component.gni")
import("//build/testing/environments.gni")
import("//third_party/cobalt_config/metrics_registry.gni")

go_library("metrics_lib") {
  name = "metrics"
  source_dir = "metrics"
  deps = [
    "//garnet/public/lib/component/go/src/app",
    "//garnet/public/lib/syslog/go/src/syslog",
    "//zircon/public/fidl/fuchsia-cobalt($go_toolchain)",
    "//zircon/public/fidl/fuchsia-mem($go_toolchain)",
  ]
}

go_library("lib") {
  name = "amber"
  deps = [
    "//garnet/go/src/merkle",
    "//garnet/go/src/sse",
    "//garnet/public/go/third_party:github.com/flynn/go-tuf",
    "//garnet/public/go/third_party:github.com/rjw57/oauth2device",
    "//garnet/public/go/third_party:golang.org/x/oauth2",
    "//garnet/public/lib/component/go/src/app",
    "//garnet/public/lib/syslog/go/src/syslog",
    "//sdk/fidl/fuchsia.amber($go_toolchain)",
    "//sdk/fidl/fuchsia.pkg($go_toolchain)",
    "//sdk/fidl/fuchsia.sys($go_toolchain)",
    "//zircon/public/fidl/fuchsia-cobalt($go_toolchain)",
    "//zircon/public/fidl/fuchsia-mem($go_toolchain)",
  ]
}

metrics_registry("cobalt_sw_delivery_registry") {
  project_id = 108
  use_target_name = true
}

# Include install-disk-image in the build, which comes from Zircon
generate_manifest("install-disk-image.manifest") {
  visibility = [ ":*" ]
  args = []
  foreach(pattern, [ "bin/install-disk-image" ]) {
    args += [ "--binary=" + pattern ]
  }
}
manifest_outputs = get_target_outputs(":install-disk-image.manifest")
manifest_file = manifest_outputs[0]

package("pkgfs") {
  deps = [
    "//garnet/go/src/grand_unified_binary",
  ]

  binaries = [
    {
      name = "pkgsvr"
      source = "grand_unified_binary"
    },
  ]

  meta = [
    {
      path = rebase_path("//garnet/go/src/pmd/meta/pkgsvr.cmx")
      dest = "pkgsvr.cmx"
    },
  ]
}

# FIXME: Until fuchsia_component exists again, ensure this and //garnet/tests/amberctl:amberctl-tests stay in sync
package("amber") {
  deprecated_misc_storage = "//build"

  extra = [ manifest_file ]

  deps = [
    ":cobalt_sw_delivery_registry",
    ":install-disk-image.manifest",
    "//garnet/go/src/grand_unified_binary",
  ]

  binaries = [
    {
      name = "grand_unified_binary"
      dest = "system_updater"
    },
    {
      name = "grand_unified_binary"
      dest = "amber"
    },
  ]

  meta = [
    {
      path = rebase_path("meta/amber.cmx")
      dest = "amber.cmx"
    },
    {
      path = rebase_path(
              "//garnet/go/src/amber/system_updater/meta/system_updater.cmx")
      dest = "system_updater.cmx"
    },
  ]

  resources = [
    {
      path = rebase_path("keys/root_sig.json")
      dest = "keys"
    },
    {
      path = rebase_path(
              get_label_info(":cobalt_sw_delivery_registry", "target_gen_dir") +
              "/cobalt_sw_delivery_registry.pb")
      dest = "cobalt_config.pb"
    },
    {
      path = rebase_path("system_updater/images")
      dest = "images"
    },
  ]
}

# FIXME: Until fuchsia_component exists again, ensure this and //garnet/tests/amberctl:amberctl-tests stay in sync
package("amber_tools") {
  deps = [
    "//garnet/go/src/grand_unified_binary",
  ]

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

  binaries = [
    # TODO(raggi): remove the underscore version of the command name once all
    # docs and scripts have been updated.
    # See https://fuchsia-review.googlesource.com/c/fuchsia/+/255274.
    {
      name = "amber_ctl"
      source = "grand_unified_binary"
      shell = true
    },
    {
      name = "amberctl"
      source = "grand_unified_binary"
      shell = true
    },
  ]
}

test_targets = [
  {
    name = "amber_daemon_test"
    gopkg = "amber/daemon"
  },
  {
    name = "amber_source_test"
    gopkg = "amber/source"
  },
  {
    name = "amber_urlscope_test"
    gopkg = "amber/urlscope"
  },
]
foreach(test, test_targets) {
  go_test(test.name) {
    gopackage = test.gopkg

    deps = [
      ":lib",
      "//garnet/go/src/pm:pm_lib",
      "//garnet/go/src/pmd",
      "//garnet/public/go/third_party:github.com/google/go-cmp",
    ]
  }
}

package("amber_tests") {
  testonly = true

  deps = []
  tests = []

  foreach(test, test_targets) {
    deps += [ ":${test.name}" ]
    tests += [
      {
        name = test.name
        environments = basic_envs
      },
    ]
  }
}

package("test_config") {
  deprecated_system_image = true
  package_name = "amber_test_config"
  testonly = true

  resources = [
    {
      dest = "amber/test_sources/test1/config.json"
      path = rebase_path("etc/sources/test1/config.json")
      environments = basic_envs
    },
    {
      dest = "amber/test_sources/test2/config.json"
      path = rebase_path("etc/sources/test2/config.json")
      environments = basic_envs
    },
  ]
}

config_data("config") {
  for_pkg = "sysmgr"
  outputs = [
    "amber.config",
  ]
  sources = [
    "startup.config",
  ]
}
