dncurrency/nano/test_common/system.hpp

97 lines
4.4 KiB
C++

#pragma once
#include <nano/lib/errors.hpp>
#include <nano/lib/stats.hpp>
#include <nano/node/node.hpp>
#include <chrono>
#include <optional>
namespace nano
{
/** Test-system related error codes */
enum class error_system
{
generic = 1,
deadline_expired
};
namespace test
{
class system final
{
public:
system ();
system (uint16_t, nano::transport::transport_type = nano::transport::transport_type::tcp, nano::node_flags = nano::node_flags ());
~system ();
void stop ();
void ledger_initialization_set (std::vector<nano::keypair> const & reps, nano::amount const & reserve = 0);
void generate_activity (nano::node &, std::vector<nano::account> &);
void generate_mass_activity (uint32_t, nano::node &);
void generate_usage_traffic (uint32_t, uint32_t, size_t);
void generate_usage_traffic (uint32_t, uint32_t);
nano::account get_random_account (std::vector<nano::account> &);
nano::uint128_t get_random_amount (secure::transaction const &, nano::node &, nano::account const &);
void generate_rollback (nano::node &, std::vector<nano::account> &);
void generate_change_known (nano::node &, std::vector<nano::account> &);
void generate_change_unknown (nano::node &, std::vector<nano::account> &);
void generate_receive (nano::node &);
void generate_send_new (nano::node &, std::vector<nano::account> &);
void generate_send_existing (nano::node &, std::vector<nano::account> &);
std::shared_ptr<nano::state_block> upgrade_genesis_epoch (nano::node &, nano::epoch const);
std::shared_ptr<nano::wallet> wallet (size_t);
nano::account account (store::transaction const &, size_t);
/** Generate work with difficulty between \p min_difficulty_a (inclusive) and \p max_difficulty_a (exclusive) */
uint64_t work_generate_limited (nano::block_hash const & root_a, uint64_t min_difficulty_a, uint64_t max_difficulty_a);
/**
* Polls, sleep if there's no work to be done (default 50ms), then check the deadline
* @returns 0 or nano::deadline_expired
*/
std::error_code poll (std::chrono::nanoseconds const & sleep_time = std::chrono::milliseconds (50));
std::error_code poll_until_true (std::chrono::nanoseconds deadline, std::function<bool ()>);
void delay_ms (std::chrono::milliseconds const & delay);
void deadline_set (std::chrono::duration<double, std::nano> const & delta);
/*
* Convenience function to get a reference to a node at given index. Does bound checking.
*/
nano::node & node (std::size_t index) const;
std::shared_ptr<nano::node> add_node (nano::node_flags = nano::node_flags (), nano::transport::transport_type = nano::transport::transport_type::tcp);
std::shared_ptr<nano::node> add_node (nano::node_config const &, nano::node_flags = nano::node_flags (), nano::transport::transport_type = nano::transport::transport_type::tcp, std::optional<nano::keypair> const & rep = std::nullopt);
// Make an independent node that uses system resources but is not part of the system node list and does not automatically connect to other nodes
std::shared_ptr<nano::node> make_disconnected_node (std::optional<nano::node_config> opt_node_config = std::nullopt, nano::node_flags = nano::node_flags ());
void register_node (std::shared_ptr<nano::node> const &);
void stop_node (nano::node &);
/*
* Returns default config for node running in test environment
*/
nano::node_config default_config ();
/*
* Returns port 0 by default, to let the O/S choose a port number.
* If NANO_TEST_BASE_PORT is set then it allocates numbers by itself from that range.
*/
uint16_t get_available_port ();
public:
std::shared_ptr<boost::asio::io_context> io_ctx;
boost::asio::executor_work_guard<boost::asio::io_context::executor_type> io_guard;
std::vector<std::shared_ptr<nano::node>> nodes;
std::vector<std::shared_ptr<nano::node>> disconnected_nodes;
nano::stats stats;
nano::logger logger{ "tests" };
nano::work_pool work{ nano::dev::network_params.network, std::max (nano::hardware_concurrency (), 1u) };
std::chrono::time_point<std::chrono::steady_clock, std::chrono::duration<double>> deadline{ std::chrono::steady_clock::time_point::max () };
double deadline_scaling_factor{ 1.0 };
unsigned node_sequence{ 0 };
std::vector<std::shared_ptr<nano::block>> initialization_blocks;
};
std::shared_ptr<nano::state_block> upgrade_epoch (nano::work_pool &, nano::ledger &, nano::epoch);
void cleanup_dev_directories_on_exit ();
}
}
REGISTER_ERROR_CODES (nano, error_system);