diff --git a/nano/test_common/ledger.cpp b/nano/test_common/ledger.cpp index 3189375ad..3753aa648 100644 --- a/nano/test_common/ledger.cpp +++ b/nano/test_common/ledger.cpp @@ -1,12 +1,19 @@ #include #include -nano::test::context::ledger_context::ledger_context () : +nano::test::context::ledger_context::ledger_context (std::deque> && blocks) : store_m{ nano::make_store (logger, nano::unique_path (), nano::dev::constants) }, - ledger_m{ *store_m, stats_m, nano::dev::constants } + ledger_m{ *store_m, stats_m, nano::dev::constants }, + blocks_m{ blocks } { debug_assert (!store_m->init_error ()); - store_m->initialize (store_m->tx_begin_write (), ledger_m.cache, ledger_m.constants); + auto tx = store_m->tx_begin_write (); + store_m->initialize (tx, ledger_m.cache, ledger_m.constants); + for (auto const & i : blocks_m) + { + auto process_result = ledger_m.process (tx, *i); + debug_assert (process_result.code == nano::process_result::progress); + } } nano::ledger & nano::test::context::ledger_context::ledger () @@ -24,7 +31,67 @@ nano::stat & nano::test::context::ledger_context::stats () return stats_m; } +std::deque> const & nano::test::context::ledger_context::blocks () const +{ + return blocks_m; +} + auto nano::test::context::ledger_empty () -> ledger_context { return ledger_context{}; } + +auto nano::test::context::ledger_send_receive () -> ledger_context +{ + std::deque> blocks; + nano::work_pool pool{ nano::dev::network_params.network, std::numeric_limits::max () }; + nano::block_builder builder; + auto send = builder.state () + .make_block () + .account (nano::dev::genesis_key.pub) + .previous (nano::dev::genesis->hash ()) + .representative (nano::dev::genesis_key.pub) + .balance (nano::dev::constants.genesis_amount - 1) + .link (nano::dev::genesis_key.pub) + .sign (nano::dev::genesis_key.prv, nano::dev::genesis_key.pub) + .work (*pool.generate (nano::dev::genesis->hash ())) + .build_shared (); + blocks.push_back (send); + auto receive = builder.state () + .make_block () + .account (nano::dev::genesis_key.pub) + .previous (send->hash ()) + .representative (nano::dev::genesis_key.pub) + .balance (nano::dev::constants.genesis_amount) + .link (send->hash ()) + .sign (nano::dev::genesis_key.prv, nano::dev::genesis_key.pub) + .work (*pool.generate (send->hash ())) + .build_shared (); + blocks.push_back (receive); + return ledger_context{ std::move (blocks) }; +} + +auto nano::test::context::ledger_send_receive_legacy () -> ledger_context +{ + std::deque> blocks; + nano::work_pool pool{ nano::dev::network_params.network, std::numeric_limits::max () }; + nano::block_builder builder; + auto send = builder.send () + .make_block () + .previous (nano::dev::genesis->hash ()) + .destination (nano::dev::genesis_key.pub) + .balance (nano::dev::constants.genesis_amount - 1) + .sign (nano::dev::genesis_key.prv, nano::dev::genesis_key.pub) + .work (*pool.generate (nano::dev::genesis->hash ())) + .build_shared (); + blocks.push_back (send); + auto receive = builder.receive () + .make_block () + .previous (send->hash ()) + .source (send->hash ()) + .sign (nano::dev::genesis_key.prv, nano::dev::genesis_key.pub) + .work (*pool.generate (send->hash ())) + .build_shared (); + blocks.push_back (receive); + return ledger_context{ std::move (blocks) }; +} diff --git a/nano/test_common/ledger.hpp b/nano/test_common/ledger.hpp index 19ccf4688..64992f8a8 100644 --- a/nano/test_common/ledger.hpp +++ b/nano/test_common/ledger.hpp @@ -15,19 +15,28 @@ namespace test class ledger_context { public: - ledger_context (); + /** 'blocks' initialises the ledger with each block in-order + Blocks must all return process_result::progress when processed */ + ledger_context (std::deque> && blocks = std::deque>{}); nano::ledger & ledger (); nano::store & store (); nano::stat & stats (); + std::deque> const & blocks () const; private: nano::logger_mt logger; std::unique_ptr store_m; nano::stat stats_m; nano::ledger ledger_m; + std::deque> blocks_m; }; + /** Only a genesis block */ ledger_context ledger_empty (); + /** Send/receive pair of state blocks on the genesis account*/ + ledger_context ledger_send_receive (); + /** Send/receive pair of legacy blocks on the genesis account*/ + ledger_context ledger_send_receive_legacy (); } } }