#include "test.h++"

class testcase_copy : public testcase {
  const std::string copy_pathname;
  void copy_db(const bool with_compaction);

public:
  testcase_copy(const actor_config &config, const mdbx_pid_t pid)
      : testcase(config, pid),
        copy_pathname(config.params.pathname_db + "-copy") {}
  bool run() override;
};
REGISTER_TESTCASE(copy);

void testcase_copy::copy_db(const bool with_compaction) {
  int err = mdbx_env_delete(copy_pathname.c_str(), MDBX_ENV_JUST_DELETE);
  if (err != MDBX_SUCCESS && err != MDBX_RESULT_TRUE)
    failure_perror("osal_removefile()", err);

  err = mdbx_env_copy(db_guard.get(), copy_pathname.c_str(),
                      with_compaction ? MDBX_CP_COMPACT : MDBX_CP_DEFAULTS);
  if (unlikely(err != MDBX_SUCCESS))
    failure_perror(with_compaction ? "mdbx_env_copy(MDBX_CP_COMPACT)"
                                   : "mdbx_env_copy(MDBX_CP_ASIS)",
                   err);
}

bool testcase_copy::run() {
  jitter_delay();
  db_open();
  assert(!txn_guard);
  const bool order = flipcoin();
  jitter_delay();
  copy_db(order);
  jitter_delay();
  copy_db(!order);
  return true;
}