add a --fakechain argument for tests

The core tests use the blockchain, and reset it to be able
to add test data to it. This does not play nice with the
databases, since those will save that data without an explicit
save call.
We add a fakechain flag that the tests will set, which tells
the core and blockchain code to use a separate database, as
well as skip a few things like checkpoints and fixup, which
only make sense for real data.
This commit is contained in:
moneromooo-monero 2015-12-13 11:38:37 +00:00
parent eee44e62bc
commit 10da0a0b7c
No known key found for this signature in database
GPG key ID: 686F07454D6CEFC3
7 changed files with 27 additions and 8 deletions

View file

@ -91,4 +91,9 @@ namespace command_line
, "Show time-stats when processing blocks/txs and disk synchronization." , "Show time-stats when processing blocks/txs and disk synchronization."
, 0 , 0
}; };
const command_line::arg_descriptor<bool> arg_fakechain = {
"fakechain"
, "Use a fake chain for testing purposes."
, false
};
} }

View file

@ -215,4 +215,5 @@ namespace command_line
extern const arg_descriptor<uint64_t> arg_prep_blocks_threads; extern const arg_descriptor<uint64_t> arg_prep_blocks_threads;
extern const arg_descriptor<uint64_t> arg_db_auto_remove_logs; extern const arg_descriptor<uint64_t> arg_db_auto_remove_logs;
extern const arg_descriptor<uint64_t> arg_show_time_stats; extern const arg_descriptor<uint64_t> arg_show_time_stats;
extern const arg_descriptor<bool> arg_fakechain;
} }

View file

