# Copyright 2016 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("//media/media_options.gni")
import("//testing/test.gni")
import("//third_party/protobuf/proto_library.gni")

proto_library("media_remoting_proto") {
  proto_out_dir = "media/remoting"
  sources = [
    "rpc.proto",
  ]
}

# This target is separate from "remoting" because this code is shared by the
# receiver implementation (currently outside of the Chromium project).
source_set("rpc") {
  sources = [
    "proto_enum_utils.cc",
    "proto_enum_utils.h",
    "proto_utils.cc",
    "proto_utils.h",
    "rpc_broker.cc",
    "rpc_broker.h",
  ]

  deps = [
    "//base",
    "//media",
  ]

  public_deps = [
    ":media_remoting_proto",
  ]
}

source_set("remoting") {
  sources = [
    "courier_renderer_factory.cc",
    "courier_renderer_factory.h",
    "metrics.cc",
    "metrics.h",
    "remoting_cdm.cc",
    "remoting_cdm.h",
    "remoting_cdm_context.cc",
    "remoting_cdm_context.h",
    "remoting_cdm_controller.cc",
    "remoting_cdm_controller.h",
    "remoting_cdm_factory.cc",
    "remoting_cdm_factory.h",
    "renderer_controller.cc",
    "renderer_controller.h",
    "shared_session.cc",
    "shared_session.h",
    "sink_availability_observer.cc",
    "sink_availability_observer.h",
  ]

  deps = [
    "//base",
    "//media",
    "//media/mojo/interfaces:remoting",
    "//mojo/public/cpp/bindings",
    "//ui/gfx",
    "//url",
  ]

  if (enable_media_remoting_rpc) {
    sources += [
      "courier_renderer.cc",
      "courier_renderer.h",
      "demuxer_stream_adapter.cc",
      "demuxer_stream_adapter.h",
      "triggers.h",
    ]

    deps += [ ":rpc" ]
  }
}

source_set("media_remoting_tests") {
  testonly = true
  sources = [
    "fake_remoter.cc",
    "fake_remoter.h",
    "renderer_controller_unittest.cc",
  ]

  deps = [
    ":remoting",
    "//base",
    "//base/test:test_support",
    "//media:test_support",
    "//media/mojo/interfaces:remoting",
    "//testing/gmock",
    "//testing/gtest",
    "//url",
  ]

  if (!is_android) {
    sources += [
      "courier_renderer_unittest.cc",
      "demuxer_stream_adapter_unittest.cc",
      "end2end_test_renderer.cc",
      "end2end_test_renderer.h",
      "fake_media_resource.cc",
      "fake_media_resource.h",
      "integration_test.cc",
      "proto_utils_unittest.cc",
      "receiver.cc",
      "receiver.h",
      "rpc_broker_unittest.cc",
      "stream_provider.cc",
      "stream_provider.h",
    ]

    deps += [
      ":rpc",
      "//media/test:pipeline_integration_test_base",
      "//ui/gfx:test_support",
      "//ui/gfx/geometry",
    ]
  }
}

test("media_remoting_unittests") {
  deps = [
    ":media_remoting_tests",
    "//media/test:run_all_unittests",
  ]
}
