# Copyright 2015 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/features.gni")
import("//build/config/sanitizers/sanitizers.gni")
import("//build/config/ui.gni")
import("//chromecast/build/tests/cast_test.gni")
import("//chromecast/chromecast.gni")
import("//media/media_options.gni")
import("//tools/grit/repack.gni")
import("//ui/ozone/ozone.gni")
import("//v8/gni/v8.gni")

if (is_android) {
  import("//build/config/android/rules.gni")
}

config("playready_config") {
  if (use_playready) {
    defines = [ "PLAYREADY_CDM_AVAILABLE" ]
  }
}

# A list of all public test() binaries. This is an organizational target that
# cannot be depended upon or built directly. Build cast_group_test_list instead.
cast_test_group("cast_tests") {
  filters = []
  tests = [
    "//base:base_unittests",
    "//chromecast/base:cast_base_unittests",
    "//chromecast/base/component:cast_component_unittests",
    "//chromecast/crypto:cast_crypto_unittests",
    "//chromecast/media:cast_media_unittests",
    "//chromecast/net:cast_net_unittests",
    "//chromecast/system/reboot:cast_reboot_unittests",
    "//content/test:content_unittests",
    "//crypto:crypto_unittests",
    "//media:media_unittests",
    "//media/midi:midi_unittests",
    "//net:net_unittests",
    "//sandbox/linux:sandbox_linux_unittests",
    "//sql:sql_unittests",
    "//storage:storage_unittests",
    "//third_party/cacheinvalidation:cacheinvalidation_unittests",
    "//ui/base:ui_base_unittests",
  ]

  if (!is_cast_audio_only) {
    tests += [ "//gpu:gpu_unittests" ]

    if (use_aura) {
      tests += [ "//chromecast/graphics:cast_graphics_unittests" ]
    }
  }

  if (is_linux) {
    tests += [ "//chromecast/crash:cast_crash_unittests" ]
  }

  if (!is_android && use_alsa) {
    tests += [
      "//chromecast/media/cma/backend/alsa:cast_alsa_cma_backend_unittests",
      "//chromecast/media/cma/backend/alsa:libcast_governor_unittests",
      "//chromecast/media/cma/backend/alsa:slew_volume_unittests",
    ]
  }

  if (!is_android) {
    tests += [
      ":cast_shell_browsertests",
      ":cast_shell_unittests",
      "//ipc:ipc_tests",
      "//jingle:jingle_unittests",
      "//url:url_unittests",
    ]

    cast_media_unittests_filter = {
      test_name = "cast_media_unittests"

      # --test-launcher-jobs=1 => so internal code can bind to port
      args = [ "--test-launcher-jobs=1" ]
    }
    filters += [ cast_media_unittests_filter ]

    cast_shell_browsertests_filter = {
      test_name = "cast_shell_browsertests"

      # --enable-local-file-accesses => to load sample media files
      # --test-launcher-jobs=1 => so internal code can bind to port
      args = [
        "--no-sandbox",
        "--enable-local-file-accesses",
        "--test-launcher-jobs=1",
      ]
      if (is_cast_audio_only) {
        args += [ "--ozone-platform=headless" ]
      } else {
        args += [ "--ozone-platform=cast" ]
      }
      if (!is_cast_desktop_build) {
        args += [ "--use-gpu-in-tests" ]

        # TODO(derekjchow): Make these tests pass on Chromecast devices.
        #    Once all of the CastMediaBlockerTest.* have been un-DISABLEd and
        #    are running successfully, revisit these tests and see if they pass
        #    on devices. (crbug/665118, internal b/32023194)
        gtest_excludes = [
          "CastMediaBlockerBrowserTest.Video_BlockUnblock",
          "CastMediaBlockerBrowserTest.Audio_BlockUnblock",
        ]

        # TODO(mbjorge): The ReusedRenderer test is failing on v1 and cast audio
        # devices. Temporarily disable them as part of an effort_to re-green
        # the unittests. Current failures (2017-03-15) are being disabled to get
        # back to a green state. Re-enable once the tests have been fixed.
        # Limitations in the build mean this unfortunately is getting disabled
        # across all devices, even though it is only failing on some.
        # b/36238710, b/36239051, hotlist/461351
        gtest_excludes += [ "RendererPrelauncherTest.ReusedRenderer" ]
      }

      if (!is_cast_desktop_build && !is_cast_audio_only && !enable_assistant) {
        # TODO(mbjorge): The VideoPlaybackMp4 test is failing on v1 devices.
        # Temporarily disable it as part of an effort to re-green the unittests.
        # Re-enable once the tests have been fixed. Limitations in the filter
        # system mean this is getting temporarily disabled on all video devices,
        # though it is only failing on v1.
        # b/36723698, hotlist/461351
        gtest_excludes += [ "CastNavigationBrowserTest.VideoPlaybackMp4" ]
      }

      # TODO(mbjorge): Temporarily disable AudioPlaybackWavPcm because it is
      # failing on device. As part of an effort to re-green the unittests,
      # current (2017-03-15) failures are being disabled to get back to a
      # green state. Re-enable once the tests have been fixed.
      # b/36239152, hotlist/461351
      if (enable_assistant && !is_cast_desktop_build) {
        gtest_excludes += [ "CastNavigationBrowserTest.AudioPlaybackWavPcm" ]
      }
    }
    filters += [ cast_shell_browsertests_filter ]

    ipc_tests_filter = {
      test_name = "ipc_tests"

      # --test-launcher-jobs=1 => so internal code can bind to port
      args = [ "--test-launcher-jobs=1" ]
    }
    filters += [ ipc_tests_filter ]

    url_unittests_filter = {
      test_name = "url_unittests"

      if (target_os == "linux" && !is_cast_desktop_build) {
        # DoAppendUTF8Invalid fails because of dcheck_always_on flag in Eng builds
        gtest_excludes = [ "URLCanonTest.DoAppendUTF8Invalid" ]
      }
    }
    filters += [ url_unittests_filter ]
  }

  base_unittests_filter = {
    test_name = "base_unittests"
    if (target_os == "linux" && !is_cast_desktop_build) {
      # Disable ProcessMetricsTest.GetNumberOfThreads (b/15610509)
      # Disable ProcessUtilTest.* (need to define OS_ANDROID)
      # Disable StackContainer.BufferAlignment (don't support 16-byte alignment)
      # Disable SystemMetrics2Test.GetSystemMemoryInfo (buffers>0 can't be guaranteed)
      # Disable TimeFormattingTest.TimeFormat* for flakiness on devices (crbug/671429)
      gtest_excludes = [
        "ProcessMetricsTest.GetNumberOfThreads",
        "ProcessUtilTest.*",
        "StackContainer.BufferAlignment",
        "SystemMetrics2Test.GetSystemMemoryInfo",
        "TimeFormattingTest.TimeFormat*",
      ]

      if (is_cast_audio_only) {
        # Also disable TimeFormattingTest on audio-only builds, since we don't
        # include the necessary info in icudtl.dat.
        gtest_excludes += [ "TimeFormattingTest.*" ]
      }
    }
  }
  filters += [ base_unittests_filter ]

  content_unittests_filter = {
    test_name = "content_unittests"

    # IsSupportedVideoConfig_VP9TransferFunctions fails on all cast builds since
    # the cast IsSupporedVideoConfigs ignore the transfer function parameter.
    # (b/36984215).
    gtest_excludes = [ "*.IsSupportedVideoConfig_VP9TransferFunctions" ]
    if (target_os == "linux" && !is_cast_desktop_build) {
      # DesktopCaptureDeviceTest.*: No capture device on Eureka
      # Disable PepperGamepadHostTest.WaitForReply (pepper not supported on Eureka)
      # Disable GpuDataManagerImplPrivateTest.SetGLStrings and
      # RenderWidgetHostTest.Background because we disable the blacklist to enable WebGL (b/16142554)
      gtest_excludes += [
        "DOMStorageDatabaseTest.TestCanOpenAndReadWebCoreDatabase",
        "DesktopCaptureDeviceTest.Capture",
        "GamepadProviderTest.PollingAccess",
        "GpuDataManagerImplPrivateTest.SetGLStrings",
        "PepperGamepadHostTest.WaitForReply",
        "RenderWidgetHostTest.Background",
      ]
    }
    if (is_cast_audio_only) {
      # No way to display URL's on audio only cast devices.
      gtest_excludes += [ "NavigationEntryTest.NavigationEntryURLs" ]
    }
  }
  filters += [ content_unittests_filter ]

  media_unittests_filter = {
    test_name = "media_unittests"
    if (target_os == "linux" && !is_cast_desktop_build) {
      # Disable VP9 related tests (b/18593324)
      #   PipelineIntegrationTest.BasicPlayback_MediaSource_VP9_WebM
      #   PipelineIntegrationTest.BasicPlayback_VideoOnly_VP9_WebM
      #   PipelineIntegrationTest.BasicPlayback_VP9*
      #   PipelineIntegrationTest.P444_VP9_WebM
      # Disable VP8A tests (b/18593324)
      #   PipelineIntegrationTest.BasicPlayback_VP8A*
      # Disable OpusAudioDecoderTest/AudioDecoderTest.ProduceAudioSamples/0 (unit
      # test fails when Opus decoder uses fixed-point)
      # Due to b/16456550, disable the following four test cases:
      #   AudioOutputControllerTest.PlayDivertSwitchDeviceRevertClose
      #   AudioOutputControllerTest.PlaySwitchDeviceClose
      #   AudioStreamHandlerTest.Play
      #   SoundsManagerTest.Play
      # Disable AudioStreamHandlerTest.ConsecutivePlayRequests (b/16539293)
      gtest_excludes = [
        "AudioOutputControllerTest.PlayDivertSwitchDeviceRevertClose",
        "AudioOutputControllerTest.PlaySwitchDeviceClose",
        "AudioStreamHandlerTest.Play",
        "AudioStreamHandlerTest.ConsecutivePlayRequests",
        "PipelineIntegrationTest.BasicPlayback_MediaSource_VP9_WebM",
        "PipelineIntegrationTest.BasicPlayback_VideoOnly_VP9_WebM",
        "PipelineIntegrationTest.BasicPlayback_VP9*",
        "PipelineIntegrationTest.P444_VP9_WebM",
        "PipelineIntegrationTest.BasicPlayback_VP8A*",
        "OpusAudioDecoderTest/AudioDecoderTest.ProduceAudioSamples/0",
        "SoundsManagerTest.Play",
      ]
    } else if (target_os == "android" || is_cast_desktop_build) {
      # Disable PipelineIntegrationTest.BasicPlayback_MediaSource_VP9_WebM (not supported)
      gtest_excludes =
          [ "PipelineIntegrationTest.BasicPlayback_MediaSource_VP9_WebM" ]
    }
  }
  filters += [ media_unittests_filter ]

  net_unittests_filter = {
    test_name = "net_unittests"
    if (using_sanitizer) {
      # TODO(mbjorge): net_unittests do not complete when run with sanitizers,
      # (in particular, TSAN and UBSAN), resulting in build machines getting stuck
      # for many hours. Disable them for now, since these are getting run on
      # Chromium bots anyway. (internal b/31279943)
      gtest_excludes = [ "*" ]
    } else if (target_os == "linux" && !is_cast_desktop_build) {
      # Run net_unittests first to avoid random failures due to slow python startup
      # URLRequestTestHTTP.GetTest_ManyCookies takes roughly 55s to run. Increase
      # timeout to 90s from 45s to allow it to pass (b/19821476)
      # ProxyScriptFetcherImplTest.HttpMimeType is flaking (b/19848784)
      # Running a batch of net_unittests has high overhead. Run tests in batches of 50 to reduce number of batches (b/23156294).
      gtest_excludes = [ "ProxyScriptFetcherImplTest.HttpMimeType" ]
      args = [
        "--test-launcher-timeout=90000",
        "--test-launcher-batch-limit=50",
      ]
    } else if (is_cast_desktop_build || target_os == "android") {
      # URLRequestTestHTTP.GetTest_ManyCookies takes roughly 55s to run. Increase
      # timeout to 90s from 45s to allow it to pass (b/19821476) (b/29415636).
      # CTLogVerifierTest.VerifiesValidConsistencyProofsFromReferenceGenerator
      # times out occasionally, paricularly on the CQ bots; disable to reduce
      # CQ flakiness (crbug/598406) (b/29415636).
      # Running a batch of net_unittests has high overhead, so
      # run tests in batches of 25 to reduce number of batches (b/23156294).
      gtest_excludes = [ "CTLogVerifierTest.VerifiesValidConsistencyProofsFromReferenceGenerator" ]
      args = [
        "--test-launcher-timeout=90000",
        "--test-launcher-batch-limit=25",
      ]
    }
  }
  filters += [ net_unittests_filter ]
}

