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