chromium/media/test/BUILD.gn

# Copyright 2014 The Chromium Authors
# 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/libfuzzer/fuzzer_test.gni")

if (is_ios) {
  import("//build/config/ios/bundle_data_from_filelist.gni")
}

source_set("run_all_unittests") {
  testonly = true
  sources = [ "run_all_unittests.cc" ]
  configs += [ "//media:media_config" ]
  deps = [
    "//base",
    "//base/test:test_support",
    "//media:test_support",
    "//mojo/core/embedder",
  ]

  if (is_android) {
    deps += [ "//ui/gl" ]
  }
}

source_set("pipeline_integration_test_base") {
  testonly = true

  if (media_use_ffmpeg) {
    sources = [
      "fake_encrypted_media.cc",
      "fake_encrypted_media.h",
      "pipeline_integration_test_base.cc",
      "pipeline_integration_test_base.h",
      "test_media_source.cc",
      "test_media_source.h",
    ]

    configs += [ "//media:media_config" ]

    deps = [
      "//base",
      "//base/test:test_support",
      "//media:media_buildflags",
      "//media:test_support",
      "//testing/gmock",
      "//testing/gtest",
      "//url",
    ]
  }
}

source_set("pipeline_integration_tests") {
  testonly = true

  if (media_use_ffmpeg) {
    sources = [ "pipeline_integration_test.cc" ]

    deps = [
      ":pipeline_integration_test_base",
      "//base",
      "//base/test:test_support",
      "//media:media_buildflags",
      "//media:test_support",
      "//media/mojo/clients",

      # Needed for the opus_config
      "//testing/gmock",
      "//third_party/opus",
      "//url",
    ]
  }
}

source_set("pipeline_integration_perftests") {
  testonly = true

  if (media_use_ffmpeg) {
    sources = [ "pipeline_integration_perftest.cc" ]

    deps = [
      ":pipeline_integration_test_base",
      "//media:test_support",
      "//testing/gmock",
      "//testing/gtest",
      "//testing/perf",
    ]
  }
}

# Keep these aligned with FuzzerVariant in pipeline_integration_fuzzertest.c
pipeline_integration_fuzzer_variants = [
  "SRC",  # A SRC= version (not MSE) pipeline fuzzer test

  # MSE pipeline fuzzer test variants. Note, while it would be nice to have one
  # generic MSE fuzzer, we use distinct fuzzers corresponding 1:1 to a set of
  # mimetype+codec strings for now because:
  # a) the SourceBuffer implementation must be constructed to expect a
  #    particular bytestream type and (set of) codec(s); it does not
  #    auto-detect those from the appended media, and
  # b) maintaining the association of a (mutated) corpus item with the same MSE
  #    SourceBuffer configuration requires associating that item with the same
  #    mimetype+codec string. The benefits are simpler fuzzers and the ability
  #    to slice per-fuzzer coverage stats. The costs include more fuzzers, risk
  #    of new bytestream types or codec fuzzing gaps, and more potential
  #    duplicate bugs from different fuzzers for common issues exposed across
  #    mimetype+codec string variants.
  "WEBM_OPUS",
  "WEBM_VORBIS",
  "WEBM_VP8",
  "WEBM_VP9",
  "WEBM_OPUS_VP9",
  "MP4_FLAC",
  "MP4_OPUS",
  "MP3",

  # See below for additional variants depending on build configuration.
]

if (enable_av1_decoder) {
  pipeline_integration_fuzzer_variants += [ "MP4_AV1" ]
}

if (proprietary_codecs) {
  pipeline_integration_fuzzer_variants += [
    "ADTS",
    "MP4_AACLC",
    "MP4_AACSBR",

    # Though neither StreamParserFactory, MP4StreamParser, nor
    # SourceBufferState::Init differentiate kinds of AVC, we use "AVC1" here to
    # retain corpus associated with this fuzzer target name.
    "MP4_AVC1",
    "MP4_AACLC_AVC",
  ]
  if (enable_mse_mpeg2ts_stream_parser) {
    pipeline_integration_fuzzer_variants += [
      "MP2T_AACLC",
      "MP2T_AACSBR",
      "MP2T_AVC",
      "MP2T_MP3",
      "MP2T_AACLC_AVC",
    ]
  }
}

foreach(variant, pipeline_integration_fuzzer_variants) {
  if (variant == "SRC") {
    test_name = "media_pipeline_integration_fuzzer"
  } else {
    test_name = "mediasource_${variant}_pipeline_integration_fuzzer"
  }

  fuzzer_test(test_name) {
    sources = [ "pipeline_integration_fuzzertest.cc" ]
    deps = [
      ":pipeline_integration_test_base",
      "//base",
      "//base/test:test_support",
      "//media:test_support",
      "//testing/gmock",
      "//testing/gtest",
      "//ui/gfx:test_support",
    ]

    defines = [ "PIPELINE_FUZZER_VARIANT=${variant}" ]

    seed_corpus = "//media/test/data/"
  }
}

if (is_ios) {
  bundle_data_from_filelist("media_bundle_data") {
    testonly = true
    filelist_name = "media_bundle_data.filelist"
  }
}