# Creates the build and run lists for all test targets.
cast_test_group_list("cast_test_lists") {
  build_list_path = "$root_out_dir/tests/build_test_list.txt"
  runtime_deps_path = "$root_out_dir/tests/runtime_deps.json"
  run_list_path = "$root_out_dir/tests/run_test_list.txt"

  additional_options = [ "--ozone-platform=headless --test-launcher-bot-mode" ]

  build_tests = true

  test_groups = [ ":cast_tests" ]

  if (chromecast_branding != "public") {
    test_groups += [ "//chromecast/internal:internal_cast_tests" ]
  }
}

if (is_android) {
  cast_test_group("cast_junit_tests") {
    test_type = "junit"
    tests = [
      "//base:base_junit_tests",
      "//content/public/android:content_junit_tests",
      "//net/android:net_junit_tests",
      "//testing/android/junit:junit_unit_tests",
      "//ui/android:ui_junit_tests",
    ]
  }

  cast_test_group_list("cast_junit_test_lists") {
    test_type = "junit"
    build_list_path = "$root_out_dir/junit/build_junit_test_list.txt"
    runtime_deps_path = "$root_out_dir/junit/runtime_deps.json"
    run_list_path = "$root_out_dir/junit/run_junit_test_list.txt"
    build_tests = true
    test_groups = [ ":cast_junit_tests" ]
    if (chromecast_branding != "public") {
      test_groups += [ "//chromecast/internal:internal_cast_junit_tests" ]
    }
  }
}

