1
0
Fork 0
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:
Marat 2024-07-02 11:40:57 +02:00 committed by GitHub
parent 0bf7febf9f
commit c15d878fee
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 352 additions and 18 deletions

View file

@ -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

View file

@ -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);
}

View file

@ -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

View file

@ -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

File diff suppressed because one or more lines are too long

View file

@ -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) {

View file

@ -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);

View file

@ -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));
}
};
}

View file

@ -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);