# Copyright 2018 The Chromium 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("//topaz/runtime/chromium/chromium.gni")

if (enable_chromium) {
  package("web_runner_prototype") {
    deprecated_system_image = true
    # Empty
  }

  package("web_runner_tests") {
    deprecated_system_image = true
    # Empty
  }
} else {
  source_set("lib") {
    sources = [
      "component_controller.cc",
      "component_controller.h",
      "runner.cc",
      "runner.h",
    ]

    public_deps = [
      "//garnet/public/fidl/fuchsia.sys",
      "//garnet/public/fidl/fuchsia.ui.app",
      "//garnet/public/fidl/fuchsia.ui.viewsv1",
      "//garnet/public/lib/component/cpp",
      "//topaz/runtime/web_runner/services",
    ]
  }

  executable("bin") {
    output_name = "web_runner_prototype"

    sources = [
      "main.cc",
    ]

    deps = [
      ":lib",
      "//zircon/public/lib/async-loop-cpp",
    ]
  }

  executable("web_runner_unittests") {
    testonly = true

    sources = [
      "runner_unittest.cc",
    ]

    deps = [
      ":lib",
      "//garnet/public/lib/component/cpp/testing",
      "//third_party/googletest:gtest_main",
    ]
  }

  package("web_runner_prototype") {
    deprecated_bare_package_url = "//build"

    deps = [
      ":bin",
    ]

    binaries = [
      {
        name = "web_runner_prototype"
      },
    ]

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

  package("web_runner_tests") {
    testonly = true

    deps = [
      ":web_runner_unittests",
    ]

    tests = [
      {
        name = "web_runner_unittests"
      },
    ]
  }
}
