# Copyright 2017 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("//ios/build/config.gni")
import("//testing/test.gni")

# All tests needs to be listed in that target to be built as part of
# "gn_all" target (i.e. by the bots).
group("all_tests") {
  testonly = true
  deps = [ ":ios_components_unittests" ]
}

source_set("run_all_unittests") {
  testonly = true
  sources = [ "run_all_unittests.cc" ]
  deps = [
    "//base",
    "//base/test:test_support",
    "//ios/web/public/test:test_fixture",
    "//mojo/core/embedder",
  ]
}

# To add a unit test to this target, make a "unit_tests" source_set in your
# component (it's important to use a source_set instead of a static library or
# no tests will run) and add a reference here. You can add more than one unit
# test target if convenient.
test("ios_components_unittests") {
  # Add only ":unit_tests" dependencies here. If your tests have dependencies
  # (this would at least include the component itself), they should be on the
  # test source set and not here.

  deps = [
    ":run_all_unittests",
    "//base",
    "//ios/components/cookie_util:unit_tests",
    "//ios/components/io_thread:unit_tests",
    "//ios/components/security_interstitials:unit_tests",
    "//ios/components/security_interstitials/https_only_mode:unit_tests",
    "//ios/components/security_interstitials/lookalikes:unit_tests",
    "//ios/components/security_interstitials/safe_browsing:unit_tests",
    "//ios/components/ui_util:unit_tests",
  ]

  assert_no_deps = ios_assert_no_deps
}
