# Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.

# TODO(kjellander): Convert the rest of the test.gyp targets and put here.

source_set("test") {
  testonly = true

  deps = [
    ":field_trial",
    ":test_support",
    ":test_support_main",
  ]
}

source_set("field_trial") {
  sources = [
    "field_trial.cc",
    "field_trial.h",
  ]

  deps = [
    "..:webrtc_common",
    "../system_wrappers",
  ]

  configs += [ "..:common_config" ]
  public_configs = [ "..:common_inherited_config"]
}

source_set("histogram") {
  sources = [
    "histogram.cc",
    "histogram.h",
  ]

  deps = [
    "..:webrtc_common",
    "../system_wrappers",
  ]

  configs += [ "..:common_config" ]
  public_configs = [ "..:common_inherited_config"]
}

source_set("test_support") {
  testonly = true

  sources = [
    "testsupport/fileutils.cc",
    "testsupport/fileutils.h",
    "testsupport/frame_reader.cc",
    "testsupport/frame_reader.h",
    "testsupport/frame_writer.cc",
    "testsupport/frame_writer.h",
    "testsupport/gtest_disable.h",
    "testsupport/mock/mock_frame_reader.h",
    "testsupport/mock/mock_frame_writer.h",
    "testsupport/packet_reader.cc",
    "testsupport/packet_reader.h",
    "testsupport/perf_test.cc",
    "testsupport/perf_test.h",
    "testsupport/trace_to_stderr.cc",
    "testsupport/trace_to_stderr.h",
  ]

  deps = [
    "//testing/gmock",
    "//testing/gtest",
    "..:gtest_prod",
    "../system_wrappers",
  ]

  if (is_android) {
    deps += [ "//base:base" ]
  }

  configs += [ "..:common_config" ]
  public_configs = [ "..:common_inherited_config"]
}

source_set("test_support_main") {
  testonly = true

  sources = [
    "run_all_unittests.cc",
    "test_suite.cc",
    "test_suite.h",
  ]

  deps = [
    ":field_trial",
    ":histogram",
    ":test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/gflags",
  ]

  configs += [ "..:common_config" ]
  public_configs = [ "..:common_inherited_config"]
}
