
import os

TARGETS_PATH = os.path.dirname(__file__)
REPO_PATH = TARGETS_PATH[(TARGETS_PATH.find('fbcode/') + len('fbcode/')):] + "/"
BUCK_BINS = "buck-out/gen/" + REPO_PATH
TEST_RUNNER = REPO_PATH + "buckifier/rocks_test_runner.sh"
rocksdb_compiler_flags = [
  "-msse",
  "-msse4.2",
  "-fno-builtin-memcmp",
  "-DROCKSDB_PLATFORM_POSIX",
  "-DROCKSDB_LIB_IO_POSIX",
  "-DROCKSDB_FALLOCATE_PRESENT",
  "-DROCKSDB_MALLOC_USABLE_SIZE",
  "-DROCKSDB_RANGESYNC_PRESENT",
  "-DROCKSDB_SCHED_GETCPU_PRESENT",
  "-DROCKSDB_SUPPORT_THREAD_LOCAL",
  "-DHAVE_SSE42",
  "-DOS_LINUX",
  # Flags to enable libs we include
  "-DSNAPPY",
  "-DZLIB",
  "-DBZIP2",
  "-DLZ4",
  "-DZSTD",
  "-DGFLAGS=gflags",
  "-DNUMA",
  "-DTBB",
  # Needed to compile in fbcode
  "-Wno-expansion-to-defined",
]

rocksdb_external_deps = [
  ('bzip2', None, 'bz2'),
  ('snappy', None, "snappy"),
  ('zlib', None, 'z'),
  ('gflags', None, 'gflags'),
  ('lz4', None, 'lz4'),
  ('zstd', None),
  ('tbb', None),
  ("numa", None, "numa"),
  ("googletest", None, "gtest"),
]

rocksdb_preprocessor_flags = [
  # Directories with files for #include
  "-I" + REPO_PATH + "include/",
  "-I" + REPO_PATH,
]

cpp_library(
    name = "rocksdb_lib",
    headers = AutoHeaders.RECURSIVE_GLOB,
    srcs = [
      "cache/clock_cache.cc",
      "cache/lru_cache.cc",
      "cache/sharded_cache.cc",
      "db/builder.cc",
      "db/c.cc",
      "db/column_family.cc",
      "db/compacted_db_impl.cc",
      "db/compaction.cc",
      "db/compaction_iterator.cc",
      "db/compaction_job.cc",
      "db/compaction_picker.cc",
      "db/compaction_picker_universal.cc",
      "db/convenience.cc",
      "db/db_filesnapshot.cc",
      "db/db_impl.cc",
      "db/db_impl_write.cc",
      "db/db_impl_compaction_flush.cc",
      "db/db_impl_files.cc",
      "db/db_impl_open.cc",
      "db/db_impl_debug.cc",
      "db/db_impl_experimental.cc",
      "db/db_impl_readonly.cc",
      "db/db_info_dumper.cc",
      "db/db_iter.cc",
      "db/dbformat.cc",
      "db/event_helpers.cc",
      "db/experimental.cc",
      "db/external_sst_file_ingestion_job.cc",
      "db/file_indexer.cc",
      "db/flush_job.cc",
      "db/flush_scheduler.cc",
      "db/forward_iterator.cc",
      "db/internal_stats.cc",
      "db/log_reader.cc",
      "db/log_writer.cc",
      "db/malloc_stats.cc",
      "db/managed_iterator.cc",
      "db/memtable.cc",
      "db/memtable_list.cc",
      "db/merge_helper.cc",
      "db/merge_operator.cc",
      "db/range_del_aggregator.cc",
      "db/repair.cc",
      "db/snapshot_impl.cc",
      "db/table_cache.cc",
      "db/table_properties_collector.cc",
      "db/transaction_log_impl.cc",
      "db/version_builder.cc",
      "db/version_edit.cc",
      "db/version_set.cc",
      "db/wal_manager.cc",
      "db/write_batch.cc",
      "db/write_batch_base.cc",
      "db/write_controller.cc",
      "db/write_thread.cc",
      "env/env.cc",
      "env/env_chroot.cc",
      "env/env_encryption.cc",
      "env/env_hdfs.cc",
      "env/env_posix.cc",
      "env/io_posix.cc",
      "env/mock_env.cc",
      "memtable/alloc_tracker.cc",
      "memtable/hash_cuckoo_rep.cc",
      "memtable/hash_linklist_rep.cc",
      "memtable/hash_skiplist_rep.cc",
      "memtable/skiplistrep.cc",
      "memtable/vectorrep.cc",
      "memtable/write_buffer_manager.cc",
      "monitoring/histogram.cc",
      "monitoring/histogram_windowing.cc",
      "monitoring/instrumented_mutex.cc",
      "monitoring/iostats_context.cc",
      "monitoring/perf_context.cc",
      "monitoring/perf_level.cc",
      "monitoring/statistics.cc",
      "monitoring/thread_status_impl.cc",
      "monitoring/thread_status_updater.cc",
      "monitoring/thread_status_updater_debug.cc",
      "monitoring/thread_status_util.cc",
      "monitoring/thread_status_util_debug.cc",
      "options/cf_options.cc",
      "options/db_options.cc",
      "options/options.cc",
      "options/options_helper.cc",
      "options/options_parser.cc",
      "options/options_sanity_check.cc",
      "port/port_posix.cc",
      "port/stack_trace.cc",
      "table/adaptive_table_factory.cc",
      "table/block.cc",
      "table/block_based_filter_block.cc",
      "table/block_based_table_builder.cc",
      "table/block_based_table_factory.cc",
      "table/block_based_table_reader.cc",
      "table/block_builder.cc",
      "table/block_prefix_index.cc",
      "table/bloom_block.cc",
      "table/cuckoo_table_builder.cc",
      "table/cuckoo_table_factory.cc",
      "table/cuckoo_table_reader.cc",
      "table/flush_block_policy.cc",
      "table/format.cc",
      "table/full_filter_block.cc",
      "table/get_context.cc",
      "table/index_builder.cc",
      "table/iterator.cc",
      "table/merging_iterator.cc",
      "table/meta_blocks.cc",
      "table/partitioned_filter_block.cc",
      "table/persistent_cache_helper.cc",
      "table/plain_table_builder.cc",
      "table/plain_table_factory.cc",
      "table/plain_table_index.cc",
      "table/plain_table_key_coding.cc",
      "table/plain_table_reader.cc",
      "table/sst_file_writer.cc",
      "table/table_properties.cc",
      "table/two_level_iterator.cc",
      "tools/dump/db_dump_tool.cc",
      "util/arena.cc",
      "util/auto_roll_logger.cc",
      "util/bloom.cc",
      "util/build_version.cc",
      "util/coding.cc",
      "util/compaction_job_stats_impl.cc",
      "util/comparator.cc",
      "util/concurrent_arena.cc",
      "util/crc32c.cc",
      "util/delete_scheduler.cc",
      "util/dynamic_bloom.cc",
      "util/event_logger.cc",
      "util/file_reader_writer.cc",
      "util/file_util.cc",
      "util/filename.cc",
      "util/filter_policy.cc",
      "util/hash.cc",
      "util/log_buffer.cc",
      "util/murmurhash.cc",
      "util/random.cc",
      "util/rate_limiter.cc",
      "util/slice.cc",
      "util/sst_file_manager_impl.cc",
      "util/status.cc",
      "util/status_message.cc",
      "util/string_util.cc",
      "util/sync_point.cc",
      "util/thread_local.cc",
      "util/threadpool_imp.cc",
      "util/transaction_test_util.cc",
      "util/xxhash.cc",
      "utilities/backupable/backupable_db.cc",
      "utilities/blob_db/blob_db.cc",
      "utilities/blob_db/blob_db_impl.cc",
      "utilities/blob_db/blob_db_options_impl.cc",
      "utilities/blob_db/blob_file.cc",
      "utilities/blob_db/blob_log_reader.cc",
      "utilities/blob_db/blob_log_writer.cc",
      "utilities/blob_db/blob_log_format.cc",
      "utilities/blob_db/ttl_extractor.cc",
      "utilities/checkpoint/checkpoint_impl.cc",
      "utilities/compaction_filters/remove_emptyvalue_compactionfilter.cc",
      "utilities/convenience/info_log_finder.cc",
      "utilities/date_tiered/date_tiered_db_impl.cc",
      "utilities/debug.cc",
      "utilities/document/document_db.cc",
      "utilities/document/json_document.cc",
      "utilities/document/json_document_builder.cc",
      "utilities/env_mirror.cc",
      "utilities/env_timed.cc",
      "utilities/geodb/geodb_impl.cc",
      "utilities/leveldb_options/leveldb_options.cc",
      "utilities/lua/rocks_lua_compaction_filter.cc",
      "utilities/memory/memory_util.cc",
      "utilities/merge_operators/cassandra/format.cc",
      "utilities/merge_operators/cassandra/merge_operator.cc",
      "utilities/merge_operators/max.cc",
      "utilities/merge_operators/put.cc",
      "utilities/merge_operators/string_append/stringappend.cc",
      "utilities/merge_operators/string_append/stringappend2.cc",
      "utilities/merge_operators/uint64add.cc",
      "utilities/option_change_migration/option_change_migration.cc",
      "utilities/options/options_util.cc",
      "utilities/persistent_cache/block_cache_tier.cc",
      "utilities/persistent_cache/block_cache_tier_file.cc",
      "utilities/persistent_cache/block_cache_tier_metadata.cc",
      "utilities/persistent_cache/persistent_cache_tier.cc",
      "utilities/persistent_cache/volatile_tier_impl.cc",
      "utilities/redis/redis_lists.cc",
      "utilities/simulator_cache/sim_cache.cc",
      "utilities/spatialdb/spatial_db.cc",
      "utilities/table_properties_collectors/compact_on_deletion_collector.cc",
      "utilities/transactions/optimistic_transaction_db_impl.cc",
      "utilities/transactions/optimistic_transaction_impl.cc",
      "utilities/transactions/transaction_base.cc",
      "utilities/transactions/transaction_db_impl.cc",
      "utilities/transactions/transaction_db_mutex_impl.cc",
      "utilities/transactions/transaction_impl.cc",
      "utilities/transactions/transaction_lock_mgr.cc",
      "utilities/transactions/transaction_util.cc",
      "utilities/ttl/db_ttl_impl.cc",
      "utilities/write_batch_with_index/write_batch_with_index.cc",
      "utilities/write_batch_with_index/write_batch_with_index_internal.cc",
      "tools/ldb_cmd.cc",
      "tools/ldb_tool.cc",
      "tools/sst_dump_tool.cc",
      "utilities/blob_db/blob_dump_tool.cc",
    ],
    deps = [],
    preprocessor_flags = rocksdb_preprocessor_flags,
    compiler_flags = rocksdb_compiler_flags,
    external_deps = rocksdb_external_deps,
)

