Skip to content

Commit

Permalink
Merge pull request #649 from eosnetworkfoundation/backport_test_delta…
Browse files Browse the repository at this point in the history
…s_contract_several_rows

[3.2] Backported contract deltas test
  • Loading branch information
ndcgundlach authored Jul 19, 2022
2 parents d6c3e25 + 986d835 commit 4ec35a5
Show file tree
Hide file tree
Showing 5 changed files with 180 additions and 4 deletions.
84 changes: 82 additions & 2 deletions unittests/state_history_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@ class table_deltas_tester : public tester {
using tester::tester;
using deltas_vector = vector<eosio::state_history::table_delta>;

pair<bool, deltas_vector::iterator> find_table_delta(const std::string &name) {
v = eosio::state_history::create_deltas(control->db(), false);;
pair<bool, deltas_vector::iterator> find_table_delta(const std::string &name, bool full_snapshot = false) {
v = eosio::state_history::create_deltas(control->db(), full_snapshot);;

auto find_by_name = [&name](const auto& x) {
return x.name == name;
Expand Down Expand Up @@ -452,4 +452,84 @@ BOOST_AUTO_TEST_CASE(test_deltas_resources_history) {
BOOST_REQUIRE(it==v.end());
}

BOOST_AUTO_TEST_CASE(test_deltas_contract_several_rows){
table_deltas_tester chain(setup_policy::full);

chain.produce_block();
chain.create_account("tester"_n);

chain.set_code("tester"_n, contracts::get_table_test_wasm());
chain.set_abi("tester"_n, contracts::get_table_test_abi().data());

chain.produce_blocks(2);

auto trace = chain.push_action("tester"_n, "addhashobj"_n, "tester"_n, mutable_variant_object()("hashinput", "hello"));
BOOST_REQUIRE_EQUAL(transaction_receipt::executed, trace->receipt->status);

trace = chain.push_action("tester"_n, "addhashobj"_n, "tester"_n, mutable_variant_object()("hashinput", "world"));
BOOST_REQUIRE_EQUAL(transaction_receipt::executed, trace->receipt->status);

trace = chain.push_action("tester"_n, "addhashobj"_n, "tester"_n, mutable_variant_object()("hashinput", "!"));
BOOST_REQUIRE_EQUAL(transaction_receipt::executed, trace->receipt->status);

trace = chain.push_action("tester"_n, "addnumobj"_n, "tester"_n, mutable_variant_object()("input", 2));
BOOST_REQUIRE_EQUAL(transaction_receipt::executed, trace->receipt->status);

trace = chain.push_action("tester"_n, "addnumobj"_n, "tester"_n, mutable_variant_object()("input", 3));
BOOST_REQUIRE_EQUAL(transaction_receipt::executed, trace->receipt->status);

trace = chain.push_action("tester"_n, "addnumobj"_n, "tester"_n, mutable_variant_object()("input", 4));
BOOST_REQUIRE_EQUAL(transaction_receipt::executed, trace->receipt->status);

// Spot onto contract_row with full snapshot
auto result = chain.find_table_delta("contract_row", true);
BOOST_REQUIRE(result.first);
auto &it_contract_row = result.second;
BOOST_REQUIRE_EQUAL(it_contract_row->rows.obj.size(), 8);
auto contract_rows = chain.deserialize_data<eosio::ship_protocol::contract_row_v0, eosio::ship_protocol::contract_row>(it_contract_row);

std::multiset<std::string> expected_contract_row_table_names {"abihash", "abihash", "hashobjs", "hashobjs", "hashobjs", "numobjs", "numobjs", "numobjs"};

std::multiset<uint64_t> expected_contract_row_table_primary_keys {6138663577826885632,14605619288908759040, 0, 1 ,2, 0, 1, 2};
std::multiset<std::string> result_contract_row_table_names;
std::multiset<uint64_t> result_contract_row_table_primary_keys;
for(auto &contract_row : contract_rows) {
result_contract_row_table_names.insert(contract_row.table.to_string());
result_contract_row_table_primary_keys.insert(contract_row.primary_key);
}
BOOST_REQUIRE(expected_contract_row_table_names == result_contract_row_table_names);
BOOST_REQUIRE(expected_contract_row_table_primary_keys == result_contract_row_table_primary_keys);

chain.produce_block();

trace = chain.push_action("tester"_n, "erasenumobj"_n, "tester"_n, mutable_variant_object()("id", 1));
BOOST_REQUIRE_EQUAL(transaction_receipt::executed, trace->receipt->status);

trace = chain.push_action("tester"_n, "erasenumobj"_n, "tester"_n, mutable_variant_object()("id", 0));
BOOST_REQUIRE_EQUAL(transaction_receipt::executed, trace->receipt->status);

result = chain.find_table_delta("contract_row");
BOOST_REQUIRE(result.first);
auto &it_contract_row_after_delete = result.second;
BOOST_REQUIRE_EQUAL(it_contract_row->rows.obj.size(), 2);
contract_rows = chain.deserialize_data<eosio::ship_protocol::contract_row_v0, eosio::ship_protocol::contract_row>(it_contract_row);

for(int i=0; i < contract_rows.size(); i++) {
BOOST_REQUIRE_EQUAL(it_contract_row->rows.obj[i].first, 0);
BOOST_REQUIRE_EQUAL(contract_rows[i].table.to_string(), "numobjs");
}

result = chain.find_table_delta("contract_index_double");
BOOST_REQUIRE(result.first);
auto &it_contract_index_double = result.second;
BOOST_REQUIRE_EQUAL(it_contract_index_double->rows.obj.size(), 2);
auto contract_index_double_elems = chain.deserialize_data<eosio::ship_protocol::contract_index_double_v0, eosio::ship_protocol::contract_index_double>(it_contract_index_double);

for(int i=0; i < contract_index_double_elems.size(); i++) {
BOOST_REQUIRE_EQUAL(it_contract_index_double->rows.obj[i].first, 0);
BOOST_REQUIRE_EQUAL(contract_index_double_elems[i].table.to_string(), "numobjs.....2");
}

}

BOOST_AUTO_TEST_SUITE_END()
35 changes: 33 additions & 2 deletions unittests/test-contracts/get_table_test/get_table_test.abi
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"____comment": "This file was generated with eosio-abigen. DO NOT EDIT ",
"version": "eosio::abi/1.1",
"version": "eosio::abi/1.2",
"types": [],
"structs": [
{
Expand All @@ -23,6 +23,16 @@
}
]
},
{
"name": "erasenumobj",
"base": "",
"fields": [
{
"name": "id",
"type": "uint64"
}
]
},
{
"name": "hashobj",
"base": "",
Expand All @@ -45,6 +55,16 @@
}
]
},
{
"name": "modifynumobj",
"base": "",
"fields": [
{
"name": "id",
"type": "uint64"
}
]
},
{
"name": "numobj",
"base": "",
Expand Down Expand Up @@ -82,6 +102,16 @@
"name": "addnumobj",
"type": "addnumobj",
"ricardian_contract": ""
},
{
"name": "erasenumobj",
"type": "erasenumobj",
"ricardian_contract": ""
},
{
"name": "modifynumobj",
"type": "modifynumobj",
"ricardian_contract": ""
}
],
"tables": [
Expand All @@ -101,5 +131,6 @@
}
],
"ricardian_clauses": [],
"variants": []
"variants": [],
"action_results": []
}
15 changes: 15 additions & 0 deletions unittests/test-contracts/get_table_test/get_table_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,21 @@ void get_table_test::addnumobj(uint64_t input) {
});
}

