diff --git a/tests/common/database_fixture.cpp b/tests/common/database_fixture.cpp index 0be99d5f..5493a9e1 100644 --- a/tests/common/database_fixture.cpp +++ b/tests/common/database_fixture.cpp @@ -461,6 +461,25 @@ const asset_object& database_fixture::create_user_issued_asset( const string& na return db.get(ptx.operation_results[0].get()); } +const asset_object& database_fixture::create_user_issued_asset( const string& name, const account_object& issuer, uint16_t flags ) +{ + asset_create_operation creator; + creator.issuer = issuer.id; + creator.fee = asset(); + creator.symbol = name; + creator.common_options.max_supply = 0; + creator.precision = 2; + creator.common_options.core_exchange_rate = price({asset(1,1),asset(1)}); + creator.common_options.max_supply = GRAPHENE_MAX_SHARE_SUPPLY; + creator.common_options.flags = flags; + creator.common_options.issuer_permissions = flags; + trx.operations.push_back(std::move(creator)); + trx.validate(); + processed_transaction ptx = db.push_transaction(trx, ~0); + trx.operations.clear(); + return db.get(ptx.operation_results[0].get()); +} + void database_fixture::issue_uia( const account_object& recipient, asset amount ) { asset_issue_operation op({asset(),amount.asset_id(db).issuer, amount, recipient.id}); diff --git a/tests/common/database_fixture.hpp b/tests/common/database_fixture.hpp index 827dd081..8d5b1655 100644 --- a/tests/common/database_fixture.hpp +++ b/tests/common/database_fixture.hpp @@ -165,6 +165,9 @@ struct database_fixture { uint16_t market_fee_percent = 100 /*1%*/, uint16_t flags = charge_market_fee); const asset_object& create_user_issued_asset( const string& name ); + const asset_object& create_user_issued_asset( const string& name, + const account_object& issuer, + uint16_t flags ); void issue_uia( const account_object& recipient, asset amount ); diff --git a/tests/tests/uia_tests.cpp b/tests/tests/uia_tests.cpp index 61ef3350..8cec7514 100644 --- a/tests/tests/uia_tests.cpp +++ b/tests/tests/uia_tests.cpp @@ -70,6 +70,62 @@ BOOST_AUTO_TEST_CASE( create_advanced_uia ) } } +BOOST_AUTO_TEST_CASE( override_transfer_test ) +{ try { + ACTORS( (dan)(eric)(sam) ); + const asset_object& advanced = create_user_issued_asset( "ADVANCED", sam, override_authority ); + issue_uia( dan, advanced.amount( 1000 ) ); + trx.validate(); + db.push_transaction(trx, ~0); + trx.operations.clear(); + BOOST_REQUIRE_EQUAL( get_balance( dan, advanced ), 1000 ); + + trx.operations.clear(); + override_transfer_operation otrans{ asset(), advanced.issuer, dan.id, eric.id, advanced.amount(100) }; + trx.operations.push_back(otrans); + + BOOST_TEST_MESSAGE( "Require throwing without signature" ); + BOOST_REQUIRE_THROW( PUSH_TX( db, trx, 0 ), fc::exception); + BOOST_TEST_MESSAGE( "Require throwing with dan's signature" ); + trx.sign( dan_private_key ); + BOOST_REQUIRE_THROW( PUSH_TX( db, trx, 0 ), fc::exception); + BOOST_TEST_MESSAGE( "Pass with issuer's signature" ); + trx.signatures.clear(); + trx.sign( sam_private_key ); + PUSH_TX( db, trx, 0 ); + + BOOST_REQUIRE_EQUAL( get_balance( dan, advanced ), 900 ); + BOOST_REQUIRE_EQUAL( get_balance( eric, advanced ), 100 ); +} FC_LOG_AND_RETHROW() } + +BOOST_AUTO_TEST_CASE( override_transfer_test2 ) +{ try { + ACTORS( (dan)(eric)(sam) ); + const asset_object& advanced = create_user_issued_asset( "ADVANCED", sam, 0 ); + issue_uia( dan, advanced.amount( 1000 ) ); + trx.validate(); + db.push_transaction(trx, ~0); + trx.operations.clear(); + BOOST_REQUIRE_EQUAL( get_balance( dan, advanced ), 1000 ); + + trx.operations.clear(); + override_transfer_operation otrans{ asset(), advanced.issuer, dan.id, eric.id, advanced.amount(100) }; + trx.operations.push_back(otrans); + + BOOST_TEST_MESSAGE( "Require throwing without signature" ); + BOOST_REQUIRE_THROW( PUSH_TX( db, trx, 0 ), fc::exception); + BOOST_TEST_MESSAGE( "Require throwing with dan's signature" ); + trx.sign( dan_private_key ); + BOOST_REQUIRE_THROW( PUSH_TX( db, trx, 0 ), fc::exception); + BOOST_TEST_MESSAGE( "Fail because overide_authority flag is not set" ); + trx.signatures.clear(); + trx.sign( sam_private_key ); + BOOST_REQUIRE_THROW( PUSH_TX( db, trx, 0 ), fc::exception ); + + BOOST_REQUIRE_EQUAL( get_balance( dan, advanced ), 1000 ); + BOOST_REQUIRE_EQUAL( get_balance( eric, advanced ), 0 ); +} FC_LOG_AND_RETHROW() } + BOOST_AUTO_TEST_CASE( issue_whitelist_uia ) { try {