# Copyright 2016 The Fuchsia 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("//build/package.gni")
import("//build/test/test_package.gni")

test_package("leveldb_tests") {
  deps = [ ":leveldb_tests_bin" ]

  tests = [
    {
      name = "leveldb_tests"
    },
  ]
}

defines = [
  "LEVELDB_PLATFORM_POSIX=1",
  "LEVELDB_IS_BIG_ENDIAN=0",
  "HAVE_SNAPPY=1",
  "HAVE_FDATASYNC=1",
]

config("leveldb_config") {
  include_dirs = [
    ".",
    "include",
  ]
}

config("leveldb_warnings_config") {
  cflags = [
    "-Wall",
    "-Werror",
    "-Wthread-safety",
    "-Wno-sign-compare",
    "-Wno-unused-variable",
  ]
}

static_library("leveldb") {
  sources = [
    "db/builder.cc",
    "db/builder.h",
    "db/db_impl.cc",
    "db/db_impl.h",
    "db/db_iter.cc",
    "db/db_iter.h",
    "db/dbformat.cc",
    "db/dbformat.h",
    "db/dumpfile.cc",
    "db/filename.cc",
    "db/filename.h",
    "db/log_format.h",
    "db/log_reader.cc",
    "db/log_reader.h",
    "db/log_writer.cc",
    "db/log_writer.h",
    "db/memtable.cc",
    "db/memtable.h",
    "db/repair.cc",
    "db/skiplist.h",
    "db/snapshot.h",
    "db/table_cache.cc",
    "db/table_cache.h",
    "db/version_edit.cc",
    "db/version_edit.h",
    "db/version_set.cc",
    "db/version_set.h",
    "db/write_batch.cc",
    "db/write_batch_internal.h",
    "helpers/memenv/memenv.cc",
    "helpers/memenv/memenv.h",
    "include/leveldb/cache.h",
    "include/leveldb/comparator.h",
    "include/leveldb/db.h",
    "include/leveldb/dumpfile.h",
    "include/leveldb/env.h",
    "include/leveldb/export.h",
    "include/leveldb/filter_policy.h",
    "include/leveldb/iterator.h",
    "include/leveldb/options.h",
    "include/leveldb/slice.h",
    "include/leveldb/status.h",
    "include/leveldb/table.h",
    "include/leveldb/table_builder.h",
    "include/leveldb/write_batch.h",
    "port/port.h",
    "port/port_stdxx.h",
    "port/thread_annotations.h",
    "table/block.cc",
    "table/block.h",
    "table/block_builder.cc",
    "table/block_builder.h",
    "table/filter_block.cc",
    "table/filter_block.h",
    "table/format.cc",
    "table/format.h",
    "table/iterator.cc",
    "table/iterator_wrapper.h",
    "table/merger.cc",
    "table/merger.h",
    "table/table.cc",
    "table/table_builder.cc",
    "table/two_level_iterator.cc",
    "table/two_level_iterator.h",
    "util/arena.cc",
    "util/arena.h",
    "util/bloom.cc",
    "util/cache.cc",
    "util/coding.cc",
    "util/coding.h",
    "util/comparator.cc",
    "util/crc32c.cc",
    "util/crc32c.h",
    "util/env.cc",
    "util/env_fuchsia.cc",
    "util/env_fuchsia.h",
    "util/filter_policy.cc",
    "util/hash.cc",
    "util/hash.h",
    "util/logging.cc",
    "util/logging.h",
    "util/mutexlock.h",
    "util/options.cc",
    "util/random.h",
    "util/status.cc",
  ]

  public_deps = [
    "//sdk/fidl/fuchsia.io",
    "//sdk/lib/fdio",
    "//sdk/lib/fit",
    "//third_party/re2",
    "//third_party/snappy",
    "//zircon/system/ulib/async",
    "//zircon/system/ulib/async:async-cpp",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/syslog",
    "//zircon/system/ulib/zx",
  ]

  public_configs = [ ":leveldb_config" ]

  configs -= [ "//build/config:default_warnings" ]
  configs += [ ":leveldb_warnings_config" ]
}