void get_table_test::modifynumobj(uint64_t id) {
numobjs numobjs_table( _self, _self.value );
numobjs_table.modify(numobjs_table.get(id), _self, [&](auto& obj) {
obj.sec64++;
});
}

void get_table_test::erasenumobj(uint64_t id) {
numobjs numobjs_table( _self, _self.value );
auto iterator = numobjs_table.find(id);
check(iterator != numobjs_table.end(), "Record does not exist.");
numobjs_table.erase(iterator);
}


void get_table_test::addhashobj(std::string hashinput) {
hashobjs hashobjs_table( _self, _self.value );
hashobjs_table.emplace(_self, [&]( auto& obj ) {
Expand Down
50 changes: 50 additions & 0 deletions unittests/test-contracts/get_table_test/get_table_test.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,50 @@
#include <eosio/eosio.hpp>
#include <eosio/crypto.hpp>


namespace eosio {
namespace internal_use_do_not_use {
extern "C" {
__attribute__((eosio_wasm_import))
int32_t alt_bn128_add( const char* op1_data, uint32_t op1_length,
const char* op2_data, uint32_t op2_length,
char* result , uint32_t result_length);

__attribute__((eosio_wasm_import))
int32_t alt_bn128_mul( const char* op1_data, uint32_t op1_length,
const char* op2_data, uint32_t op2_length,
char* result , uint32_t result_length);

__attribute__((eosio_wasm_import))
int32_t alt_bn128_pair( const char* op1_data, uint32_t op1_length);

__attribute__((eosio_wasm_import))
int32_t mod_exp(const char* base_data, uint32_t base_length,
const char* exp_data, uint32_t exp_length,
const char* mod_data, uint32_t mod_length,
char* result, uint32_t result_length);

__attribute__((eosio_wasm_import))
int32_t blake2_f( uint32_t rounds,
const char* state, uint32_t len_state,
const char* message, uint32_t len_message,
const char* t0_offset, uint32_t len_t0_offset,
const char* t1_offset, uint32_t len_t1_offset,
int32_t final,
char* result, uint32_t len_result);

__attribute__((eosio_wasm_import))
void sha3( const char* input_data, uint32_t input_length,
char* output_data, uint32_t output_length, int32_t keccak);

__attribute__((eosio_wasm_import))
int32_t k1_recover( const char* signature_data, uint32_t signature_length,
const char* digest_data, uint32_t digest_length,
char* output_data, uint32_t output_length);
}
}
}

using namespace eosio;

class [[eosio::contract]] get_table_test : public eosio::contract {
Expand Down Expand Up @@ -55,6 +99,12 @@ class [[eosio::contract]] get_table_test : public eosio::contract {
[[eosio::action]]
void addnumobj(uint64_t input);

[[eosio::action]]
void modifynumobj(uint64_t id);

[[eosio::action]]
void erasenumobj(uint64_t id);


[[eosio::action]]
void addhashobj(std::string hashinput);
Expand Down
Binary file modified unittests/test-contracts/get_table_test/get_table_test.wasm
Binary file not shown.

0 comments on commit 4ec35a5

Please sign in to comment.