mirror of
https://github.com/ton-blockchain/ton
synced 2025-03-09 15:40:10 +00:00
emulator fixes, add basic tests (#1042)
This commit is contained in:
parent
0bf7febf9f
commit
c15d878fee
9 changed files with 352 additions and 18 deletions
|
@ -539,6 +539,9 @@ target_link_libraries(test-ton-collator overlay tdutils tdactor adnl tl_api dht
|
||||||
add_executable(test-http test/test-http.cpp)
|
add_executable(test-http test/test-http.cpp)
|
||||||
target_link_libraries(test-http PRIVATE tonhttp)
|
target_link_libraries(test-http PRIVATE tonhttp)
|
||||||
|
|
||||||
|
add_executable(test-emulator test/test-td-main.cpp emulator/test/emulator-tests.cpp)
|
||||||
|
target_link_libraries(test-emulator PRIVATE emulator)
|
||||||
|
|
||||||
get_directory_property(HAS_PARENT PARENT_DIRECTORY)
|
get_directory_property(HAS_PARENT PARENT_DIRECTORY)
|
||||||
if (HAS_PARENT)
|
if (HAS_PARENT)
|
||||||
set(ALL_TEST_SOURCE
|
set(ALL_TEST_SOURCE
|
||||||
|
|
|
@ -87,8 +87,17 @@ void *transaction_emulator_create(const char *config_params_boc, int vm_log_verb
|
||||||
LOG(ERROR) << global_config_res.move_as_error().message();
|
LOG(ERROR) << global_config_res.move_as_error().message();
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
auto global_config = std::make_shared<block::Config>(global_config_res.move_as_ok());
|
||||||
|
return new emulator::TransactionEmulator(std::move(global_config), vm_log_verbosity);
|
||||||
|
}
|
||||||
|
|
||||||
return new emulator::TransactionEmulator(global_config_res.move_as_ok(), vm_log_verbosity);
|
void *emulator_config_create(const char *config_params_boc) {
|
||||||
|
auto config = decode_config(config_params_boc);
|
||||||
|
if (config.is_error()) {
|
||||||
|
LOG(ERROR) << "Error decoding config: " << config.move_as_error();
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
return new block::Config(config.move_as_ok());
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *transaction_emulator_emulate_transaction(void *transaction_emulator, const char *shard_account_boc, const char *message_boc) {
|
const char *transaction_emulator_emulate_transaction(void *transaction_emulator, const char *shard_account_boc, const char *message_boc) {
|
||||||
|
@ -330,7 +339,21 @@ bool transaction_emulator_set_config(void *transaction_emulator, const char* con
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
emulator->set_config(global_config_res.move_as_ok());
|
emulator->set_config(std::make_shared<block::Config>(global_config_res.move_as_ok()));
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void config_deleter(block::Config* ptr) {
|
||||||
|
// We do not delete the config object, since ownership management is delegated to the caller
|
||||||
|
}
|
||||||
|
|
||||||
|
bool transaction_emulator_set_config_object(void *transaction_emulator, void* config) {
|
||||||
|
auto emulator = static_cast<emulator::TransactionEmulator *>(transaction_emulator);
|
||||||
|
|
||||||
|
std::shared_ptr<block::Config> config_ptr(static_cast<block::Config *>(config), config_deleter);
|
||||||
|
|
||||||
|
emulator->set_config(config_ptr);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -472,6 +495,13 @@ bool tvm_emulator_set_c7(void *tvm_emulator, const char *address, uint32_t unixt
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool tvm_emulator_set_config_object(void* tvm_emulator, void* config) {
|
||||||
|
auto emulator = static_cast<emulator::TvmEmulator *>(tvm_emulator);
|
||||||
|
auto global_config = std::shared_ptr<block::Config>(static_cast<block::Config *>(config), config_deleter);
|
||||||
|
emulator->set_config(global_config);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool tvm_emulator_set_prev_blocks_info(void *tvm_emulator, const char* info_boc) {
|
bool tvm_emulator_set_prev_blocks_info(void *tvm_emulator, const char* info_boc) {
|
||||||
auto emulator = static_cast<emulator::TvmEmulator *>(tvm_emulator);
|
auto emulator = static_cast<emulator::TvmEmulator *>(tvm_emulator);
|
||||||
|
|
||||||
|
@ -683,3 +713,7 @@ const char *tvm_emulator_send_internal_message(void *tvm_emulator, const char *m
|
||||||
void tvm_emulator_destroy(void *tvm_emulator) {
|
void tvm_emulator_destroy(void *tvm_emulator) {
|
||||||
delete static_cast<emulator::TvmEmulator *>(tvm_emulator);
|
delete static_cast<emulator::TvmEmulator *>(tvm_emulator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void emulator_config_destroy(void *config) {
|
||||||
|
delete static_cast<block::Config *>(config);
|
||||||
|
}
|
||||||
|
|
|
@ -16,6 +16,13 @@ extern "C" {
|
||||||
*/
|
*/
|
||||||
EMULATOR_EXPORT void *transaction_emulator_create(const char *config_params_boc, int vm_log_verbosity);
|
EMULATOR_EXPORT void *transaction_emulator_create(const char *config_params_boc, int vm_log_verbosity);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Creates Config object from base64 encoded BoC
|
||||||
|
* @param config_params_boc Base64 encoded BoC serialized Config dictionary (Hashmap 32 ^Cell)
|
||||||
|
* @return Pointer to Config object or nullptr in case of error
|
||||||
|
*/
|
||||||
|
EMULATOR_EXPORT void *emulator_config_create(const char *config_params_boc);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Set unixtime for emulation
|
* @brief Set unixtime for emulation
|
||||||
* @param transaction_emulator Pointer to TransactionEmulator object
|
* @param transaction_emulator Pointer to TransactionEmulator object
|
||||||
|
@ -49,7 +56,7 @@ EMULATOR_EXPORT bool transaction_emulator_set_rand_seed(void *transaction_emulat
|
||||||
EMULATOR_EXPORT bool transaction_emulator_set_ignore_chksig(void *transaction_emulator, bool ignore_chksig);
|
EMULATOR_EXPORT bool transaction_emulator_set_ignore_chksig(void *transaction_emulator, bool ignore_chksig);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Set unixtime for emulation
|
* @brief Set config for emulation
|
||||||
* @param transaction_emulator Pointer to TransactionEmulator object
|
* @param transaction_emulator Pointer to TransactionEmulator object
|
||||||
* @param config_boc Base64 encoded BoC serialized Config dictionary (Hashmap 32 ^Cell)
|
* @param config_boc Base64 encoded BoC serialized Config dictionary (Hashmap 32 ^Cell)
|
||||||
* @return true in case of success, false in case of error
|
* @return true in case of success, false in case of error
|
||||||
|
@ -57,7 +64,15 @@ EMULATOR_EXPORT bool transaction_emulator_set_ignore_chksig(void *transaction_em
|
||||||
EMULATOR_EXPORT bool transaction_emulator_set_config(void *transaction_emulator, const char* config_boc);
|
EMULATOR_EXPORT bool transaction_emulator_set_config(void *transaction_emulator, const char* config_boc);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Set unixtime for emulation
|
* @brief Set config for emulation
|
||||||
|
* @param transaction_emulator Pointer to TransactionEmulator object
|
||||||
|
* @param config Pointer to Config object
|
||||||
|
* @return true in case of success, false in case of error
|
||||||
|
*/
|
||||||
|
EMULATOR_EXPORT bool transaction_emulator_set_config_object(void *transaction_emulator, void* config);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set libraries for emulation
|
||||||
* @param transaction_emulator Pointer to TransactionEmulator object
|
* @param transaction_emulator Pointer to TransactionEmulator object
|
||||||
* @param libs_boc Base64 encoded BoC serialized shared libraries dictionary (HashmapE 256 ^Cell).
|
* @param libs_boc Base64 encoded BoC serialized shared libraries dictionary (HashmapE 256 ^Cell).
|
||||||
* @return true in case of success, false in case of error
|
* @return true in case of success, false in case of error
|
||||||
|
@ -167,6 +182,14 @@ EMULATOR_EXPORT bool tvm_emulator_set_libraries(void *tvm_emulator, const char *
|
||||||
*/
|
*/
|
||||||
EMULATOR_EXPORT bool tvm_emulator_set_c7(void *tvm_emulator, const char *address, uint32_t unixtime, uint64_t balance, const char *rand_seed_hex, const char *config);
|
EMULATOR_EXPORT bool tvm_emulator_set_c7(void *tvm_emulator, const char *address, uint32_t unixtime, uint64_t balance, const char *rand_seed_hex, const char *config);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Set config for TVM emulator
|
||||||
|
* @param tvm_emulator Pointer to TVM emulator
|
||||||
|
* @param config Pointer to Config object
|
||||||
|
* @return true in case of success, false in case of error
|
||||||
|
*/
|
||||||
|
EMULATOR_EXPORT bool tvm_emulator_set_config_object(void* tvm_emulator, void* config);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Set tuple of previous blocks (13th element of c7)
|
* @brief Set tuple of previous blocks (13th element of c7)
|
||||||
* @param tvm_emulator Pointer to TVM emulator
|
* @param tvm_emulator Pointer to TVM emulator
|
||||||
|
@ -278,6 +301,13 @@ EMULATOR_EXPORT const char *tvm_emulator_send_internal_message(void *tvm_emulato
|
||||||
*/
|
*/
|
||||||
EMULATOR_EXPORT void tvm_emulator_destroy(void *tvm_emulator);
|
EMULATOR_EXPORT void tvm_emulator_destroy(void *tvm_emulator);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Destroy Config object
|
||||||
|
* @param tvm_emulator Pointer to Config object
|
||||||
|
*/
|
||||||
|
EMULATOR_EXPORT void emulator_config_destroy(void *config);
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -4,6 +4,7 @@ _transaction_emulator_set_lt
|
||||||
_transaction_emulator_set_rand_seed
|
_transaction_emulator_set_rand_seed
|
||||||
_transaction_emulator_set_ignore_chksig
|
_transaction_emulator_set_ignore_chksig
|
||||||
_transaction_emulator_set_config
|
_transaction_emulator_set_config
|
||||||
|
_transaction_emulator_set_config_object
|
||||||
_transaction_emulator_set_libs
|
_transaction_emulator_set_libs
|
||||||
_transaction_emulator_set_debug_enabled
|
_transaction_emulator_set_debug_enabled
|
||||||
_transaction_emulator_set_prev_blocks_info
|
_transaction_emulator_set_prev_blocks_info
|
||||||
|
@ -11,9 +12,12 @@ _transaction_emulator_emulate_transaction
|
||||||
_transaction_emulator_emulate_tick_tock_transaction
|
_transaction_emulator_emulate_tick_tock_transaction
|
||||||
_transaction_emulator_destroy
|
_transaction_emulator_destroy
|
||||||
_emulator_set_verbosity_level
|
_emulator_set_verbosity_level
|
||||||
|
_emulator_config_create
|
||||||
|
_emulator_config_destroy
|
||||||
_tvm_emulator_create
|
_tvm_emulator_create
|
||||||
_tvm_emulator_set_libraries
|
_tvm_emulator_set_libraries
|
||||||
_tvm_emulator_set_c7
|
_tvm_emulator_set_c7
|
||||||
|
_tvm_emulator_set_config_object
|
||||||
_tvm_emulator_set_prev_blocks_info
|
_tvm_emulator_set_prev_blocks_info
|
||||||
_tvm_emulator_set_gas_limit
|
_tvm_emulator_set_gas_limit
|
||||||
_tvm_emulator_set_debug_enabled
|
_tvm_emulator_set_debug_enabled
|
||||||
|
|
257
emulator/test/emulator-tests.cpp
Normal file
257
emulator/test/emulator-tests.cpp
Normal file
File diff suppressed because one or more lines are too long
|
@ -25,7 +25,7 @@ td::Result<std::unique_ptr<TransactionEmulator::EmulationResult>> TransactionEmu
|
||||||
utime = (unsigned)std::time(nullptr);
|
utime = (unsigned)std::time(nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto fetch_res = block::FetchConfigParams::fetch_config_params(config_, prev_blocks_info_, &old_mparams,
|
auto fetch_res = block::FetchConfigParams::fetch_config_params(*config_, prev_blocks_info_, &old_mparams,
|
||||||
&storage_prices, &storage_phase_cfg,
|
&storage_prices, &storage_phase_cfg,
|
||||||
&rand_seed_, &compute_phase_cfg,
|
&rand_seed_, &compute_phase_cfg,
|
||||||
&action_phase_cfg, &masterchain_create_fee,
|
&action_phase_cfg, &masterchain_create_fee,
|
||||||
|
@ -263,8 +263,8 @@ void TransactionEmulator::set_ignore_chksig(bool ignore_chksig) {
|
||||||
ignore_chksig_ = ignore_chksig;
|
ignore_chksig_ = ignore_chksig;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TransactionEmulator::set_config(block::Config &&config) {
|
void TransactionEmulator::set_config(std::shared_ptr<block::Config> config) {
|
||||||
config_ = std::forward<block::Config>(config);
|
config_ = std::move(config);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TransactionEmulator::set_libs(vm::Dictionary &&libs) {
|
void TransactionEmulator::set_libs(vm::Dictionary &&libs) {
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
|
|
||||||
namespace emulator {
|
namespace emulator {
|
||||||
class TransactionEmulator {
|
class TransactionEmulator {
|
||||||
block::Config config_;
|
std::shared_ptr<block::Config> config_;
|
||||||
vm::Dictionary libraries_;
|
vm::Dictionary libraries_;
|
||||||
int vm_log_verbosity_;
|
int vm_log_verbosity_;
|
||||||
ton::UnixTime unixtime_;
|
ton::UnixTime unixtime_;
|
||||||
|
@ -20,7 +20,7 @@ class TransactionEmulator {
|
||||||
td::Ref<vm::Tuple> prev_blocks_info_;
|
td::Ref<vm::Tuple> prev_blocks_info_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
TransactionEmulator(block::Config&& config, int vm_log_verbosity = 0) :
|
TransactionEmulator(std::shared_ptr<block::Config> config, int vm_log_verbosity = 0) :
|
||||||
config_(std::move(config)), libraries_(256), vm_log_verbosity_(vm_log_verbosity),
|
config_(std::move(config)), libraries_(256), vm_log_verbosity_(vm_log_verbosity),
|
||||||
unixtime_(0), lt_(0), rand_seed_(td::BitArray<256>::zero()), ignore_chksig_(false), debug_enabled_(false) {
|
unixtime_(0), lt_(0), rand_seed_(td::BitArray<256>::zero()), ignore_chksig_(false), debug_enabled_(false) {
|
||||||
}
|
}
|
||||||
|
@ -57,7 +57,7 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
const block::Config& get_config() {
|
const block::Config& get_config() {
|
||||||
return config_;
|
return *config_;
|
||||||
}
|
}
|
||||||
|
|
||||||
ton::UnixTime get_unixtime() {
|
ton::UnixTime get_unixtime() {
|
||||||
|
@ -74,7 +74,7 @@ public:
|
||||||
void set_lt(ton::LogicalTime lt);
|
void set_lt(ton::LogicalTime lt);
|
||||||
void set_rand_seed(td::BitArray<256>& rand_seed);
|
void set_rand_seed(td::BitArray<256>& rand_seed);
|
||||||
void set_ignore_chksig(bool ignore_chksig);
|
void set_ignore_chksig(bool ignore_chksig);
|
||||||
void set_config(block::Config &&config);
|
void set_config(std::shared_ptr<block::Config> config);
|
||||||
void set_libs(vm::Dictionary &&libs);
|
void set_libs(vm::Dictionary &&libs);
|
||||||
void set_debug_enabled(bool debug_enabled);
|
void set_debug_enabled(bool debug_enabled);
|
||||||
void set_prev_blocks_info(td::Ref<vm::Tuple> prev_blocks_info);
|
void set_prev_blocks_info(td::Ref<vm::Tuple> prev_blocks_info);
|
||||||
|
|
|
@ -24,12 +24,12 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_c7(block::StdAddress address, uint32_t unixtime, uint64_t balance, td::BitArray<256> rand_seed, std::shared_ptr<const block::Config> config) {
|
void set_c7(block::StdAddress address, uint32_t unixtime, uint64_t balance, td::BitArray<256> rand_seed, std::shared_ptr<const block::Config> config) {
|
||||||
args_.set_address(address);
|
args_.set_address(std::move(address));
|
||||||
args_.set_now(unixtime);
|
args_.set_now(unixtime);
|
||||||
args_.set_balance(balance);
|
args_.set_balance(balance);
|
||||||
args_.set_rand_seed(rand_seed);
|
args_.set_rand_seed(std::move(rand_seed));
|
||||||
if (config) {
|
if (config) {
|
||||||
args_.set_config(config);
|
args_.set_config(std::move(config));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,6 +37,10 @@ public:
|
||||||
args_.set_c7(std::move(c7));
|
args_.set_c7(std::move(c7));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void set_config(std::shared_ptr<const block::Config> config) {
|
||||||
|
args_.set_config(std::move(config));
|
||||||
|
}
|
||||||
|
|
||||||
void set_prev_blocks_info(td::Ref<vm::Tuple> tuple) {
|
void set_prev_blocks_info(td::Ref<vm::Tuple> tuple) {
|
||||||
args_.set_prev_blocks_info(std::move(tuple));
|
args_.set_prev_blocks_info(std::move(tuple));
|
||||||
}
|
}
|
||||||
|
@ -46,7 +50,8 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
Answer run_get_method(int method_id, td::Ref<vm::Stack> stack) {
|
Answer run_get_method(int method_id, td::Ref<vm::Stack> stack) {
|
||||||
return smc_.run_get_method(args_.set_stack(stack).set_method_id(method_id));
|
ton::SmartContract::Args args = args_;
|
||||||
|
return smc_.run_get_method(args.set_stack(stack).set_method_id(method_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
Answer send_external_message(td::Ref<vm::Cell> message_body) {
|
Answer send_external_message(td::Ref<vm::Cell> message_body) {
|
||||||
|
@ -54,7 +59,8 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
Answer send_internal_message(td::Ref<vm::Cell> message_body, uint64_t amount) {
|
Answer send_internal_message(td::Ref<vm::Cell> message_body, uint64_t amount) {
|
||||||
return smc_.send_internal_message(message_body, args_.set_amount(amount));
|
ton::SmartContract::Args args = args_;
|
||||||
|
return smc_.send_internal_message(message_body, args.set_amount(amount));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
|
@ -1971,7 +1971,7 @@ class RunEmulator : public TonlibQueryActor {
|
||||||
check(r_config.move_as_error());
|
check(r_config.move_as_error());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
std::unique_ptr<block::ConfigInfo> config = r_config.move_as_ok();
|
std::shared_ptr<block::ConfigInfo> config = r_config.move_as_ok();
|
||||||
|
|
||||||
auto r_shard_account = account_state_->to_shardAccountCellSlice();
|
auto r_shard_account = account_state_->to_shardAccountCellSlice();
|
||||||
if (r_shard_account.is_error()) {
|
if (r_shard_account.is_error()) {
|
||||||
|
@ -1995,7 +1995,7 @@ class RunEmulator : public TonlibQueryActor {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
vm::Dictionary libraries = global_libraries_;
|
vm::Dictionary libraries = global_libraries_;
|
||||||
emulator::TransactionEmulator trans_emulator(std::move(*config));
|
emulator::TransactionEmulator trans_emulator(config);
|
||||||
trans_emulator.set_prev_blocks_info(prev_blocks_info.move_as_ok());
|
trans_emulator.set_prev_blocks_info(prev_blocks_info.move_as_ok());
|
||||||
trans_emulator.set_libs(std::move(libraries));
|
trans_emulator.set_libs(std::move(libraries));
|
||||||
trans_emulator.set_rand_seed(block_id_.rand_seed);
|
trans_emulator.set_rand_seed(block_id_.rand_seed);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue