mirror of
https://github.com/ton-blockchain/ton
synced 2025-02-12 11:12:16 +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)
|
||||
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)
|
||||
if (HAS_PARENT)
|
||||
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();
|
||||
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) {
|
||||
|
@ -330,7 +339,21 @@ bool transaction_emulator_set_config(void *transaction_emulator, const char* con
|
|||
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;
|
||||
}
|
||||
|
@ -472,6 +495,13 @@ bool tvm_emulator_set_c7(void *tvm_emulator, const char *address, uint32_t unixt
|
|||
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) {
|
||||
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) {
|
||||
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);
|
||||
|
||||
/**
|
||||
* @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
|
||||
* @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);
|
||||
|
||||
/**
|
||||
* @brief Set unixtime for emulation
|
||||
* @brief Set config for emulation
|
||||
* @param transaction_emulator Pointer to TransactionEmulator object
|
||||
* @param config_boc Base64 encoded BoC serialized Config dictionary (Hashmap 32 ^Cell)
|
||||
* @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);
|
||||
|
||||
/**
|
||||
* @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 libs_boc Base64 encoded BoC serialized shared libraries dictionary (HashmapE 256 ^Cell).
|
||||
* @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);
|
||||
|
||||
/**
|
||||
* @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)
|
||||
* @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);
|
||||
|
||||
/**
|
||||
* @brief Destroy Config object
|
||||
* @param tvm_emulator Pointer to Config object
|
||||
*/
|
||||
EMULATOR_EXPORT void emulator_config_destroy(void *config);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
|
|
@ -4,6 +4,7 @@ _transaction_emulator_set_lt
|
|||
_transaction_emulator_set_rand_seed
|
||||
_transaction_emulator_set_ignore_chksig
|
||||
_transaction_emulator_set_config
|
||||
_transaction_emulator_set_config_object
|
||||
_transaction_emulator_set_libs
|
||||
_transaction_emulator_set_debug_enabled
|
||||
_transaction_emulator_set_prev_blocks_info
|
||||
|
@ -11,9 +12,12 @@ _transaction_emulator_emulate_transaction
|
|||
_transaction_emulator_emulate_tick_tock_transaction
|
||||
_transaction_emulator_destroy
|
||||
_emulator_set_verbosity_level
|
||||
_emulator_config_create
|
||||
_emulator_config_destroy
|
||||
_tvm_emulator_create
|
||||
_tvm_emulator_set_libraries
|
||||
_tvm_emulator_set_c7
|
||||
_tvm_emulator_set_config_object
|
||||
_tvm_emulator_set_prev_blocks_info
|
||||
_tvm_emulator_set_gas_limit
|
||||
_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);
|
||||
}
|
||||
|
||||
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,
|
||||
&rand_seed_, &compute_phase_cfg,
|
||||
&action_phase_cfg, &masterchain_create_fee,
|
||||
|
@ -263,8 +263,8 @@ void TransactionEmulator::set_ignore_chksig(bool ignore_chksig) {
|
|||
ignore_chksig_ = ignore_chksig;
|
||||
}
|
||||
|
||||
void TransactionEmulator::set_config(block::Config &&config) {
|
||||
config_ = std::forward<block::Config>(config);
|
||||
void TransactionEmulator::set_config(std::shared_ptr<block::Config> config) {
|
||||
config_ = std::move(config);
|
||||
}
|
||||
|
||||
void TransactionEmulator::set_libs(vm::Dictionary &&libs) {
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
|
||||
namespace emulator {
|
||||
class TransactionEmulator {
|
||||
block::Config config_;
|
||||
std::shared_ptr<block::Config> config_;
|
||||
vm::Dictionary libraries_;
|
||||
int vm_log_verbosity_;
|
||||
ton::UnixTime unixtime_;
|
||||
|
@ -20,7 +20,7 @@ class TransactionEmulator {
|
|||
td::Ref<vm::Tuple> prev_blocks_info_;
|
||||
|
||||
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),
|
||||
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() {
|
||||
return config_;
|
||||
return *config_;
|
||||
}
|
||||
|
||||
ton::UnixTime get_unixtime() {
|
||||
|
@ -74,7 +74,7 @@ public:
|
|||
void set_lt(ton::LogicalTime lt);
|
||||
void set_rand_seed(td::BitArray<256>& rand_seed);
|
||||
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_debug_enabled(bool debug_enabled);
|
||||
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) {
|
||||
args_.set_address(address);
|
||||
args_.set_address(std::move(address));
|
||||
args_.set_now(unixtime);
|
||||
args_.set_balance(balance);
|
||||
args_.set_rand_seed(rand_seed);
|
||||
args_.set_rand_seed(std::move(rand_seed));
|
||||
if (config) {
|
||||
args_.set_config(config);
|
||||
args_.set_config(std::move(config));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -37,6 +37,10 @@ public:
|
|||
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) {
|
||||
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) {
|
||||
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) {
|
||||
|
@ -54,7 +59,8 @@ public:
|
|||
}
|
||||
|
||||
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());
|
||||
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();
|
||||
if (r_shard_account.is_error()) {
|
||||
|
@ -1995,7 +1995,7 @@ class RunEmulator : public TonlibQueryActor {
|
|||
return;
|
||||
}
|
||||
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_libs(std::move(libraries));
|
||||
trans_emulator.set_rand_seed(block_id_.rand_seed);
|
||||
|
|
Loading…
Reference in a new issue