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

group("tests") {
  testonly = true
  deps = [
    ":mediaplayer_test_util",
    ":mediaplayer_tests",
  ]
}

package("mediaplayer") {
  deps = [ ":mediaplayer_bin" ]

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

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

executable("mediaplayer_bin") {
  output_name = "mediaplayer"

  sources = [
    "audio_consumer_impl.cc",
    "audio_consumer_impl.h",
    "main.cc",
    "player_impl.cc",
    "player_impl.h",
    "source_impl.cc",
    "source_impl.h",
  ]

  deps = [
    "//sdk/fidl/fuchsia.media",
    "//sdk/fidl/fuchsia.media.playback",
    "//sdk/fidl/fuchsia.ui.views",
    "//sdk/lib/media/cpp",
    "//sdk/lib/syslog/cpp",
    "//src/lib/fsl",
    "//src/lib/ui/base_view",
    "//src/media/playback/mediaplayer/core",
    "//src/media/playback/mediaplayer/demux",
    "//src/media/playback/mediaplayer/fidl",
    "//src/media/playback/mediaplayer/graph",
    "//src/media/playback/mediaplayer/graph_create",
    "//src/media/playback/mediaplayer/process",
    "//src/media/playback/mediaplayer/render",
    "//src/media/playback/mediaplayer/util",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/fs",
    "//zircon/system/ulib/trace-provider:trace-provider-with-fdio",
    "//zircon/third_party/uapp/dash:output_h",
  ]

  # TODO(fxb/58162): delete the below and fix compiler warnings
  configs += [ "//build/config:Wno-conversion" ]
}

executable("mediaplayer_test_util_bin") {
  output_name = "mediaplayer_test_util"

  sources = [
    "test/command_queue.cc",
    "test/command_queue.h",
    "test/mediaplayer_test_util_params.cc",
    "test/mediaplayer_test_util_params.h",
    "test/mediaplayer_test_util_view.cc",
    "test/mediaplayer_test_util_view.h",
    "test/test_util_main.cc",
  ]

  deps = [
    "//sdk/fidl/fuchsia.media.playback",
    "//sdk/fidl/fuchsia.ui.views",
    "//sdk/lib/syslog/cpp",
    "//sdk/lib/ui/scenic/cpp",
    "//src/lib/fsl",
    "//src/lib/fxl",
    "//src/lib/ui/base_view",
    "//src/media/playback/mediaplayer/graph",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/hid",
  ]

  # TODO(fxb/58162): delete the below and fix compiler warnings
  configs += [ "//build/config:Wno-conversion" ]
}

package("mediaplayer_test_util") {
  binaries = [
    {
      name = "mediaplayer_test_util"
    },
  ]

  testonly = true

  deps = [ ":mediaplayer_test_util_bin" ]

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

executable("mediaplayer_tests_bin") {
  output_name = "mediaplayer_tests"

  testonly = true

  sources = [
    "test/audio_consumer_tests.cc",
    "test/command_queue.cc",
    "test/command_queue.h",
    "test/fakes/fake_audio.h",
    "test/fakes/fake_audio_renderer.cc",
    "test/fakes/fake_audio_renderer.h",
    "test/fakes/fake_image_pipe.cc",
    "test/fakes/fake_image_pipe.h",
    "test/fakes/fake_scenic.cc",
    "test/fakes/fake_scenic.h",
    "test/fakes/fake_session.cc",
    "test/fakes/fake_session.h",
    "test/fakes/fake_sysmem.cc",
    "test/fakes/fake_sysmem.h",
    "test/fakes/fake_wav_reader.cc",
    "test/fakes/fake_wav_reader.h",
    "test/fakes/formatting.cc",
    "test/fakes/formatting.h",
    "test/fakes/packet_info.cc",
    "test/fakes/packet_info.h",
    "test/mediaplayer_tests.cc",
    "test/sink_feeder.cc",
    "test/sink_feeder.h",
  ]

  deps = [
    ":mediaplayer_bin",
    "//garnet/public/lib/gtest",
    "//sdk/fidl/fuchsia.media.playback",
    "//sdk/fidl/fuchsia.sys",
    "//sdk/fidl/fuchsia.ui.scenic",
    "//sdk/fidl/fuchsia.ui.views",
    "//sdk/lib/sys/cpp/testing:integration",
    "//sdk/lib/syslog/cpp",
    "//sdk/lib/ui/scenic/cpp",
    "//src/lib/fsl",
    "//src/lib/fxl/test:gtest_main",
    "//src/lib/ui/base_view",
    "//src/media/playback/mediaplayer/graph",
    "//zircon/public/lib/zx",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/hid",
  ]
}

test_package("mediaplayer_tests") {
  deps = [
    ":mediaplayer_tests_bin",
    "//src/media/playback/mediaplayer/core:tests",
    "//src/media/playback/mediaplayer/demux:tests",
    "//src/media/playback/mediaplayer/ffmpeg:tests",
    "//src/media/playback/mediaplayer/fidl:tests",
    "//src/media/playback/mediaplayer/graph:tests",
    "//src/media/playback/mediaplayer/util:tests",
  ]

  tests = [
    {
      name = "mediaplayer_tests"
    },

    {
      name = "mediaplayer_core_tests"
    },

    {
      name = "mediaplayer_demux_tests"
    },

    {
      name = "mediaplayer_ffmpeg_tests"
    },

    {
      name = "mediaplayer_fidl_tests"
    },

    {
      name = "mediaplayer_graph_tests"
    },

    {
      name = "mediaplayer_util_tests"
    },
  ]

  resources = [
    {
      path = rebase_path(
              "//garnet/test_data/media/third_party/chromium_media_test_data/bear-1280x720.mp4")
      dest = "media_test_data/bear.mp4"
    },
    {
      path = rebase_path(
              "//garnet/test_data/media/third_party/chromium_media_test_data/sfx-opus-441.webm")
      dest = "media_test_data/sfx-opus-441.webm"
    },
  ]

  # TODO(fxbug.dev/58495): Fix the leaks and remove this.
  deps += [ "//build/config/sanitizers:suppress-lsan.DO-NOT-USE-THIS" ]
}

config_data("player_config") {
  for_pkg = "sysmgr"
  outputs = [ "mediaplayer.config" ]
  sources = [ rebase_path("config/player.config") ]
}

config_data("audio_consumer_config") {
  for_pkg = "sysmgr"
  outputs = [ "audio_consumer.config" ]
  sources = [ rebase_path("config/audio_consumer.config") ]
}
