# Copyright 2014 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/buildflag_header.gni")
import("//build/config/chromecast_build.gni")
import("//media/media_options.gni")
import("//testing/test.gni")

buildflag_header("buildflags") {
  header = "buildflags.h"

  enable_mojo_renderer = false
  enable_mojo_cdm = false
  enable_mojo_audio_decoder = false
  enable_mojo_video_decoder = false
  enable_mojo_media_in_browser_process = false
  enable_mojo_media_in_gpu_process = false

  foreach(service, mojo_media_services) {
    if (service == "renderer") {
      enable_mojo_renderer = true
    } else if (service == "cdm") {
      enable_mojo_cdm = true
    } else if (service == "audio_decoder") {
      enable_mojo_audio_decoder = true
    } else if (service == "video_decoder") {
      enable_mojo_video_decoder = true
    } else {
      assert(false, "Invalid mojo media service: $service")
    }
  }

  if (mojo_media_host == "browser") {
    enable_mojo_media_in_browser_process = true
  } else if (mojo_media_host == "gpu") {
    enable_mojo_media_in_gpu_process = true
  } else if (mojo_media_host != "") {
    assert(false, "Invalid mojo media host: $mojo_media_host")
  }

  flags = [
    "ENABLE_CAST_RENDERER=$enable_cast_renderer",
    "ENABLE_MOJO_RENDERER=$enable_mojo_renderer",
    "ENABLE_MOJO_CDM=$enable_mojo_cdm",
    "ENABLE_MOJO_AUDIO_DECODER=$enable_mojo_audio_decoder",
    "ENABLE_MOJO_VIDEO_DECODER=$enable_mojo_video_decoder",
    "ENABLE_MOJO_MEDIA_IN_BROWSER_PROCESS=$enable_mojo_media_in_browser_process",
    "ENABLE_MOJO_MEDIA_IN_GPU_PROCESS=$enable_mojo_media_in_gpu_process",
  ]
}

source_set("test_support") {
  testonly = true
  public_deps = [
    "//media/mojo/clients",
    "//media/mojo/common",
    "//media/mojo/common:mojo_shared_buffer_video_frame",
    "//media/mojo/mojom",
    "//media/mojo/mojom:test_interfaces",
    "//media/mojo/services",
  ]
}

source_set("unit_tests") {
  testonly = true

  deps = [
    "//media/learning/mojo:unit_tests",
    "//media/mojo/clients:unit_tests",
    "//media/mojo/common:unit_tests",
    "//media/mojo/mojom:unit_tests",
    "//media/mojo/services:unit_tests",
    "//media/mojo/test:unit_tests",
  ]
}

test("media_mojo_unittests") {
  deps = [
    ":unit_tests",
    "//mojo/core/test:run_all_unittests",
  ]
}
