# Copyright 2016 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/test/test_package.gni")
import("//src/modular/build/executable_package.gni")
import("//third_party/flatbuffers/flatbuffer.gni")

declare_args() {
  # Whether basemgr should use a random identifier for sessions, leading to
  # a different persistent data location for every session.
  auto_login_to_guest = false
}

executable_package("basemgr") {
  meta = [
    {
      path = "meta/basemgr.cmx"
      dest = "basemgr.cmx"
    },
  ]

  sources = [
    "basemgr_impl.cc",
    "basemgr_impl.h",
    "main.cc",
  ]

  deps = [
    ":lib",
    "//garnet/public/lib/fostr/fidl/fuchsia.modular.session",
    "//garnet/public/lib/json",
    "//sdk/fidl/fuchsia.hardware.power.statecontrol",
    "//sdk/fidl/fuchsia.modular",
    "//sdk/fidl/fuchsia.modular.internal",
    "//sdk/fidl/fuchsia.modular.session",
    "//sdk/fidl/fuchsia.process.lifecycle",
    "//sdk/fidl/fuchsia.sys",
    "//sdk/fidl/fuchsia.ui.app",
    "//sdk/fidl/fuchsia.ui.lifecycle",
    "//sdk/fidl/fuchsia.ui.policy",
    "//sdk/fidl/fuchsia.ui.views",
    "//sdk/lib/sys/cpp",
    "//sdk/lib/syslog/cpp",
    "//sdk/lib/ui/scenic/cpp",
    "//src/lib/fsl",
    "//src/modular/bin/basemgr/cobalt",
    "//src/modular/lib/async/cpp:future",
    "//src/modular/lib/common:async_holder",
    "//src/modular/lib/common:teardown",
    "//src/modular/lib/fidl:app_client",
    "//src/modular/lib/fidl:clone",
    "//src/modular/lib/fidl:environment",
    "//src/modular/lib/lifecycle/cpp",
    "//src/modular/lib/modular_config",
    "//src/modular/lib/modular_config:modular_config_accessor",
    "//zircon/public/lib/fit",
    "//zircon/public/lib/zxtest",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/fidl-async:fidl-async-cpp",
    "//zircon/system/ulib/trace-provider:trace-provider-with-fdio",
  ]

  resources = [
    {
      path = rebase_path("//third_party/icu/common/icudtl.dat")
      dest = "icudtl.dat"
    },
  ]
}

test_package("basemgr_unittests") {
  deps = [
    ":basemgr_impl_unittest",
    ":session_context_impl_unittest",
  ]

  tests = [
    {
      name = "basemgr_impl_unittest"
    },
    {
      name = "session_context_impl_unittest"

      # This test exercises crash handling that logs an ERROR.
      log_settings = {
        max_severity = "ERROR"
      }
    },
  ]
}

source_set("lib") {
  sources = [
    "presentation_container.cc",
    "presentation_container.h",
    "session_context_impl.cc",
    "session_context_impl.h",
    "session_provider.cc",
    "session_provider.h",
    "sessions.cc",
    "sessions.h",
  ]

  deps = [
    "//sdk/fidl/fuchsia.hardware.power.statecontrol",
    "//src/lib/files",
    "//src/lib/fsl",
    "//src/modular/bin/basemgr/cobalt",
    "//src/modular/lib/common:async_holder",
    "//src/modular/lib/common:teardown",
    "//src/modular/lib/fidl:clone",
    "//src/modular/lib/modular_config",
    "//src/modular/lib/modular_config:modular_config_accessor",
    "//src/modular/lib/pseudo_dir:pseudo_dir_utils",
  ]

  public_deps = [
    "//sdk/fidl/fuchsia.modular",
    "//sdk/fidl/fuchsia.modular.internal",
    "//sdk/fidl/fuchsia.modular.session",
    "//sdk/fidl/fuchsia.sys",
    "//sdk/fidl/fuchsia.ui.input",
    "//sdk/fidl/fuchsia.ui.policy",
    "//sdk/fidl/fuchsia.ui.views",
    "//sdk/lib/sys/cpp",
    "//src/modular/lib/async/cpp:future",
    "//src/modular/lib/fidl:app_client",
    "//src/modular/lib/fidl:environment",
  ]

  # TODO(fxbug.dev/58160): delete the below and fix compiler warnings
  configs += [ "//build/config:Wno-reorder-init-list" ]

  if (auto_login_to_guest) {
    configs += [ ":auto_login_to_guest" ]
  }
}

executable("session_context_impl_unittest") {
  testonly = true

  sources = [ "session_context_impl_unittest.cc" ]

  deps = [
    ":lib",
    "//garnet/public/lib/gtest",
    "//sdk/lib/sys/cpp",
    "//sdk/lib/sys/cpp/testing:integration",
    "//sdk/lib/sys/cpp/testing:unit",
    "//sdk/lib/ui/scenic/cpp",
    "//src/lib/files",
    "//src/lib/fsl",
    "//src/lib/fxl/test:gtest_main",
    "//src/modular/lib/fidl:environment",
    "//src/modular/lib/modular_config",
    "//src/modular/lib/modular_config:modular_config_accessor",
  ]
}

executable("basemgr_impl_unittest") {
  testonly = true

  sources = [ "basemgr_impl_unittest.cc" ]

  deps = [
    ":basemgr",
    "//sdk/fidl/fuchsia.cobalt",
    "//sdk/fidl/fuchsia.devicesettings",
    "//sdk/fidl/fuchsia.identity.account",
    "//sdk/fidl/fuchsia.modular.session",
    "//sdk/fidl/fuchsia.process.lifecycle",
    "//sdk/fidl/fuchsia.settings",
    "//sdk/fidl/fuchsia.sys",
    "//sdk/fidl/fuchsia.testing.runner",
    "//sdk/fidl/fuchsia.ui.lifecycle",
    "//sdk/lib/sys/cpp/testing:integration",
    "//src/cobalt/bin/testing/mock_cobalt",
    "//src/lib/fxl/test:gtest_main",
    "//src/modular/lib/modular_config",
    "//src/modular/lib/modular_test_harness/cpp:test_harness_fixture",
    "//src/sys/appmgr:appmgr_for_test",
    "//src/ui/scenic/lib/scenic:scenic",
    "//third_party/googletest:gtest",
  ]
}

config("auto_login_to_guest") {
  defines = [ "AUTO_LOGIN_TO_GUEST" ]
}