cpp_library(
    name = "rocksdb_test_lib",
    headers = AutoHeaders.RECURSIVE_GLOB,
    srcs = [
      "table/mock_table.cc",
      "util/fault_injection_test_env.cc",
      "util/testharness.cc",
      "util/testutil.cc",
      "db/db_test_util.cc",
      "utilities/merge_operators/cassandra/test_utils.cc",
      "utilities/col_buf_encoder.cc",
      "utilities/col_buf_decoder.cc",
      "utilities/column_aware_encoding_util.cc",
    ],
    deps = [":rocksdb_lib"],
    preprocessor_flags = rocksdb_preprocessor_flags,
    compiler_flags = rocksdb_compiler_flags,
    external_deps = rocksdb_external_deps,
)

cpp_library(
    name = "rocksdb_tools_lib",
    headers = AutoHeaders.RECURSIVE_GLOB,
    srcs = [
      "tools/db_bench_tool.cc",
      "util/testutil.cc",
    ],
    deps = [":rocksdb_lib"],
    preprocessor_flags = rocksdb_preprocessor_flags,
    compiler_flags = rocksdb_compiler_flags,
    external_deps = rocksdb_external_deps,
)

cpp_library(
    name = "env_basic_test_lib",
    headers = AutoHeaders.RECURSIVE_GLOB,
    srcs = ["env/env_basic_test.cc"],
    deps = [":rocksdb_test_lib"],
    preprocessor_flags = rocksdb_preprocessor_flags,
    compiler_flags = rocksdb_compiler_flags,
    external_deps = rocksdb_external_deps,
)

