# Copyright 2018 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("//peridot/build/tests_package.gni")

tests_package("puppet_master_unittests") {
  deps = [
    ":dispatch_story_command_executor_unittest",
    ":puppet_master_impl_unittest",
    ":story_command_executor_unittest",
    "command_runners:add_mod_command_runner_unittest",
    "command_runners:focus_mod_command_runner_unittest",
    "command_runners:remove_mod_command_runner_unittest",
    "command_runners:set_focus_state_command_runner_unittest",
    "command_runners:set_kind_of_proto_story_option_command_runner_unittest",
    "command_runners:set_link_value_command_runner_unittest",
  ]
}

source_set("puppet_master_impl") {
  sources = [
    "puppet_master_impl.cc",
    "puppet_master_impl.h",
    "story_puppet_master_impl.cc",
    "story_puppet_master_impl.h",
  ]

  deps = [
    ":story_command_executor",
    "//garnet/public/lib/fxl",
  ]

  public_deps = [
    "//peridot/bin/sessionmgr/storage",
    "//peridot/public/fidl/fuchsia.modular",
    "//peridot/public/lib/async/cpp:operation",
  ]
}

executable("puppet_master_impl_unittest") {
  testonly = true

  sources = [
    "puppet_master_impl_unittest.cc",
  ]

  deps = [
    ":puppet_master_impl",
    ":story_command_executor",
    "//peridot/lib/testing:test_story_command_executor",
    "//peridot/lib/testing:test_with_session_storage",
    "//peridot/public/fidl/fuchsia.modular",
    "//third_party/googletest:gtest_main",
  ]
}

source_set("story_command_executor") {
  sources = [
    "story_command_executor.cc",
    "story_command_executor.h",
  ]

  public_deps = [
    "//garnet/public/lib/fxl",
    "//peridot/public/fidl/fuchsia.modular",
  ]
}

executable("story_command_executor_unittest") {
  testonly = true

  sources = [
    "story_command_executor_unittest.cc",
  ]

  deps = [
    ":story_command_executor",
    "//peridot/public/fidl/fuchsia.modular",
    "//third_party/googletest:gtest_main",
  ]
}

source_set("dispatch_story_command_executor") {
  sources = [
    "dispatch_story_command_executor.cc",
    "dispatch_story_command_executor.h",
  ]

  public_deps = [
    ":story_command_executor",
    "//peridot/bin/sessionmgr/puppet_master/command_runners:command_runner",
    "//peridot/public/fidl/fuchsia.modular",
    "//peridot/public/lib/async/cpp:future",
    "//peridot/public/lib/async/cpp:operation",
  ]
}

executable("dispatch_story_command_executor_unittest") {
  testonly = true

  sources = [
    "dispatch_story_command_executor_unittest.cc",
  ]

  deps = [
    ":dispatch_story_command_executor",
    "//peridot/lib/testing:test_with_ledger",
    "//peridot/public/fidl/fuchsia.modular",
    "//third_party/googletest:gtest_main",
  ]
}

source_set("make_production_impl") {
  sources = [
    "make_production_impl.cc",
    "make_production_impl.h",
  ]

  deps = [
    ":dispatch_story_command_executor",
    ":puppet_master_impl",
    "//peridot/lib/module_manifest:module_facet_reader",
    "//peridot/bin/sessionmgr/puppet_master/command_runners:add_mod_command_runner",
    "//peridot/bin/sessionmgr/puppet_master/command_runners:focus_mod_command_runner",
    "//peridot/bin/sessionmgr/puppet_master/command_runners:remove_mod_command_runner",
    "//peridot/bin/sessionmgr/puppet_master/command_runners:set_focus_state_command_runner",
    "//peridot/bin/sessionmgr/puppet_master/command_runners:set_kind_of_proto_story_option_command_runner",
    "//peridot/bin/sessionmgr/puppet_master/command_runners:set_link_value_command_runner",
  ]
}
