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

group("all_tests") {
  testonly = true
  deps = [
    ":ocmock_support_unittests",
  ]
}

source_set("embedded_test_server_support") {
  configs += [ "//build/config/compiler:enable_arc" ]
  testonly = true

  deps = [
    "//net:test_support",
  ]
  sources = [
    "embedded_test_server_handlers.cc",
    "embedded_test_server_handlers.h",
  ]
}

source_set("ocmock_support") {
  configs += [ "//build/config/compiler:enable_arc" ]
  testonly = true

  deps = [
    "//base",
  ]

  public_deps = [
    "//third_party/google_toolbox_for_mac",
    "//third_party/ocmock",
  ]

  sources = [
    "ocmock_complex_type_helper.h",
    "ocmock_complex_type_helper.mm",
  ]
}

test("ocmock_support_unittests") {
  configs += [ "//build/config/compiler:enable_arc" ]
  deps = [
    ":ocmock_support",
    "//base/test:run_all_unittests",
    "//base/test:test_support",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/ocmock",
  ]

  sources = [
    "ocmock_complex_type_helper_unittest.mm",
  ]

  assert_no_deps = ios_assert_no_deps
}

bundle_data("http_server_bundle_data") {
  testonly = true

  sources = [
    "data/http_server_files/autofill_smoke_test.html",
    "data/http_server_files/browsing_prevent_default_test_page.html",
    "data/http_server_files/chromium_logo.png",
    "data/http_server_files/chromium_logo_page.html",
    "data/http_server_files/destination.html",
    "data/http_server_files/fullscreen.html",
    "data/http_server_files/generic.pkpass",
    "data/http_server_files/history.html",
    "data/http_server_files/history.js",
    "data/http_server_files/history_go.html",
    "data/http_server_files/history_go.js",
    "data/http_server_files/iframe_host.html",
    "data/http_server_files/links.html",
    "data/http_server_files/memory_usage.html",
    "data/http_server_files/multi_field_form.html",
    "data/http_server_files/onload_replacestate_reload.html",
    "data/http_server_files/onload_replacestate_reload.js",
    "data/http_server_files/pony.html",
    "data/http_server_files/redirect_refresh.html",
    "data/http_server_files/single_page_wide.pdf",
    "data/http_server_files/state_operations.html",
    "data/http_server_files/state_operations.js",
    "data/http_server_files/testpage.pdf",
    "data/http_server_files/two_pages.pdf",
    "data/http_server_files/user_agent_test_page.html",
    "data/http_server_files/username_password_field_form.html",
    "data/http_server_files/window_close.html",
    "data/http_server_files/window_location.html",
    "data/http_server_files/window_location.js",
    "data/http_server_files/window_open.html",
    "data/http_server_files/window_proxy.html",
  ]
  outputs = [
    "{{bundle_resources_dir}}/" +
        "{{source_root_relative_dir}}/{{source_file_part}}",
  ]
}
