# 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("//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
  enable_mojo_media_in_utility_process = false

  if (!enable_mojo_media) {
    assert(mojo_media_services == [], "Mojo media is not enabled")
    assert(mojo_media_host == "none", "Mojo media is not enabled")
    assert(!enable_test_mojo_media_client, "Mojo media is not enabled")
  } else {
    assert(mojo_media_services != [], "No mojo media service specified")
    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")
      }
    }
    assert(
        enable_mojo_renderer || !enable_runtime_media_renderer_selection,
        "The mojo renderer must be enabled to use runtime media renderer selection.")

    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 == "utility") {
      enable_mojo_media_in_utility_process = true
    } else {
      assert(false, "Invalid mojo media host: $mojo_media_host")
    }
  }

  flags = [
    "ENABLE_MOJO_MEDIA=$enable_mojo_media",
    "ENABLE_TEST_MOJO_MEDIA_CLIENT=$enable_test_mojo_media_client",
    "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",
    "ENABLE_MOJO_MEDIA_IN_UTILITY_PROCESS=$enable_mojo_media_in_utility_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/interfaces",
    "//media/mojo/interfaces: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/interfaces: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",
  ]
}
