Merge #11623: tests: Add missing locks to tests
109a85899
tests: Add missing locks to tests (practicalswift)
Pull request description:
Add missing locks to tests to satisfy lock requirements (such as `EXCLUSIVE_LOCKS_REQUIRED(...)` (Clang Thread Safety Analysis, see #11226), `AssertLockHeld(...)` and implicit lock assumptions).
Tree-SHA512: 1aaeb1da89df1779f02fcceff9d2f8ea24a3926d421f9ea305a19be04dd0b3e63d91f6c1ed22fb7e6988343f6a5288829a387ef872cfa7b6add57bd01046b5d9
This commit is contained in:
commit
ee92243e66
7 changed files with 60 additions and 10 deletions
|
@ -164,7 +164,10 @@ void TestGUI()
|
|||
wallet.SetAddressBook(test.coinbaseKey.GetPubKey().GetID(), "", "receive");
|
||||
wallet.AddKeyPubKey(test.coinbaseKey, test.coinbaseKey.GetPubKey());
|
||||
}
|
||||
wallet.ScanForWalletTransactions(chainActive.Genesis(), nullptr, true);
|
||||
{
|
||||
LOCK(cs_main);
|
||||
wallet.ScanForWalletTransactions(chainActive.Genesis(), nullptr, true);
|
||||
}
|
||||
wallet.SetBroadcastTransactions(true);
|
||||
|
||||
// Create widgets for sending coins and listing transactions.
|
||||
|
|
|
@ -66,11 +66,14 @@ BOOST_AUTO_TEST_CASE(outbound_slow_chain_eviction)
|
|||
dummyNode1.fSuccessfullyConnected = true;
|
||||
|
||||
// This test requires that we have a chain with non-zero work.
|
||||
LOCK(cs_main);
|
||||
BOOST_CHECK(chainActive.Tip() != nullptr);
|
||||
BOOST_CHECK(chainActive.Tip()->nChainWork > 0);
|
||||
|
||||
// Test starts here
|
||||
LOCK(dummyNode1.cs_sendProcessing);
|
||||
peerLogic->SendMessages(&dummyNode1, interruptDummy); // should result in getheaders
|
||||
LOCK(dummyNode1.cs_vSend);
|
||||
BOOST_CHECK(dummyNode1.vSendMsg.size() > 0);
|
||||
dummyNode1.vSendMsg.clear();
|
||||
|
||||
|
@ -183,7 +186,11 @@ BOOST_AUTO_TEST_CASE(DoS_banning)
|
|||
peerLogic->InitializeNode(&dummyNode1);
|
||||
dummyNode1.nVersion = 1;
|
||||
dummyNode1.fSuccessfullyConnected = true;
|
||||
Misbehaving(dummyNode1.GetId(), 100); // Should get banned
|
||||
{
|
||||
LOCK(cs_main);
|
||||
Misbehaving(dummyNode1.GetId(), 100); // Should get banned
|
||||
}
|
||||
LOCK(dummyNode1.cs_sendProcessing);
|
||||
peerLogic->SendMessages(&dummyNode1, interruptDummy);
|
||||
BOOST_CHECK(connman->IsBanned(addr1));
|
||||
BOOST_CHECK(!connman->IsBanned(ip(0xa0b0c001|0x0000ff00))); // Different IP, not banned
|
||||
|
@ -194,11 +201,18 @@ BOOST_AUTO_TEST_CASE(DoS_banning)
|
|||
peerLogic->InitializeNode(&dummyNode2);
|
||||
dummyNode2.nVersion = 1;
|
||||
dummyNode2.fSuccessfullyConnected = true;
|
||||
Misbehaving(dummyNode2.GetId(), 50);
|
||||
{
|
||||
LOCK(cs_main);
|
||||
Misbehaving(dummyNode2.GetId(), 50);
|
||||
}
|
||||
LOCK(dummyNode2.cs_sendProcessing);
|
||||
peerLogic->SendMessages(&dummyNode2, interruptDummy);
|
||||
BOOST_CHECK(!connman->IsBanned(addr2)); // 2 not banned yet...
|
||||
BOOST_CHECK(connman->IsBanned(addr1)); // ... but 1 still should be
|
||||
Misbehaving(dummyNode2.GetId(), 50);
|
||||
{
|
||||
LOCK(cs_main);
|
||||
Misbehaving(dummyNode2.GetId(), 50);
|
||||
}
|
||||
peerLogic->SendMessages(&dummyNode2, interruptDummy);
|
||||
BOOST_CHECK(connman->IsBanned(addr2));
|
||||
|
||||
|
@ -219,13 +233,23 @@ BOOST_AUTO_TEST_CASE(DoS_banscore)
|
|||
peerLogic->InitializeNode(&dummyNode1);
|
||||
dummyNode1.nVersion = 1;
|
||||
dummyNode1.fSuccessfullyConnected = true;
|
||||
Misbehaving(dummyNode1.GetId(), 100);
|
||||
{
|
||||
LOCK(cs_main);
|
||||
Misbehaving(dummyNode1.GetId(), 100);
|
||||
}
|
||||
LOCK(dummyNode1.cs_sendProcessing);
|
||||
peerLogic->SendMessages(&dummyNode1, interruptDummy);
|
||||
BOOST_CHECK(!connman->IsBanned(addr1));
|
||||
Misbehaving(dummyNode1.GetId(), 10);
|
||||
{
|
||||
LOCK(cs_main);
|
||||
Misbehaving(dummyNode1.GetId(), 10);
|
||||
}
|
||||
peerLogic->SendMessages(&dummyNode1, interruptDummy);
|
||||
BOOST_CHECK(!connman->IsBanned(addr1));
|
||||
Misbehaving(dummyNode1.GetId(), 1);
|
||||
{
|
||||
LOCK(cs_main);
|
||||
Misbehaving(dummyNode1.GetId(), 1);
|
||||
}
|
||||
peerLogic->SendMessages(&dummyNode1, interruptDummy);
|
||||
BOOST_CHECK(connman->IsBanned(addr1));
|
||||
gArgs.ForceSetArg("-banscore", std::to_string(DEFAULT_BANSCORE_THRESHOLD));
|
||||
|
@ -249,7 +273,11 @@ BOOST_AUTO_TEST_CASE(DoS_bantime)
|
|||
dummyNode.nVersion = 1;
|
||||
dummyNode.fSuccessfullyConnected = true;
|
||||
|
||||
Misbehaving(dummyNode.GetId(), 100);
|
||||
{
|
||||
LOCK(cs_main);
|
||||
Misbehaving(dummyNode.GetId(), 100);
|
||||
}
|
||||
LOCK(dummyNode.cs_sendProcessing);
|
||||
peerLogic->SendMessages(&dummyNode, interruptDummy);
|
||||
BOOST_CHECK(connman->IsBanned(addr));
|
||||
|
||||
|
@ -266,6 +294,7 @@ BOOST_AUTO_TEST_CASE(DoS_bantime)
|
|||
CTransactionRef RandomOrphan()
|
||||
{
|
||||
std::map<uint256, COrphanTx>::iterator it;
|
||||
LOCK(cs_main);
|
||||
it = mapOrphanTransactions.lower_bound(InsecureRand256());
|
||||
if (it == mapOrphanTransactions.end())
|
||||
it = mapOrphanTransactions.begin();
|
||||
|
@ -335,6 +364,7 @@ BOOST_AUTO_TEST_CASE(DoS_mapOrphans)
|
|||
BOOST_CHECK(!AddOrphanTx(MakeTransactionRef(tx), i));
|
||||
}
|
||||
|
||||
LOCK(cs_main);
|
||||
// Test EraseOrphansFor:
|
||||
for (NodeId i = 0; i < 3; i++)
|
||||
{
|
||||
|
|
|
@ -62,6 +62,7 @@ BOOST_AUTO_TEST_CASE(SimpleRoundTripTest)
|
|||
CBlock block(BuildBlockTestCase());
|
||||
|
||||
pool.addUnchecked(block.vtx[2]->GetHash(), entry.FromTx(*block.vtx[2]));
|
||||
LOCK(pool.cs);
|
||||
BOOST_CHECK_EQUAL(pool.mapTx.find(block.vtx[2]->GetHash())->GetSharedTx().use_count(), SHARED_TX_OFFSET + 0);
|
||||
|
||||
// Do a simple ShortTxIDs RT
|
||||
|
@ -161,6 +162,7 @@ BOOST_AUTO_TEST_CASE(NonCoinbasePreforwardRTTest)
|
|||
CBlock block(BuildBlockTestCase());
|
||||
|
||||
pool.addUnchecked(block.vtx[2]->GetHash(), entry.FromTx(*block.vtx[2]));
|
||||
LOCK(pool.cs);
|
||||
BOOST_CHECK_EQUAL(pool.mapTx.find(block.vtx[2]->GetHash())->GetSharedTx().use_count(), SHARED_TX_OFFSET + 0);
|
||||
|
||||
uint256 txhash;
|
||||
|
@ -227,6 +229,7 @@ BOOST_AUTO_TEST_CASE(SufficientPreforwardRTTest)
|
|||
CBlock block(BuildBlockTestCase());
|
||||
|
||||
pool.addUnchecked(block.vtx[1]->GetHash(), entry.FromTx(*block.vtx[1]));
|
||||
LOCK(pool.cs);
|
||||
BOOST_CHECK_EQUAL(pool.mapTx.find(block.vtx[1]->GetHash())->GetSharedTx().use_count(), SHARED_TX_OFFSET + 0);
|
||||
|
||||
uint256 txhash;
|
||||
|
|
|
@ -165,6 +165,7 @@ BOOST_AUTO_TEST_CASE(MempoolIndexingTest)
|
|||
sortedOrder[2] = tx1.GetHash().ToString(); // 10000
|
||||
sortedOrder[3] = tx4.GetHash().ToString(); // 15000
|
||||
sortedOrder[4] = tx2.GetHash().ToString(); // 20000
|
||||
LOCK(pool.cs);
|
||||
CheckSort<descendant_score>(pool, sortedOrder);
|
||||
|
||||
/* low fee but with high fee child */
|
||||
|
@ -375,6 +376,7 @@ BOOST_AUTO_TEST_CASE(MempoolAncestorIndexingTest)
|
|||
}
|
||||
sortedOrder[4] = tx3.GetHash().ToString(); // 0
|
||||
|
||||
LOCK(pool.cs);
|
||||
CheckSort<ancestor_score>(pool, sortedOrder);
|
||||
|
||||
/* low fee parent with high fee child */
|
||||
|
|
|
@ -149,7 +149,10 @@ TestChain100Setup::CreateAndProcessBlock(const std::vector<CMutableTransaction>&
|
|||
block.vtx.push_back(MakeTransactionRef(tx));
|
||||
// IncrementExtraNonce creates a valid coinbase and merkleRoot
|
||||
unsigned int extraNonce = 0;
|
||||
IncrementExtraNonce(&block, chainActive.Tip(), extraNonce);
|
||||
{
|
||||
LOCK(cs_main);
|
||||
IncrementExtraNonce(&block, chainActive.Tip(), extraNonce);
|
||||
}
|
||||
|
||||
while (!CheckProofOfWork(block.GetHash(), block.nBits, chainparams.GetConsensus())) ++block.nNonce;
|
||||
|
||||
|
|
|
@ -66,6 +66,7 @@ BOOST_FIXTURE_TEST_CASE(tx_mempool_block_doublespend, TestChain100Setup)
|
|||
|
||||
// Test 1: block with both of those transactions should be rejected.
|
||||
block = CreateAndProcessBlock(spends, scriptPubKey);
|
||||
LOCK(cs_main);
|
||||
BOOST_CHECK(chainActive.Tip()->GetBlockHash() != block.GetHash());
|
||||
|
||||
// Test 2: ... and should be rejected if spend1 is in the memory pool
|
||||
|
@ -151,7 +152,10 @@ BOOST_FIXTURE_TEST_CASE(checkinputs_test, TestChain100Setup)
|
|||
{
|
||||
// Test that passing CheckInputs with one set of script flags doesn't imply
|
||||
// that we would pass again with a different set of flags.
|
||||
InitScriptExecutionCache();
|
||||
{
|
||||
LOCK(cs_main);
|
||||
InitScriptExecutionCache();
|
||||
}
|
||||
|
||||
CScript p2pk_scriptPubKey = CScript() << ToByteVector(coinbaseKey.GetPubKey()) << OP_CHECKSIG;
|
||||
CScript p2sh_scriptPubKey = GetScriptForDestination(CScriptID(p2pk_scriptPubKey));
|
||||
|
|
|
@ -489,6 +489,7 @@ BOOST_FIXTURE_TEST_CASE(importwallet_rescan, TestChain100Setup)
|
|||
vpwallets[0] = &wallet;
|
||||
::importwallet(request);
|
||||
|
||||
LOCK(wallet.cs_wallet);
|
||||
BOOST_CHECK_EQUAL(wallet.mapWallet.size(), 3);
|
||||
BOOST_CHECK_EQUAL(coinbaseTxns.size(), 103);
|
||||
for (size_t i = 0; i < coinbaseTxns.size(); ++i) {
|
||||
|
@ -534,6 +535,7 @@ static int64_t AddTx(CWallet& wallet, uint32_t lockTime, int64_t mockTime, int64
|
|||
SetMockTime(mockTime);
|
||||
CBlockIndex* block = nullptr;
|
||||
if (blockTime > 0) {
|
||||
LOCK(cs_main);
|
||||
auto inserted = mapBlockIndex.emplace(GetRandHash(), new CBlockIndex);
|
||||
assert(inserted.second);
|
||||
const uint256& hash = inserted.first->first;
|
||||
|
@ -547,6 +549,7 @@ static int64_t AddTx(CWallet& wallet, uint32_t lockTime, int64_t mockTime, int64
|
|||
wtx.SetMerkleBranch(block, 0);
|
||||
}
|
||||
wallet.AddToWallet(wtx);
|
||||
LOCK(wallet.cs_wallet);
|
||||
return wallet.mapWallet.at(wtx.GetHash()).nTimeSmart;
|
||||
}
|
||||
|
||||
|
@ -583,6 +586,7 @@ BOOST_AUTO_TEST_CASE(ComputeTimeSmart)
|
|||
BOOST_AUTO_TEST_CASE(LoadReceiveRequests)
|
||||
{
|
||||
CTxDestination dest = CKeyID();
|
||||
LOCK(pwalletMain->cs_wallet);
|
||||
pwalletMain->AddDestData(dest, "misc", "val_misc");
|
||||
pwalletMain->AddDestData(dest, "rr0", "val_rr0");
|
||||
pwalletMain->AddDestData(dest, "rr1", "val_rr1");
|
||||
|
@ -625,6 +629,7 @@ public:
|
|||
BOOST_CHECK(wallet->CreateTransaction({recipient}, wtx, reservekey, fee, changePos, error, dummy));
|
||||
CValidationState state;
|
||||
BOOST_CHECK(wallet->CommitTransaction(wtx, reservekey, nullptr, state));
|
||||
LOCK(wallet->cs_wallet);
|
||||
auto it = wallet->mapWallet.find(wtx.GetHash());
|
||||
BOOST_CHECK(it != wallet->mapWallet.end());
|
||||
CreateAndProcessBlock({CMutableTransaction(*it->second.tx)}, GetScriptForRawPubKey(coinbaseKey.GetPubKey()));
|
||||
|
|
Loading…
Reference in a new issue