@ -236,7 +236,7 @@ uint64_t Blockchain::get_current_blockchain_height() const
//------------------------------------------------------------------ //------------------------------------------------------------------
//FIXME: possibly move this into the constructor, to avoid accidentally //FIXME: possibly move this into the constructor, to avoid accidentally
// dereferencing a null BlockchainDB pointer // dereferencing a null BlockchainDB pointer
bool Blockchain::init(BlockchainDB* db, const bool testnet) bool Blockchain::init(BlockchainDB* db, const bool testnet, const bool fakechain)
{ {
LOG_PRINT_L3("Blockchain::" << __func__); LOG_PRINT_L3("Blockchain::" << __func__);
CRITICAL_REGION_LOCAL(m_blockchain_lock); CRITICAL_REGION_LOCAL(m_blockchain_lock);
@ -293,8 +293,11 @@ bool Blockchain::init(BlockchainDB* db, const bool testnet)
{ {
} }
// ensure we fixup anything we found and fix in the future if (!fakechain)
m_db->fixup(); {
// ensure we fixup anything we found and fix in the future
m_db->fixup();
}
// check how far behind we are // check how far behind we are
uint64_t top_block_timestamp = m_db->get_top_block_timestamp(); uint64_t top_block_timestamp = m_db->get_top_block_timestamp();
@ -311,7 +314,7 @@ bool Blockchain::init(BlockchainDB* db, const bool testnet)
m_async_pool.create_thread(boost::bind(&boost::asio::io_service::run, &m_async_service)); m_async_pool.create_thread(boost::bind(&boost::asio::io_service::run, &m_async_service));
#if defined(PER_BLOCK_CHECKPOINT) #if defined(PER_BLOCK_CHECKPOINT)
if (m_fast_sync && get_blocks_dat_start(testnet) != nullptr) if (!fakechain && m_fast_sync && get_blocks_dat_start(testnet) != nullptr)
{ {
if (get_blocks_dat_size(testnet) > 4) if (get_blocks_dat_size(testnet) > 4)
{ {

View file

@ -91,7 +91,7 @@ namespace cryptonote
Blockchain(tx_memory_pool& tx_pool); Blockchain(tx_memory_pool& tx_pool);
bool init(BlockchainDB* db, const bool testnet = false); bool init(BlockchainDB* db, const bool testnet = false, const bool fakechain = false);
bool deinit(); bool deinit();
void set_checkpoints(checkpoints&& chk_pts) { m_checkpoints = chk_pts; } void set_checkpoints(checkpoints&& chk_pts) { m_checkpoints = chk_pts; }

View file

@ -97,7 +97,7 @@ namespace cryptonote
//----------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------
bool core::update_checkpoints() bool core::update_checkpoints()
{ {
if (m_testnet) return true; if (m_testnet || m_fakechain) return true;
if (m_checkpoints_updating.test_and_set()) return true; if (m_checkpoints_updating.test_and_set()) return true;
@ -145,18 +145,20 @@ namespace cryptonote
command_line::add_arg(desc, command_line::arg_db_sync_mode); command_line::add_arg(desc, command_line::arg_db_sync_mode);
command_line::add_arg(desc, command_line::arg_show_time_stats); command_line::add_arg(desc, command_line::arg_show_time_stats);
command_line::add_arg(desc, command_line::arg_db_auto_remove_logs); command_line::add_arg(desc, command_line::arg_db_auto_remove_logs);
command_line::add_arg(desc, command_line::arg_fakechain);
} }
//----------------------------------------------------------------------------------------------- //-----------------------------------------------------------------------------------------------
bool core::handle_command_line(const boost::program_options::variables_map& vm) bool core::handle_command_line(const boost::program_options::variables_map& vm)
{ {
m_testnet = command_line::get_arg(vm, command_line::arg_testnet_on); m_testnet = command_line::get_arg(vm, command_line::arg_testnet_on);
m_fakechain = command_line::get_arg(vm, command_line::arg_fakechain);
auto data_dir_arg = m_testnet ? command_line::arg_testnet_data_dir : command_line::arg_data_dir; auto data_dir_arg = m_testnet ? command_line::arg_testnet_data_dir : command_line::arg_data_dir;
m_config_folder = command_line::get_arg(vm, data_dir_arg); m_config_folder = command_line::get_arg(vm, data_dir_arg);
auto data_dir = boost::filesystem::path(m_config_folder); auto data_dir = boost::filesystem::path(m_config_folder);
if (!m_testnet) if (!m_testnet && !m_fakechain)
{ {
cryptonote::checkpoints checkpoints; cryptonote::checkpoints checkpoints;
if (!cryptonote::create_checkpoints(checkpoints)) if (!cryptonote::create_checkpoints(checkpoints))
@ -257,6 +259,9 @@ namespace cryptonote
boost::filesystem::path folder(m_config_folder); boost::filesystem::path folder(m_config_folder);
if (m_fakechain)
folder /= "fake";
folder /= db->get_db_name(); folder /= db->get_db_name();
LOG_PRINT_L0("Loading blockchain from folder " << folder.string() << " ..."); LOG_PRINT_L0("Loading blockchain from folder " << folder.string() << " ...");
@ -337,7 +342,7 @@ namespace cryptonote
m_blockchain_storage.set_user_options(blocks_threads, m_blockchain_storage.set_user_options(blocks_threads,
blocks_per_sync, sync_mode, fast_sync); blocks_per_sync, sync_mode, fast_sync);
r = m_blockchain_storage.init(db, m_testnet); r = m_blockchain_storage.init(db, m_testnet, m_fakechain);
bool show_time_stats = command_line::get_arg(vm, command_line::arg_show_time_stats) != 0; bool show_time_stats = command_line::get_arg(vm, command_line::arg_show_time_stats) != 0;
m_blockchain_storage.set_show_time_stats(show_time_stats); m_blockchain_storage.set_show_time_stats(show_time_stats);

View file

@ -199,6 +199,7 @@ namespace cryptonote
uint64_t m_target_blockchain_height; uint64_t m_target_blockchain_height;
bool m_testnet; bool m_testnet;
bool m_fakechain;
std::string m_checkpoints_path; std::string m_checkpoints_path;
time_t m_last_dns_checkpoints_update; time_t m_last_dns_checkpoints_update;
time_t m_last_json_checkpoints_update; time_t m_last_json_checkpoints_update;

View file

@ -484,6 +484,10 @@ inline bool do_replay_events(std::vector<test_event_entry>& events)
if (!r) if (!r)
return false; return false;
// hardcode a --fakechain option for tests
static const char * const fakechain[] = {"", "--fakechain"};
boost::program_options::store(boost::program_options::parse_command_line(2, fakechain, desc), vm);
cryptonote::cryptonote_protocol_stub pr; //TODO: stub only for this kind of test, make real validation of relayed objects cryptonote::cryptonote_protocol_stub pr; //TODO: stub only for this kind of test, make real validation of relayed objects
cryptonote::core c(&pr); cryptonote::core c(&pr);
// FIXME: make sure that vm has arg_testnet_on set to true or false if // FIXME: make sure that vm has arg_testnet_on set to true or false if