# Copyright 2014 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("//testing/test.gni")

component("sql") {
  sources = [
    "database.cc",
    "database.h",
    "database_memory_dump_provider.cc",
    "database_memory_dump_provider.h",
    "error_delegate_util.cc",
    "error_delegate_util.h",
    "init_status.h",
    "initialization.cc",
    "initialization.h",
    "internal_api_token.h",
    "meta_table.cc",
    "meta_table.h",
    "recover_module/btree.cc",
    "recover_module/btree.h",
    "recover_module/cursor.cc",
    "recover_module/cursor.h",
    "recover_module/integers.cc",
    "recover_module/integers.h",
    "recover_module/module.cc",
    "recover_module/module.h",
    "recover_module/pager.cc",
    "recover_module/pager.h",
    "recover_module/parsing.cc",
    "recover_module/parsing.h",
    "recover_module/payload.cc",
    "recover_module/payload.h",
    "recover_module/record.cc",
    "recover_module/record.h",
    "recover_module/table.cc",
    "recover_module/table.h",
    "recovery.cc",
    "recovery.h",
    "sandboxed_vfs.cc",
    "sandboxed_vfs.h",
    "sandboxed_vfs_file.cc",
    "sandboxed_vfs_file.h",
    "sql_features.cc",
    "sql_features.h",
    "sql_memory_dump_provider.cc",
    "sql_memory_dump_provider.h",
    "statement.cc",
    "statement.h",
    "statement_id.cc",
    "statement_id.h",
    "transaction.cc",
    "transaction.h",
    "vfs_wrapper.cc",
    "vfs_wrapper.h",
  ]

  defines = [ "IS_SQL_IMPL" ]

  deps = [
    "//base",
    "//base/third_party/dynamic_annotations",
    "//third_party/sqlite",
  ]

  # For vfs_wrapper.cc time-machine exclusions.
  if (is_mac) {
    frameworks = [
      "CoreFoundation.framework",
      "CoreServices.framework",
    ]
  }

  if (is_fuchsia) {
    sources += [
      "vfs_wrapper_fuchsia.cc",
      "vfs_wrapper_fuchsia.h",
    ]
  }
}

static_library("test_support") {
  testonly = true
  sources = [
    "test/error_callback_support.cc",
    "test/error_callback_support.h",
    "test/scoped_error_expecter.cc",
    "test/scoped_error_expecter.h",
    "test/test_helpers.cc",
    "test/test_helpers.h",
  ]

  public_deps = [ ":sql" ]
  deps = [
    "//base",
    "//testing/gtest",
    "//third_party/sqlite",
  ]
}

bundle_data("sql_unittests_bundle_data") {
  testonly = true
  sources = [ "test/data/recovery_387868" ]
  outputs = [ "{{bundle_resources_dir}}/" +
              "{{source_root_relative_dir}}/{{source_file_part}}" ]
}

test("sql_unittests") {
  sources = [
    "database_unittest.cc",
    "meta_table_unittest.cc",
    "recover_module/module_unittest.cc",
    "recovery_unittest.cc",
    "sql_memory_dump_provider_unittest.cc",
    "sqlite_features_unittest.cc",
    "statement_id_unittest.cc",
    "statement_unittest.cc",
    "test/database_test_peer.cc",
    "test/database_test_peer.h",
    "test/paths.cc",
    "test/paths.h",
    "test/run_all_unittests.cc",
    "test/sql_test_base.cc",
    "test/sql_test_base.h",
    "test/sql_test_suite.cc",
    "test/sql_test_suite.h",
    "transaction_unittest.cc",
  ]

  data = [ "test/data/" ]

  deps = [
    ":sql",
    ":sql_unittests_bundle_data",
    ":test_support",
    "//base/test:test_support",
    "//testing/gtest",
    "//third_party/sqlite",
  ]
}
