diff --git a/src/test/app/Import_test.cpp b/src/test/app/Import_test.cpp index 22506cae3..60b4f473f 100644 --- a/src/test/app/Import_test.cpp +++ b/src/test/app/Import_test.cpp @@ -218,6 +218,13 @@ class Import_test : public beast::unit_test::suite return STTx(ttUNL_REPORT, fill); } + bool + hasUNLReport(jtx::Env const& env) + { + auto const slep = env.le(keylet::UNLReport()); + return slep != nullptr; + } + void testComputeStartingBalance(FeatureBitset features) { @@ -2282,6 +2289,7 @@ class Import_test : public beast::unit_test::suite // tefPAST_IMPORT_SEQ { test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; + auto const feeDrops = env.current()->fees().base; // burn 10'000 xrp auto const master = Account("masterpassphrase"); @@ -2293,8 +2301,10 @@ class Import_test : public beast::unit_test::suite env.close(); env(import(alice, loadXpop(ImportTCAccountSet::w_seed)), + fee(feeDrops * 10), ter(tesSUCCESS)); env(import(alice, loadXpop(ImportTCAccountSet::min)), + fee(feeDrops * 10), ter(tefPAST_IMPORT_SEQ)); } @@ -2331,6 +2341,7 @@ class Import_test : public beast::unit_test::suite // import vl sequence already used, bailing. { test::jtx::Env env{*this, makeNetworkVLConfig(21337, keys)}; + auto const feeDrops = env.current()->fees().base; std::string const pkString = "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1" @@ -2351,21 +2362,21 @@ class Import_test : public beast::unit_test::suite Json::Value const xpop1_1 = loadXpop(ImportTCAccountSet::unl_seq_1_1); Json::Value const tx_1_1 = import(alice, xpop1_1); - env(tx_1_1, ter(tesSUCCESS)); + env(tx_1_1, fee(feeDrops * 10), ter(tesSUCCESS)); BEAST_EXPECT(importVLSequence(env, pk) == 1); Json::Value const xpop2_1 = loadXpop(ImportTCAccountSet::unl_seq_2_1); Json::Value const tx_2_1 = import(bob, xpop2_1); - env(tx_2_1, ter(tesSUCCESS)); + env(tx_2_1, fee(feeDrops * 10), ter(tesSUCCESS)); BEAST_EXPECT(importVLSequence(env, pk) == 2); Json::Value const xpop1_2 = loadXpop(ImportTCAccountSet::unl_seq_1_2); Json::Value const tx_1_2 = import(alice, xpop1_2); - env(tx_1_2, ter(tefPAST_IMPORT_VL_SEQ)); + env(tx_1_2, fee(feeDrops * 10), ter(tefPAST_IMPORT_VL_SEQ)); } // tesSUCCESS @@ -2384,6 +2395,7 @@ class Import_test : public beast::unit_test::suite // import vl key not recognized, bailing. { test::jtx::Env env{*this, makeNetworkConfig(21337)}; + auto const feeDrops = env.current()->fees().base; auto const alice = Account("alice"); env.fund(XRP(1000), alice); @@ -2391,7 +2403,7 @@ class Import_test : public beast::unit_test::suite Json::Value const tmpXpop = loadXpop(ImportTCAccountSet::w_seed); Json::Value const tx = import(alice, tmpXpop); - env(tx, ter(telIMPORT_VL_KEY_NOT_RECOGNISED)); + env(tx, fee(feeDrops * 10), ter(telIMPORT_VL_KEY_NOT_RECOGNISED)); } } @@ -4545,12 +4557,9 @@ class Import_test : public beast::unit_test::suite env.close(); } - // test bad IMPORT_VL_KEYS has UNLReport + // test no IMPORT_VL_KEYS has UNLReport { - std::vector const badVLKeys = { - "ED74D4036C6591A4BDF9C54CEFA39B996A5DCE5F86D11FDA1874481CE9D5A1" - "CDC2"}; - test::jtx::Env env{*this, makeNetworkVLConfig(21337, badVLKeys)}; + test::jtx::Env env{*this, makeNetworkConfig(21337)}; auto const feeDrops = env.current()->fees().base; @@ -4618,6 +4627,8 @@ class Import_test : public beast::unit_test::suite // close the ledger env.close(); + BEAST_EXPECT(hasUNLReport(env) == true); + // Test Import env(import(alice, loadXpop(ImportTCAccountSet::w_seed)), fee(feeDrops * 10), @@ -5325,6 +5336,40 @@ class Import_test : public beast::unit_test::suite } } + void + testRPCFee(FeatureBitset features) + { + testcase("rpc fee"); + + using namespace test::jtx; + using namespace std::literals; + + test::jtx::Env env{*this, makeNetworkConfig(21337)}; + auto const feeDrops = env.current()->fees().base; + + auto const alice = Account("alice"); + env.fund(XRP(1000), alice); + env.close(); + + // build tx_blob + Json::Value params; + auto const xpopJson = loadXpop(ImportTCAccountSet::w_seed); + auto tx = env.jt(import(alice, xpopJson)); + params[jss::tx_blob] = strHex(tx.stx->getSerializer().slice()); + + // fee request + auto const jrr = env.rpc("json", "fee", to_string(params)); + + // verify hooks fee + auto const hooksFee = jrr[jss::result][jss::fee_hooks_feeunits]; + BEAST_EXPECT(hooksFee == to_string(feeDrops * 10)); + + // verify open ledger fee + auto const dropsJV = jrr[jss::result][jss::drops]; + auto const openLedgerFee = dropsJV[jss::open_ledger_fee]; + BEAST_EXPECT(openLedgerFee == to_string((feeDrops * 10) + feeDrops)); + } + public: void run() override @@ -5360,6 +5405,7 @@ public: testMaxSupply(features); testMinMax(features); testHalving(features - featureOwnerPaysFee); + testRPCFee(features); } };