未验证 提交 22923514 编写于 作者: W wanderingbort 提交者: GitHub

Merge pull request #1380 from cj-oci/improveTestingFixture-stat576

Test framework improvement - stat576
...@@ -9,20 +9,18 @@ namespace eosio { namespace testing { ...@@ -9,20 +9,18 @@ namespace eosio { namespace testing {
using namespace eosio::chain; using namespace eosio::chain;
/** /**
* @class tester * @class tester
* @brief provides utility function to simplify the creation of unit tests * @brief provides utility function to simplify the creation of unit tests
*/ */
class tester { class base_tester {
public: public:
typedef string action_result; typedef string action_result;
tester(chain_controller::runtime_limits limits = chain_controller::runtime_limits(), bool process_genesis = true); base_tester(chain_controller::runtime_limits limits = chain_controller::runtime_limits());
void close(); void close();
void open(); void open();
void push_genesis_block();
signed_block produce_block( fc::microseconds skip_time = fc::milliseconds(config::block_interval_ms) ); signed_block produce_block( fc::microseconds skip_time = fc::milliseconds(config::block_interval_ms) );
void produce_blocks( uint32_t n = 1 ); void produce_blocks( uint32_t n = 1 );
...@@ -105,6 +103,13 @@ namespace eosio { namespace testing { ...@@ -105,6 +103,13 @@ namespace eosio { namespace testing {
map<transaction_id_type, transaction_receipt> chain_transactions; map<transaction_id_type, transaction_receipt> chain_transactions;
}; };
class tester : public base_tester {
public:
tester(chain_controller::runtime_limits limits = chain_controller::runtime_limits());
void push_genesis_block();
};
/** /**
* Utility predicate to check whether an FC_ASSERT message ends with a given string * Utility predicate to check whether an FC_ASSERT message ends with a given string
*/ */
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
namespace eosio { namespace testing { namespace eosio { namespace testing {
tester::tester(chain_controller::runtime_limits limits, bool process_genesis) { base_tester::base_tester(chain_controller::runtime_limits limits) {
cfg.block_log_dir = tempdir.path() / "blocklog"; cfg.block_log_dir = tempdir.path() / "blocklog";
cfg.shared_memory_dir = tempdir.path() / "shared"; cfg.shared_memory_dir = tempdir.path() / "shared";
cfg.shared_memory_size = 1024*1024*8; cfg.shared_memory_size = 1024*1024*8;
...@@ -27,28 +27,22 @@ namespace eosio { namespace testing { ...@@ -27,28 +27,22 @@ namespace eosio { namespace testing {
cfg.genesis.initial_key = get_public_key( config::system_account_name, "active" ); cfg.genesis.initial_key = get_public_key( config::system_account_name, "active" );
cfg.limits = limits; cfg.limits = limits;
open(); open();
if (process_genesis)
push_genesis_block();
} }
void tester::push_genesis_block() { public_key_type base_tester::get_public_key( name keyname, string role ) const {
set_code(config::system_account_name, test_system_wast);
set_abi(config::system_account_name, test_system_abi);
}
public_key_type tester::get_public_key( name keyname, string role ) const {
return get_private_key( keyname, role ).get_public_key(); return get_private_key( keyname, role ).get_public_key();
} }
private_key_type tester::get_private_key( name keyname, string role ) const { private_key_type base_tester::get_private_key( name keyname, string role ) const {
return private_key_type::regenerate<fc::ecc::private_key_shim>(fc::sha256::hash(string(keyname)+role)); return private_key_type::regenerate<fc::ecc::private_key_shim>(fc::sha256::hash(string(keyname)+role));
} }
void tester::close() { void base_tester::close() {
control.reset(); control.reset();
chain_transactions.clear(); chain_transactions.clear();
} }
void tester::open() {
void base_tester::open() {
control.reset( new chain_controller(cfg) ); control.reset( new chain_controller(cfg) );
chain_transactions.clear(); chain_transactions.clear();
control->applied_block.connect([this]( const block_trace& trace ){ control->applied_block.connect([this]( const block_trace& trace ){
...@@ -64,7 +58,7 @@ namespace eosio { namespace testing { ...@@ -64,7 +58,7 @@ namespace eosio { namespace testing {
}); });
} }
signed_block tester::produce_block( fc::microseconds skip_time ) { signed_block base_tester::produce_block( fc::microseconds skip_time ) {
auto head_time = control->head_block_time(); auto head_time = control->head_block_time();
auto next_time = head_time + skip_time; auto next_time = head_time + skip_time;
uint32_t slot = control->get_slot_at_time( next_time ); uint32_t slot = control->get_slot_at_time( next_time );
...@@ -74,18 +68,16 @@ namespace eosio { namespace testing { ...@@ -74,18 +68,16 @@ namespace eosio { namespace testing {
return control->generate_block( next_time, sch_pro, priv_key, skip_missed_block_penalty ); return control->generate_block( next_time, sch_pro, priv_key, skip_missed_block_penalty );
} }
void base_tester::produce_blocks( uint32_t n ) {
void tester::produce_blocks( uint32_t n ) {
for( uint32_t i = 0; i < n; ++i ) for( uint32_t i = 0; i < n; ++i )
produce_block(); produce_block();
} }
void tester::set_tapos( signed_transaction& trx ) const { void base_tester::set_tapos( signed_transaction& trx ) const {
trx.set_reference_block( control->head_block_id() ); trx.set_reference_block( control->head_block_id() );
} }
void base_tester::create_account( account_name a, account_name creator, bool multisig ) {
void tester::create_account( account_name a, account_name creator, bool multisig ) {
signed_transaction trx; signed_transaction trx;
set_tapos( trx ); set_tapos( trx );
...@@ -111,16 +103,16 @@ namespace eosio { namespace testing { ...@@ -111,16 +103,16 @@ namespace eosio { namespace testing {
push_transaction( trx ); push_transaction( trx );
} }
transaction_trace tester::push_transaction( packed_transaction& trx ) { transaction_trace base_tester::push_transaction( packed_transaction& trx ) {
return control->push_transaction( trx ); return control->push_transaction( trx );
} }
transaction_trace tester::push_transaction( signed_transaction& trx ) { transaction_trace base_tester::push_transaction( signed_transaction& trx ) {
auto ptrx = packed_transaction(trx); auto ptrx = packed_transaction(trx);
return push_transaction( ptrx ); return push_transaction( ptrx );
} }
tester::action_result tester::push_action(action&& cert_act, uint64_t authorizer) { base_tester::action_result base_tester::push_action(action&& cert_act, uint64_t authorizer) {
signed_transaction trx; signed_transaction trx;
if (authorizer) { if (authorizer) {
cert_act.authorization = vector<permission_level>{{authorizer, config::active_name}}; cert_act.authorization = vector<permission_level>{{authorizer, config::active_name}};
...@@ -140,7 +132,33 @@ namespace eosio { namespace testing { ...@@ -140,7 +132,33 @@ namespace eosio { namespace testing {
return success(); return success();
} }
transaction_trace tester::push_reqauth( account_name from, const vector<permission_level>& auths, const vector<private_key_type>& keys ) { transaction_trace base_tester::push_action( const account_name& code,
const action_name& acttype,
const account_name& actor,
const variant_object& data
)
{ try {
chain::contracts::abi_serializer abis( control->get_database().get<account_object,by_name>(code).get_abi() );
string action_type_name = abis.get_action_type(acttype);
action act;
act.account = code;
act.name = acttype;
act.authorization = vector<permission_level>{{actor, config::active_name}};
act.data = abis.variant_to_binary(action_type_name, data);
wdump((act));
signed_transaction trx;
trx.actions.emplace_back(std::move(act));
set_tapos(trx);
trx.sign(get_private_key(actor, "active"), chain_id_type());
wdump((get_public_key( actor, "active" )));;
return push_transaction(trx);
} FC_CAPTURE_AND_RETHROW( (code)(acttype)(actor) ) }
transaction_trace base_tester::push_reqauth( account_name from, const vector<permission_level>& auths, const vector<private_key_type>& keys ) {
variant pretty_trx = fc::mutable_variant_object() variant pretty_trx = fc::mutable_variant_object()
("actions", fc::variants({ ("actions", fc::variants({
fc::mutable_variant_object() fc::mutable_variant_object()
...@@ -161,8 +179,7 @@ namespace eosio { namespace testing { ...@@ -161,8 +179,7 @@ namespace eosio { namespace testing {
return push_transaction( trx ); return push_transaction( trx );
} }
transaction_trace base_tester::push_nonce(account_name from, const string& v) {
transaction_trace tester::push_nonce(account_name from, const string& v) {
variant pretty_trx = fc::mutable_variant_object() variant pretty_trx = fc::mutable_variant_object()
("actions", fc::variants({ ("actions", fc::variants({
fc::mutable_variant_object() fc::mutable_variant_object()
...@@ -187,11 +204,11 @@ namespace eosio { namespace testing { ...@@ -187,11 +204,11 @@ namespace eosio { namespace testing {
return push_transaction( trx ); return push_transaction( trx );
} }
transaction_trace tester::transfer( account_name from, account_name to, string amount, string memo, account_name currency ) { transaction_trace base_tester::transfer( account_name from, account_name to, string amount, string memo, account_name currency ) {
return transfer( from, to, asset::from_string(amount), memo, currency ); return transfer( from, to, asset::from_string(amount), memo, currency );
} }
transaction_trace tester::transfer( account_name from, account_name to, asset amount, string memo, account_name currency ) { transaction_trace base_tester::transfer( account_name from, account_name to, asset amount, string memo, account_name currency ) {
variant pretty_trx = fc::mutable_variant_object() variant pretty_trx = fc::mutable_variant_object()
("actions", fc::variants({ ("actions", fc::variants({
fc::mutable_variant_object() fc::mutable_variant_object()
...@@ -219,7 +236,7 @@ namespace eosio { namespace testing { ...@@ -219,7 +236,7 @@ namespace eosio { namespace testing {
return push_transaction( trx ); return push_transaction( trx );
} }
void tester::set_authority( account_name account, void base_tester::set_authority( account_name account,
permission_name perm, permission_name perm,
authority auth, authority auth,
permission_name parent ) { try { permission_name parent ) { try {
...@@ -237,7 +254,7 @@ namespace eosio { namespace testing { ...@@ -237,7 +254,7 @@ namespace eosio { namespace testing {
push_transaction( trx ); push_transaction( trx );
} FC_CAPTURE_AND_RETHROW( (account)(perm)(auth)(parent) ) } } FC_CAPTURE_AND_RETHROW( (account)(perm)(auth)(parent) ) }
void tester::set_code( account_name account, const char* wast ) try { void base_tester::set_code( account_name account, const char* wast ) try {
const auto assemble = [](const char* wast) -> vector<unsigned char> { const auto assemble = [](const char* wast) -> vector<unsigned char> {
using namespace IR; using namespace IR;
using namespace WAST; using namespace WAST;
...@@ -295,7 +312,7 @@ namespace eosio { namespace testing { ...@@ -295,7 +312,7 @@ namespace eosio { namespace testing {
push_transaction( trx ); push_transaction( trx );
} FC_CAPTURE_AND_RETHROW( (account)(wast) ) } FC_CAPTURE_AND_RETHROW( (account)(wast) )
void tester::set_abi( account_name account, const char* abi_json) { void base_tester::set_abi( account_name account, const char* abi_json) {
auto abi = fc::json::from_string(abi_json).template as<contracts::abi_def>(); auto abi = fc::json::from_string(abi_json).template as<contracts::abi_def>();
signed_transaction trx; signed_transaction trx;
trx.actions.emplace_back( vector<permission_level>{{account,config::active_name}}, trx.actions.emplace_back( vector<permission_level>{{account,config::active_name}},
...@@ -309,18 +326,18 @@ namespace eosio { namespace testing { ...@@ -309,18 +326,18 @@ namespace eosio { namespace testing {
push_transaction( trx ); push_transaction( trx );
} }
bool tester::chain_has_transaction( const transaction_id_type& txid ) const { bool base_tester::chain_has_transaction( const transaction_id_type& txid ) const {
return chain_transactions.count(txid) != 0; return chain_transactions.count(txid) != 0;
} }
const transaction_receipt& tester::get_transaction_receipt( const transaction_id_type& txid ) const { const transaction_receipt& base_tester::get_transaction_receipt( const transaction_id_type& txid ) const {
return chain_transactions.at(txid); return chain_transactions.at(txid);
} }
/** /**
* Reads balance as stored by generic_currency contract * Reads balance as stored by generic_currency contract
*/ */
asset tester::get_currency_balance( const account_name& code, asset base_tester::get_currency_balance( const account_name& code,
const symbol& asset_symbol, const symbol& asset_symbol,
const account_name& account ) const { const account_name& account ) const {
const auto& db = control->get_database(); const auto& db = control->get_database();
...@@ -338,26 +355,26 @@ namespace eosio { namespace testing { ...@@ -338,26 +355,26 @@ namespace eosio { namespace testing {
return asset(result, asset_symbol); return asset(result, asset_symbol);
} }
vector<uint8_t> tester::to_uint8_vector(const string& s) { vector<uint8_t> base_tester::to_uint8_vector(const string& s) {
vector<uint8_t> v(s.size()); vector<uint8_t> v(s.size());
copy(s.begin(), s.end(), v.begin()); copy(s.begin(), s.end(), v.begin());
return v; return v;
}; };
vector<uint8_t> tester::to_uint8_vector(uint64_t x) { vector<uint8_t> base_tester::to_uint8_vector(uint64_t x) {
vector<uint8_t> v(sizeof(x)); vector<uint8_t> v(sizeof(x));
*reinterpret_cast<uint64_t*>(v.data()) = x; *reinterpret_cast<uint64_t*>(v.data()) = x;
return v; return v;
}; };
uint64_t tester::to_uint64(fc::variant x) { uint64_t base_tester::to_uint64(fc::variant x) {
vector<uint8_t> blob; vector<uint8_t> blob;
fc::from_variant<uint8_t>(x, blob); fc::from_variant<uint8_t>(x, blob);
FC_ASSERT(8 == blob.size()); FC_ASSERT(8 == blob.size());
return *reinterpret_cast<uint64_t*>(blob.data()); return *reinterpret_cast<uint64_t*>(blob.data());
} }
string tester::to_string(fc::variant x) { string base_tester::to_string(fc::variant x) {
vector<uint8_t> v; vector<uint8_t> v;
fc::from_variant<uint8_t>(x, v); fc::from_variant<uint8_t>(x, v);
string s(v.size(), 0); string s(v.size(), 0);
...@@ -365,30 +382,14 @@ namespace eosio { namespace testing { ...@@ -365,30 +382,14 @@ namespace eosio { namespace testing {
return s; return s;
} }
transaction_trace tester::push_action( const account_name& code, tester::tester(chain_controller::runtime_limits limits)
const action_name& acttype, : base_tester(limits) {
const account_name& actor, push_genesis_block();
const variant_object& data }
)
{ try {
chain::contracts::abi_serializer abis( control->get_database().get<account_object,by_name>(code).get_abi() );
string action_type_name = abis.get_action_type(acttype);
action act;
act.account = code;
act.name = acttype;
act.authorization = vector<permission_level>{{actor, config::active_name}};
act.data = abis.variant_to_binary(action_type_name, data);
wdump((act));
signed_transaction trx;
trx.actions.emplace_back(std::move(act));
set_tapos(trx);
trx.sign(get_private_key(actor, "active"), chain_id_type());
wdump((get_public_key( actor, "active" )));;
return push_transaction(trx); void tester::push_genesis_block() {
} FC_CAPTURE_AND_RETHROW( (code)(acttype)(actor) ) } set_code(config::system_account_name, test_system_wast);
set_abi(config::system_account_name, test_system_abi);
}
} } /// eosio::test } } /// eosio::test
...@@ -36,7 +36,8 @@ BOOST_AUTO_TEST_CASE( schedule_test ) { try { ...@@ -36,7 +36,8 @@ BOOST_AUTO_TEST_CASE( schedule_test ) { try {
} FC_LOG_AND_RETHROW() }/// schedule_test } FC_LOG_AND_RETHROW() }/// schedule_test
BOOST_AUTO_TEST_CASE( push_block ) { try { BOOST_AUTO_TEST_CASE( push_block ) { try {
tester test1, test2(chain_controller::runtime_limits(), false); tester test1;
base_tester test2;
for (uint32 i = 0; i < 1000; ++i) { for (uint32 i = 0; i < 1000; ++i) {
test2.control->push_block(test1.produce_block()); test2.control->push_block(test1.produce_block());
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册