source_set("leveldb_testutil") {
  sources = [
    "util/histogram.cc",
    "util/histogram.h",
    "util/testharness.cc",
    "util/testharness.h",
    "util/testutil.cc",
    "util/testutil.h",
  ]

  public_deps = [ ":leveldb" ]

  configs -= [ "//build/config:default_warnings" ]
  configs += [ ":leveldb_warnings_config" ]
}

# These leveldb *_test.cc files all define their own identical main function which
# just calls the same RunAllTests helper. Having this many different binaries is
# really difficult to deal with in our setup, so we glob them into one binary
# called leveldb_tests. To do this we need to give each file a different name
# for its main symbol which we'll ignore. We do this with the magic and horror
# of a GN template to generate distinct defines for each file.

template("leveldb_test_source_wrapper") {
  assert(defined(invoker.test), "Must define test")

  source_set(target_name) {
    testonly = true

    sources = [ invoker.test ]

    deps = [
      ":leveldb_testutil",
      "//third_party/googletest:gtest",
    ]

    cflags = [ "-Dmain=fake_main_${target_name}" ]

    configs -= [ "//build/config:default_warnings" ]
    configs += [ ":leveldb_warnings_config" ]
  }
}

leveldb_test_source_wrapper("corruption_test") {
  test = "db/corruption_test.cc"
}
leveldb_test_source_wrapper("dbformat_test") {
  test = "db/dbformat_test.cc"
}
leveldb_test_source_wrapper("filename_test") {
  test = "db/filename_test.cc"
}
leveldb_test_source_wrapper("log_test") {
  test = "db/log_test.cc"
}
leveldb_test_source_wrapper("skiplist_test") {
  test = "db/skiplist_test.cc"
}
leveldb_test_source_wrapper("version_edit_test") {
  test = "db/version_edit_test.cc"
}
leveldb_test_source_wrapper("write_batch_test") {
  test = "db/write_batch_test.cc"
}
leveldb_test_source_wrapper("filter_block_test") {
  test = "table/filter_block_test.cc"
}
leveldb_test_source_wrapper("table_test") {
  test = "table/table_test.cc"
}
leveldb_test_source_wrapper("arena_test") {
  test = "util/arena_test.cc"
}
leveldb_test_source_wrapper("bloom_test") {
  test = "util/bloom_test.cc"
}
leveldb_test_source_wrapper("cache_test") {
  test = "util/cache_test.cc"
}
leveldb_test_source_wrapper("crc32c_test") {
  test = "util/crc32c_test.cc"
}
leveldb_test_source_wrapper("logging_test") {
  test = "util/logging_test.cc"
}
leveldb_test_source_wrapper("status_test") {
  test = "util/status_test.cc"
}
leveldb_test_source_wrapper("fuchsia_env_test") {
  test = "util/env_fuchsia_test.cc"
}

group("leveldb_test_sources") {
  testonly = true

  deps = [
    ":arena_test",
    ":bloom_test",
    ":cache_test",
    ":corruption_test",
    ":crc32c_test",
    ":dbformat_test",
    ":filename_test",
    ":filter_block_test",
    ":fuchsia_env_test",
    ":log_test",
    ":logging_test",
    ":skiplist_test",
    ":status_test",
    ":table_test",
    ":version_edit_test",
    ":write_batch_test",
  ]
}

executable("leveldb_tests_bin") {
  output_name = "leveldb_tests"
  testonly = true

  sources = [
    # Use the actual main from env_test.cc (arbitrarily chosen).
    # The rest of the test sources come from :leveldb_test_sources
    "util/env_test.cc",
  ]

  deps = [
    ":leveldb_test_sources",
    ":leveldb_testutil",
    "//third_party/googletest:gtest",
  ]

  configs -= [ "//build/config:default_warnings" ]
  configs += [ ":leveldb_warnings_config" ]
}

package("leveldb_benchmarks") {
  testonly = true

  deps = [ ":leveldb_db_bench" ]

  binaries = [
    {
      name = "leveldb_db_benchmark"
    },
  ]
}

executable("leveldb_db_bench") {
  testonly = true
  output_name = "leveldb_db_benchmark"

  sources = [ "db/db_bench.cc" ]

  deps = [ ":leveldb_testutil" ]
}
# TODO: Figure out "db/db_test.cc",