test("cast_shell_unittests") {
  deps = [
    ":cast_shell_lib",
    "//chromecast/app:test_support",
    "//chromecast/app:unittests",
    "//chromecast/browser:unittests",
    "//ui/gl:test_support",
  ]
}

test("cast_shell_browsertests") {
  deps = [
    ":cast_shell_lib",
    "//chromecast/app:test_support",
    "//chromecast/browser:browsertests",
  ]

  data_deps = [
    ":chromecast_locales_pak",
  ]
}

group("cast_shell_lib") {
  data_deps = [
    ":cast_shell_pak",
  ]

  deps = [
    "//chromecast/app",
    "//chromecast/browser",
    "//chromecast/common",
    "//chromecast/renderer",
  ]

  if (chromecast_branding != "public") {
    deps += [ "//chromecast/internal/shell" ]
  }
}

executable("cast_shell") {
  sources = [
    "app/cast_main.cc",
  ]

  deps = [
    ":cast_shell_lib",
    ":chromecast_locales_pak",
    "//build/config:exe_and_shlib_deps",
    "//chromecast/app",
    "//content/public/app:both",
  ]
}

repack("cast_shell_pak") {
  sources = [
    "$root_gen_dir/blink/public/resources/blink_image_resources_100_percent.pak",
    "$root_gen_dir/blink/public/resources/blink_resources.pak",
    "$root_gen_dir/chromecast/app/shell_resources.pak",
    "$root_gen_dir/chromecast/browser/cast_browser_resources.pak",
    "$root_gen_dir/content/app/resources/content_resources_100_percent.pak",
    "$root_gen_dir/content/app/strings/content_strings_en-US.pak",
    "$root_gen_dir/content/content_resources.pak",
    "$root_gen_dir/net/net_resources.pak",
    "$root_gen_dir/ui/resources/ui_resources_100_percent.pak",
    "$root_gen_dir/ui/resources/webui_resources.pak",
    "$root_gen_dir/ui/strings/app_locale_settings_en-US.pak",
    "$root_gen_dir/ui/strings/ui_strings_en-US.pak",
  ]

  output = "$root_out_dir/assets/cast_shell.pak"

  deps = [
    "//chromecast/app:resources",
    "//chromecast/browser:resources",
    "//content:resources",
    "//content/app/resources",
    "//content/app/strings",
    "//net:net_resources",
    "//third_party/WebKit/public:image_resources_grit",
    "//third_party/WebKit/public:resources",
    "//ui/resources",
    "//ui/strings",
  ]

  if (chromecast_branding != "public") {
    sources += [ "$root_gen_dir/chromecast/internal/cast_shell_internal.pak" ]

    deps += [ "//chromecast/internal:cast_shell_internal_pak" ]
  }
}

