# 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")
      }
    }

    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",
  ]
}
