# Copyright 2021 The Cobalt Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

target(gtest_target_type, "player_filter_tests") {
  testonly = true

  sources = [
    "//starboard/common/test_main.cc",
    "//starboard/testing/fake_graphics_context_provider.cc",
    "//starboard/testing/fake_graphics_context_provider.h",
    "adaptive_audio_decoder_test.cc",
    "audio_channel_layout_mixer_test.cc",
    "audio_decoder_test.cc",
    "audio_renderer_internal_test.cc",
    "file_cache_reader_test.cc",
    "media_time_provider_impl_test.cc",
    "player_components_test.cc",
    "video_decoder_test.cc",
    "video_decoder_test_fixture.cc",
    "video_decoder_test_fixture.h",
    "video_frame_cadence_pattern_generator_test.cc",
    "video_frame_rate_estimator_test.cc",
  ]

  public_deps = [
    ":test_util",
    "//starboard/shared/starboard/media:media_util",
    "//testing/gmock",
  ]
}

if (!is_win) {
  target(final_executable_type, "player_filter_benchmarks") {
    testonly = true

    sources = [
      "//starboard/common/benchmark_main.cc",
      "audio_decoder_benchmark.cc",
    ]

    public_deps = [
      ":test_util",
      "//third_party/google_benchmark",
    ]
  }
}

static_library("test_util") {
  testonly = true

  sources = [
    "test_util.cc",
    "test_util.h",
  ]

  public_configs = [ "//starboard/build/config:starboard_implementation" ]

  public_deps = [
    "//starboard",
    "//starboard/shared/starboard/player:player_download_test_data",
    "//starboard/shared/starboard/player:video_dmp",
    "//testing/gtest",
  ]
  if (gl_type != "none") {
    public_deps += [ "//starboard/egl_and_gles" ]
  }
}