# Intermediate targets that repack grit resources by locale. For each locale
# in |cast_locales| (see //chromecast/chromecast.gni), all resources
# are packed into a single .pak file in an output directory. These targets
# should not be depended on directly; depend on ":chromecast_locales_pak"
# instead.
foreach(locale, cast_locales) {
  repack("_cast_repack_${locale}") {
    visibility = [ ":chromecast_locales_pak" ]
    output = "$root_out_dir/chromecast_locales/${locale}.pak"
    sources = [
      "$root_gen_dir/chromecast/app/chromecast_settings_${locale}.pak",
    ]
    deps = [
      "//chromecast/app:chromecast_settings",
    ]

    if (chromecast_branding != "public") {
      sources += [ "$root_gen_dir/chromecast/internal/webui/app_strings_${locale}.pak" ]
      deps += [ "//chromecast/internal/webui:chromecast_app_strings" ]

      if (enable_chromecast_webui) {
        sources += [ "$root_gen_dir/chromecast/internal/webui/webui_localized_${locale}.pak" ]
        deps += [ "//chromecast/internal/webui:chromecast_webui_localized" ]
      }
    }
  }
}

# A meta-target which repacks resources by locale.
group("chromecast_locales_pak") {
  deps = []
  foreach(locale, cast_locales) {
    deps += [ ":_cast_repack_${locale}" ]
  }
}

buildflag_header("chromecast_features") {
  header = "chromecast_features.h"
  flags = [
    "IS_CAST_AUDIO_ONLY=$is_cast_audio_only",
    "IS_CAST_USING_CMA_BACKEND=$is_cast_using_cma_backend",
  ]
}

if (is_android) {
  android_assets("cast_shell_apk_assets") {
    assert(v8_use_external_startup_data)

    sources = [
      "$root_out_dir/assets/cast_shell.pak",
    ]

    deps = [
      ":cast_shell_pak",
      "//third_party/icu:icu_assets",
      "//v8:v8_external_startup_data_assets",
    ]
    disable_compression = true
  }

  android_apk("cast_shell_apk") {
    apk_name = "CastShell"
    android_manifest = "$root_gen_dir/cast_shell_manifest/AndroidManifest.xml"
    android_manifest_dep = "//chromecast/browser/android:cast_shell_manifest"

    shared_libraries = [ "//chromecast/android:libcast_shell_android" ]

    deps = [
      ":cast_shell_apk_assets",
      "//base:base_java",
      "//chromecast/android:libcast_shell_android",
      "//chromecast/browser/android:cast_shell_java",
    ]
  }
}
