Skip to content

Commit

Permalink
add test cases
Browse files Browse the repository at this point in the history
  • Loading branch information
taokayan committed Apr 12, 2019
1 parent fee8d96 commit 8f3f41d
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 1 deletion.
36 changes: 36 additions & 0 deletions unittests/api_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2532,4 +2532,40 @@ BOOST_FIXTURE_TEST_CASE(action_ordinal_failtest3, TESTER) { try {

} FC_LOG_AND_RETHROW() }

/*************************************************************************************
+ * get_sender_test test cases
+ *************************************************************************************/
BOOST_FIXTURE_TEST_CASE(get_sender_test, TESTER) { try {

produce_blocks(1);
create_account(N(testapi) );
create_account(N(testapi2), N(testapi), true, true );

set_code( N(testapi), contracts::test_api_wasm() );
produce_blocks(1);
set_code( N(testapi2), contracts::test_api_wasm() );
produce_blocks(1);

using uint128_t = eosio::chain::uint128_t;

uint128_t data = (N(testapi2) | ((uint128_t)(N(testapi)) << 64));
CALL_TEST_FUNCTION( *this, "test_action", "get_sender_send_inline", fc::raw::pack(data) );

data = (N(testapi2) | ((uint128_t)(N(testapi2)) << 64));
BOOST_CHECK_THROW(CALL_TEST_FUNCTION( *this, "test_action", "get_sender_send_inline", fc::raw::pack(data)), eosio_assert_message_exception);

data = (N(testapi2) | ((uint128_t)(N(testapi)) << 64));
CALL_TEST_FUNCTION( *this, "test_action", "get_sender_notify", fc::raw::pack(data) );

data = (N(testapi2) | ((uint128_t)(N(testapi2)) << 64));
BOOST_CHECK_THROW(CALL_TEST_FUNCTION( *this, "test_action", "get_sender_notify", fc::raw::pack(data)), eosio_assert_message_exception);

data = ((uint128_t)1 | N(testapi2) | ((uint128_t)(N(testapi2)) << 64));
CALL_TEST_FUNCTION( *this, "test_action", "get_sender_notify", fc::raw::pack(data) );

data = ((uint128_t)1 | N(testapi2) | ((uint128_t)(N(testapi)) << 64));
BOOST_CHECK_THROW(CALL_TEST_FUNCTION( *this, "test_action", "get_sender_notify", fc::raw::pack(data)), eosio_assert_message_exception);

} FC_LOG_AND_RETHROW() }

BOOST_AUTO_TEST_SUITE_END()
55 changes: 55 additions & 0 deletions unittests/test-contracts/test_api/test_action.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,15 @@

#include "test_api.hpp"

namespace eosio {
namespace internal_use_do_not_use {
extern "C" {
__attribute__((eosio_wasm_import))
uint64_t get_sender();
}
}
}

using namespace eosio;

void test_action::read_action_normal() {
Expand Down Expand Up @@ -342,3 +351,49 @@ void test_action::test_action_ordinal_foo(uint64_t receiver, uint64_t code, uint
void test_action::test_action_ordinal_bar(uint64_t receiver, uint64_t code, uint64_t action) {
print("exec 11");
}

void test_action::get_sender_send_inline() {

eosio_assert(internal_use_do_not_use::get_sender() == 0, "assert_sender failed");

uint128_t tmp;
read_action_data( &tmp, sizeof(tmp) );

uint64_t to_acc = (uint64_t)tmp;
uint64_t sender_acc = (uint64_t)(tmp >> 64);

eosio::action act1(std::vector<permission_level>(), name(to_acc),
name(WASM_TEST_ACTION("test_action", "assert_sender")),
std::tuple<uint64_t>(sender_acc));
act1.send();
}

void test_action::assert_sender() {
uint64_t sender;
read_action_data( &sender, sizeof(sender) );
eosio_assert(internal_use_do_not_use::get_sender() == sender, "assert_sender failed");
}

void test_action::get_sender_notify(uint64_t receiver, uint64_t code, uint64_t action) {
uint128_t tmp;
read_action_data( &tmp, sizeof(tmp) );

uint64_t to_acc = ((uint64_t)tmp & 0xfffffffffffffffeull);
uint64_t sender_acc = (uint64_t)(tmp >> 64);
bool send_inline = (tmp & 1);

if (receiver == code) { // main
eosio_assert(internal_use_do_not_use::get_sender() == 0, "assert_sender failed 1");
eosio::require_recipient(name(to_acc));
} else { // in notification
if (!send_inline) {
eosio_assert(internal_use_do_not_use::get_sender() == sender_acc, "assert_sender failed 2");
} else {
eosio::action act1(std::vector<permission_level>(), name(to_acc),
name(WASM_TEST_ACTION("test_action", "assert_sender")),
std::tuple<uint64_t>(sender_acc));
act1.send();
}
}
}

7 changes: 6 additions & 1 deletion unittests/test-contracts/test_api/test_api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,9 @@ extern "C" {
}
WASM_TEST_HANDLER( test_action, assert_true_cf );

if ( action != WASM_TEST_ACTION("test_transaction", "stateful_api") && action != WASM_TEST_ACTION("test_transaction", "context_free_api") )
if ( action != WASM_TEST_ACTION("test_transaction", "stateful_api") &&
action != WASM_TEST_ACTION("test_transaction", "context_free_api") &&
action != WASM_TEST_ACTION("test_action", "assert_sender"))
require_auth(code);

//test_types
Expand Down Expand Up @@ -70,6 +72,9 @@ extern "C" {
WASM_TEST_HANDLER_EX( test_action, test_action_ordinal4 );
WASM_TEST_HANDLER_EX( test_action, test_action_ordinal_foo );
WASM_TEST_HANDLER_EX( test_action, test_action_ordinal_bar );
WASM_TEST_HANDLER ( test_action, get_sender_send_inline );
WASM_TEST_HANDLER ( test_action, assert_sender );
WASM_TEST_HANDLER_EX( test_action, get_sender_notify );

// test named actions
// We enforce action name matches action data type name, so name mangling will not work for these tests.
Expand Down
3 changes: 3 additions & 0 deletions unittests/test-contracts/test_api/test_api.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,9 @@ struct test_action {
static void test_action_ordinal4(uint64_t receiver, uint64_t code, uint64_t action);
static void test_action_ordinal_foo(uint64_t receiver, uint64_t code, uint64_t action);
static void test_action_ordinal_bar(uint64_t receiver, uint64_t code, uint64_t action);
static void get_sender_send_inline();
static void assert_sender();
static void get_sender_notify(uint64_t receiver, uint64_t code, uint64_t action);
};

struct test_db {
Expand Down
Binary file modified unittests/test-contracts/test_api/test_api.wasm
Binary file not shown.

0 comments on commit 8f3f41d

Please sign in to comment.