# [test_name, test_src, test_type]
ROCKS_TESTS = [['arena_test', 'util/arena_test.cc', 'serial'],
 ['auto_roll_logger_test', 'util/auto_roll_logger_test.cc', 'serial'],
 ['autovector_test', 'util/autovector_test.cc', 'serial'],
 ['backupable_db_test',
  'utilities/backupable/backupable_db_test.cc',
  'parallel'],
 ['blob_db_test', 'utilities/blob_db/blob_db_test.cc', 'serial'],
 ['block_based_filter_block_test',
  'table/block_based_filter_block_test.cc',
  'serial'],
 ['block_test', 'table/block_test.cc', 'serial'],
 ['bloom_test', 'util/bloom_test.cc', 'serial'],
 ['c_test', 'db/c_test.c', 'serial'],
 ['cache_test', 'cache/cache_test.cc', 'serial'],
 ['cassandra_format_test',
  'utilities/merge_operators/cassandra/cassandra_format_test.cc',
  'serial'],
 ['cassandra_merge_test',
  'utilities/merge_operators/cassandra/cassandra_merge_test.cc',
  'serial'],
 ['cassandra_row_merge_test',
  'utilities/merge_operators/cassandra/cassandra_row_merge_test.cc',
  'serial'],
 ['cassandra_serialize_test',
  'utilities/merge_operators/cassandra/cassandra_serialize_test.cc',
  'serial'],
 ['checkpoint_test', 'utilities/checkpoint/checkpoint_test.cc', 'serial'],
 ['cleanable_test', 'table/cleanable_test.cc', 'serial'],
 ['coding_test', 'util/coding_test.cc', 'serial'],
 ['column_aware_encoding_test',
  'utilities/column_aware_encoding_test.cc',
  'serial'],
 ['column_family_test', 'db/column_family_test.cc', 'serial'],
 ['compact_files_test', 'db/compact_files_test.cc', 'serial'],
 ['compact_on_deletion_collector_test',
  'utilities/table_properties_collectors/compact_on_deletion_collector_test.cc',
  'serial'],
 ['compaction_iterator_test', 'db/compaction_iterator_test.cc', 'serial'],
 ['compaction_job_stats_test', 'db/compaction_job_stats_test.cc', 'serial'],
 ['compaction_job_test', 'db/compaction_job_test.cc', 'serial'],
 ['compaction_picker_test', 'db/compaction_picker_test.cc', 'serial'],
 ['comparator_db_test', 'db/comparator_db_test.cc', 'serial'],
 ['corruption_test', 'db/corruption_test.cc', 'serial'],
 ['crc32c_test', 'util/crc32c_test.cc', 'serial'],
 ['cuckoo_table_builder_test', 'table/cuckoo_table_builder_test.cc', 'serial'],
 ['cuckoo_table_db_test', 'db/cuckoo_table_db_test.cc', 'serial'],
 ['cuckoo_table_reader_test', 'table/cuckoo_table_reader_test.cc', 'serial'],
 ['date_tiered_test', 'utilities/date_tiered/date_tiered_test.cc', 'serial'],
 ['db_basic_test', 'db/db_basic_test.cc', 'serial'],
 ['db_block_cache_test', 'db/db_block_cache_test.cc', 'serial'],
 ['db_bloom_filter_test', 'db/db_bloom_filter_test.cc', 'serial'],
 ['db_compaction_filter_test', 'db/db_compaction_filter_test.cc', 'parallel'],
 ['db_compaction_test', 'db/db_compaction_test.cc', 'parallel'],
 ['db_dynamic_level_test', 'db/db_dynamic_level_test.cc', 'serial'],
 ['db_encryption_test', 'db/db_encryption_test.cc', 'serial'],
 ['db_flush_test', 'db/db_flush_test.cc', 'serial'],
 ['db_inplace_update_test', 'db/db_inplace_update_test.cc', 'serial'],
 ['db_io_failure_test', 'db/db_io_failure_test.cc', 'serial'],
 ['db_iter_test', 'db/db_iter_test.cc', 'serial'],
 ['db_iterator_test', 'db/db_iterator_test.cc', 'serial'],
 ['db_log_iter_test', 'db/db_log_iter_test.cc', 'serial'],
 ['db_memtable_test', 'db/db_memtable_test.cc', 'serial'],
 ['db_merge_operator_test', 'db/db_merge_operator_test.cc', 'serial'],
 ['db_options_test', 'db/db_options_test.cc', 'serial'],
 ['db_properties_test', 'db/db_properties_test.cc', 'serial'],
 ['db_range_del_test', 'db/db_range_del_test.cc', 'serial'],
 ['db_sst_test', 'db/db_sst_test.cc', 'parallel'],
 ['db_statistics_test', 'db/db_statistics_test.cc', 'serial'],
 ['db_table_properties_test', 'db/db_table_properties_test.cc', 'serial'],
 ['db_tailing_iter_test', 'db/db_tailing_iter_test.cc', 'serial'],
 ['db_test', 'db/db_test.cc', 'parallel'],
 ['db_test2', 'db/db_test2.cc', 'serial'],
 ['db_universal_compaction_test',
  'db/db_universal_compaction_test.cc',
  'parallel'],
 ['db_wal_test', 'db/db_wal_test.cc', 'parallel'],
 ['db_write_test', 'db/db_write_test.cc', 'serial'],
 ['dbformat_test', 'db/dbformat_test.cc', 'serial'],
 ['delete_scheduler_test', 'util/delete_scheduler_test.cc', 'serial'],
 ['deletefile_test', 'db/deletefile_test.cc', 'serial'],
 ['document_db_test', 'utilities/document/document_db_test.cc', 'serial'],
 ['dynamic_bloom_test', 'util/dynamic_bloom_test.cc', 'serial'],
 ['env_basic_test', 'env/env_basic_test.cc', 'serial'],
 ['env_test', 'env/env_test.cc', 'serial'],
 ['env_timed_test', 'utilities/env_timed_test.cc', 'serial'],
 ['event_logger_test', 'util/event_logger_test.cc', 'serial'],
 ['external_sst_file_basic_test',
  'db/external_sst_file_basic_test.cc',
  'serial'],
 ['external_sst_file_test', 'db/external_sst_file_test.cc', 'parallel'],
 ['fault_injection_test', 'db/fault_injection_test.cc', 'parallel'],
 ['file_indexer_test', 'db/file_indexer_test.cc', 'serial'],
 ['file_reader_writer_test', 'util/file_reader_writer_test.cc', 'serial'],
 ['filelock_test', 'util/filelock_test.cc', 'serial'],
 ['filename_test', 'db/filename_test.cc', 'serial'],
 ['flush_job_test', 'db/flush_job_test.cc', 'serial'],
 ['full_filter_block_test', 'table/full_filter_block_test.cc', 'serial'],
 ['geodb_test', 'utilities/geodb/geodb_test.cc', 'serial'],
 ['hash_table_test',
  'utilities/persistent_cache/hash_table_test.cc',
  'serial'],
 ['hash_test', 'util/hash_test.cc', 'serial'],
 ['heap_test', 'util/heap_test.cc', 'serial'],
 ['histogram_test', 'monitoring/histogram_test.cc', 'serial'],
 ['inlineskiplist_test', 'memtable/inlineskiplist_test.cc', 'parallel'],
 ['iostats_context_test', 'monitoring/iostats_context_test.cc', 'serial'],
 ['json_document_test', 'utilities/document/json_document_test.cc', 'serial'],
 ['ldb_cmd_test', 'tools/ldb_cmd_test.cc', 'serial'],
 ['listener_test', 'db/listener_test.cc', 'serial'],
 ['log_test', 'db/log_test.cc', 'serial'],
 ['lru_cache_test', 'cache/lru_cache_test.cc', 'serial'],
 ['manual_compaction_test', 'db/manual_compaction_test.cc', 'parallel'],
 ['memory_test', 'utilities/memory/memory_test.cc', 'serial'],
 ['memtable_list_test', 'db/memtable_list_test.cc', 'serial'],
 ['merge_helper_test', 'db/merge_helper_test.cc', 'serial'],
 ['merge_test', 'db/merge_test.cc', 'serial'],
 ['merger_test', 'table/merger_test.cc', 'serial'],
 ['mock_env_test', 'env/mock_env_test.cc', 'serial'],
 ['object_registry_test', 'utilities/object_registry_test.cc', 'serial'],
 ['optimistic_transaction_test',
  'utilities/transactions/optimistic_transaction_test.cc',
  'serial'],
 ['option_change_migration_test',
  'utilities/option_change_migration/option_change_migration_test.cc',
  'serial'],
 ['options_file_test', 'db/options_file_test.cc', 'serial'],
 ['options_settable_test', 'options/options_settable_test.cc', 'serial'],
 ['options_test', 'options/options_test.cc', 'serial'],
 ['options_util_test', 'utilities/options/options_util_test.cc', 'serial'],
 ['partitioned_filter_block_test',
  'table/partitioned_filter_block_test.cc',
  'serial'],
 ['perf_context_test', 'db/perf_context_test.cc', 'serial'],
 ['persistent_cache_test',
  'utilities/persistent_cache/persistent_cache_test.cc',
  'parallel'],
 ['plain_table_db_test', 'db/plain_table_db_test.cc', 'serial'],
 ['prefix_test', 'db/prefix_test.cc', 'serial'],
 ['range_del_aggregator_test', 'db/range_del_aggregator_test.cc', 'serial'],
 ['rate_limiter_test', 'util/rate_limiter_test.cc', 'serial'],
 ['reduce_levels_test', 'tools/reduce_levels_test.cc', 'serial'],
 ['repair_test', 'db/repair_test.cc', 'serial'],
 ['sim_cache_test', 'utilities/simulator_cache/sim_cache_test.cc', 'serial'],
 ['skiplist_test', 'memtable/skiplist_test.cc', 'serial'],
 ['slice_transform_test', 'util/slice_transform_test.cc', 'serial'],
 ['spatial_db_test', 'utilities/spatialdb/spatial_db_test.cc', 'serial'],
 ['sst_dump_test', 'tools/sst_dump_test.cc', 'serial'],
 ['statistics_test', 'monitoring/statistics_test.cc', 'serial'],
 ['stringappend_test',
  'utilities/merge_operators/string_append/stringappend_test.cc',
  'serial'],
 ['table_properties_collector_test',
  'db/table_properties_collector_test.cc',
  'serial'],
 ['table_test', 'table/table_test.cc', 'parallel'],
 ['thread_list_test', 'util/thread_list_test.cc', 'serial'],
 ['thread_local_test', 'util/thread_local_test.cc', 'serial'],
 ['timer_queue_test', 'util/timer_queue_test.cc', 'serial'],
 ['transaction_test', 'utilities/transactions/transaction_test.cc', 'serial'],
 ['ttl_test', 'utilities/ttl/ttl_test.cc', 'serial'],
 ['util_merge_operators_test',
  'utilities/util_merge_operators_test.cc',
  'serial'],
 ['version_builder_test', 'db/version_builder_test.cc', 'serial'],
 ['version_edit_test', 'db/version_edit_test.cc', 'serial'],
 ['version_set_test', 'db/version_set_test.cc', 'serial'],
 ['wal_manager_test', 'db/wal_manager_test.cc', 'serial'],
 ['write_batch_test', 'db/write_batch_test.cc', 'serial'],
 ['write_batch_with_index_test',
  'utilities/write_batch_with_index/write_batch_with_index_test.cc',
  'serial'],
 ['write_buffer_manager_test',
  'memtable/write_buffer_manager_test.cc',
  'serial'],
 ['write_callback_test', 'db/write_callback_test.cc', 'serial'],
 ['write_controller_test', 'db/write_controller_test.cc', 'serial']]


# Generate a test rule for each entry in ROCKS_TESTS
for test_cfg in ROCKS_TESTS:
    test_name = test_cfg[0]
    test_cc = test_cfg[1]
    ttype = "gtest" if test_cfg[2] == "parallel" else "simple"
    test_bin = test_name + "_bin"

    cpp_binary (
      name = test_bin,
      srcs = [test_cc],
      deps = [":rocksdb_test_lib"],
      preprocessor_flags = rocksdb_preprocessor_flags,
      compiler_flags = rocksdb_compiler_flags,
      external_deps = rocksdb_external_deps,
    )

    custom_unittest(
      name = test_name,
      type = ttype,
      deps = [":" + test_bin],
      command = [TEST_RUNNER, BUCK_BINS + test_bin]
    )

custom_unittest(
    name = "make_rocksdbjavastatic",
    type = "simple",
    command = ["internal_repo_rocksdb/make_rocksdbjavastatic.sh"],
)

custom_unittest(
    name = "make_rocksdb_lite_release",
    type = "simple",
    command = ["internal_repo_rocksdb/make_rocksdb_lite_release.sh"],
)
