Fix tx re-ordering bug in test:

`env.fund` requires two transactions: `pay` and `set account`. If there is a
`trust` transaction in the same set of txs, the txs may be reordered so
`pay` -> `trust` -> `set account` so the wrong `no ripple` flag would be used
on the trust line.

Adding a `close` between `env.fund` and `env.trust` resolves this problem.
This commit is contained in:
seelabs
2017-03-14 16:06:10 -04:00
committed by Brad Chase
parent 15f969a469
commit 1bb92d40aa
2 changed files with 29 additions and 9 deletions

View File

@@ -31,6 +31,20 @@
namespace ripple {
namespace test {
bool getNoRippleFlag (jtx::Env const& env,
jtx::Account const& src,
jtx::Account const& dst,
Currency const& cur)
{
if (auto sle = env.le (keylet::line (src, dst, cur)))
{
auto const flag = (src.id() > dst.id()) ? lsfHighNoRipple : lsfLowNoRipple;
return sle->isFlag (flag);
}
Throw<std::runtime_error> ("No line in getTrustFlag");
return false; // silence warning
}
jtx::PrettyAmount
xrpMinusFee (jtx::Env const& env, std::int64_t xrpAmount)
{
@@ -1046,9 +1060,16 @@ struct Flow_test : public beast::unit_test::suite
auto const bob = Account("bob");
auto const gw = Account("gw");
auto const USD = gw["USD"];
auto const usdC = USD.currency;
env.fund(XRP(10000), alice, bob, gw);
// Need to be past this time to see the bug
env.close(amendmentRIPD1274SoTime() +
100 * env.closed()->info().closeTimeResolution);
env(trust(alice, USD(100)));
env.close();
BEAST_EXPECT(!getNoRippleFlag(env, gw, alice, usdC));
env(pay(
gw, alice,
@@ -1079,10 +1100,6 @@ struct Flow_test : public beast::unit_test::suite
USD.issue(), std::uint64_t(1700000000000000ull), -14, false},
XRP(.001)));
// Need to be past this time to see the bug
env.close(amendmentRIPD1274SoTime() +
100 * env.closed()->info().closeTimeResolution);
env(pay(alice, bob, XRP(10000)), path(~XRP), sendmax(USD(100)),
txflags(tfPartialPayment | tfNoRippleDirect));
}

View File

@@ -44,12 +44,11 @@ struct XRPEndpointStepInfo
AccountID acc;
};
enum class TrustFlag { freeze, auth };
enum class TrustFlag {freeze, auth, noripple};
std::uint32_t
trustFlag(TrustFlag f, bool useHigh)
/*constexpr*/ std::uint32_t trustFlag (TrustFlag f, bool useHigh)
{
switch (f)
switch(f)
{
case TrustFlag::freeze:
if (useHigh)
@@ -59,8 +58,12 @@ trustFlag(TrustFlag f, bool useHigh)
if (useHigh)
return lsfHighAuth;
return lsfLowAuth;
case TrustFlag::noripple:
if (useHigh)
return lsfHighNoRipple;
return lsfLowNoRipple;
}
return 0; // Silence warning about end of non-void function
return 0; // Silence warning about end of non-void function
}
bool