fix unit test crash on OSX

pulled in some fixes from v18
This commit is contained in:
Brannon King 2019-08-01 15:44:05 -06:00
parent 43214bc6d2
commit 05d89e91cf
4 changed files with 29 additions and 8 deletions

View file

@ -20,6 +20,8 @@
#include <script/sigcache.h> #include <script/sigcache.h>
#include "claimtrie.h" #include "claimtrie.h"
#include <boost/test/unit_test.hpp>
#include <boost/test/unit_test_parameters.hpp>
void CConnmanTest::AddNode(CNode& node) void CConnmanTest::AddNode(CNode& node)
{ {
@ -39,7 +41,6 @@ void CConnmanTest::ClearNodes()
uint256 insecure_rand_seed = GetRandHash(); uint256 insecure_rand_seed = GetRandHash();
FastRandomContext insecure_rand_ctx(insecure_rand_seed); FastRandomContext insecure_rand_ctx(insecure_rand_seed);
extern bool fPrintToConsole;
extern void noui_connect(); extern void noui_connect();
std::ostream& operator<<(std::ostream& os, const uint256& num) std::ostream& operator<<(std::ostream& os, const uint256& num)
@ -90,6 +91,14 @@ std::ostream& operator<<(std::ostream& os, const CSupportValue& support)
BasicTestingSetup::BasicTestingSetup(const std::string& chainName) BasicTestingSetup::BasicTestingSetup(const std::string& chainName)
: m_path_root(fs::temp_directory_path() / "test_bitcoin" / strprintf("%lu_%i", (unsigned long)GetTime(), (int)(InsecureRandRange(1 << 30)))) : m_path_root(fs::temp_directory_path() / "test_bitcoin" / strprintf("%lu_%i", (unsigned long)GetTime(), (int)(InsecureRandRange(1 << 30))))
{ {
// for debugging:
if (boost::unit_test::runtime_config::get<boost::unit_test::log_level>(boost::unit_test::runtime_config::btrt_log_level)
<= boost::unit_test::log_level::log_messages) {
g_logger->m_print_to_console = true;
g_logger->m_log_time_micros = true;
g_logger->EnableCategory(BCLog::ALL);
}
SHA256AutoDetect(); SHA256AutoDetect();
RandomInit(); RandomInit();
ECC_Start(); ECC_Start();

View file

@ -44,7 +44,7 @@ struct BasicTestingSetup {
ECCVerifyHandle globalVerifyHandle; ECCVerifyHandle globalVerifyHandle;
explicit BasicTestingSetup(const std::string& chainName = CBaseChainParams::MAIN); explicit BasicTestingSetup(const std::string& chainName = CBaseChainParams::MAIN);
~BasicTestingSetup(); virtual ~BasicTestingSetup();
fs::path SetDataDir(const std::string& name); fs::path SetDataDir(const std::string& name);
@ -70,7 +70,7 @@ struct TestingSetup: public BasicTestingSetup {
std::unique_ptr<PeerLogicValidation> peerLogic; std::unique_ptr<PeerLogicValidation> peerLogic;
explicit TestingSetup(const std::string& chainName = CBaseChainParams::MAIN); explicit TestingSetup(const std::string& chainName = CBaseChainParams::MAIN);
~TestingSetup(); ~TestingSetup() override;
}; };
class CBlock; class CBlock;
@ -89,7 +89,7 @@ struct TestChain100Setup : public TestingSetup {
CBlock CreateAndProcessBlock(const std::vector<CMutableTransaction>& txns, CBlock CreateAndProcessBlock(const std::vector<CMutableTransaction>& txns,
const CScript& scriptPubKey); const CScript& scriptPubKey);
~TestChain100Setup(); ~TestChain100Setup() override;
std::vector<CTransactionRef> m_coinbase_txns; // For convenience, coinbase transactions std::vector<CTransactionRef> m_coinbase_txns; // For convenience, coinbase transactions
CKey coinbaseKey; // private/public key needed to spend coinbase transactions CKey coinbaseKey; // private/public key needed to spend coinbase transactions
@ -97,7 +97,7 @@ struct TestChain100Setup : public TestingSetup {
struct RegTestingSetup: public TestingSetup { struct RegTestingSetup: public TestingSetup {
RegTestingSetup(); RegTestingSetup();
~RegTestingSetup(); ~RegTestingSetup() override;
}; };
class CTxMemPoolEntry; class CTxMemPoolEntry;

View file

@ -154,6 +154,7 @@ BerkeleyEnvironment::BerkeleyEnvironment(const fs::path& dir_path) : strPath(dir
BerkeleyEnvironment::~BerkeleyEnvironment() BerkeleyEnvironment::~BerkeleyEnvironment()
{ {
LOCK(cs_db);
g_dbenvs.erase(strPath); g_dbenvs.erase(strPath);
Close(); Close();
} }
@ -558,6 +559,7 @@ BerkeleyBatch::BerkeleyBatch(BerkeleyDatabase& database, const char* pszMode, bo
void BerkeleyBatch::Flush() void BerkeleyBatch::Flush()
{ {
LOCK(cs_db);
if (activeTxn) if (activeTxn)
return; return;
@ -566,8 +568,10 @@ void BerkeleyBatch::Flush()
if (fReadOnly) if (fReadOnly)
nMinutes = 1; nMinutes = 1;
if (env && env->dbenv) { // env is nullptr for dummy databases (i.e. in tests). Don't actually flush if env is nullptr so we don't segfault
env->dbenv->txn_checkpoint(nMinutes ? gArgs.GetArg("-dblogsize", DEFAULT_WALLET_DBLOGSIZE) * 1024 : 0, nMinutes, 0); env->dbenv->txn_checkpoint(nMinutes ? gArgs.GetArg("-dblogsize", DEFAULT_WALLET_DBLOGSIZE) * 1024 : 0, nMinutes, 0);
} }
}
void BerkeleyDatabase::IncrementUpdateCounter() void BerkeleyDatabase::IncrementUpdateCounter()
{ {

View file

@ -28,11 +28,11 @@ struct CatchWalletTestSetup: public TestingSetup {
UniValue results = rpc_method(req); UniValue results = rpc_method(req);
BOOST_CHECK_EQUAL(results["name"].get_str(), "tester_wallet"); BOOST_CHECK_EQUAL(results["name"].get_str(), "tester_wallet");
} }
~CatchWalletTestSetup() { ~CatchWalletTestSetup() override {
rpcfn_type rpc_method = tableRPC["unloadwallet"]->actor; rpcfn_type rpc_method = tableRPC["unloadwallet"]->actor;
JSONRPCRequest req; JSONRPCRequest req;
req.URI = "/wallet/tester_wallet";
req.params = UniValue(UniValue::VARR); req.params = UniValue(UniValue::VARR);
req.params.push_back("tester_wallet");
rpc_method(req); rpc_method(req);
} }
}; };
@ -42,6 +42,7 @@ BOOST_FIXTURE_TEST_SUITE(claim_rpc_tests, CatchWalletTestSetup)
double AvailableBalance() { double AvailableBalance() {
rpcfn_type rpc_method = tableRPC["getbalance"]->actor; rpcfn_type rpc_method = tableRPC["getbalance"]->actor;
JSONRPCRequest req; JSONRPCRequest req;
req.URI = "/wallet/tester_wallet";
req.params = UniValue(UniValue::VARR); req.params = UniValue(UniValue::VARR);
UniValue results = rpc_method(req); UniValue results = rpc_method(req);
return results.get_real(); return results.get_real();
@ -51,6 +52,7 @@ uint256 ClaimAName(const std::string& name, const std::string& data, const std::
// pass a txid as name for update // pass a txid as name for update
rpcfn_type rpc_method = tableRPC[isUpdate ? "updateclaim" : "claimname"]->actor; rpcfn_type rpc_method = tableRPC[isUpdate ? "updateclaim" : "claimname"]->actor;
JSONRPCRequest req; JSONRPCRequest req;
req.URI = "/wallet/tester_wallet";
req.params = UniValue(UniValue::VARR); req.params = UniValue(UniValue::VARR);
req.params.push_back(name); req.params.push_back(name);
req.params.push_back(data); req.params.push_back(data);
@ -67,6 +69,7 @@ uint256 SupportAName(const std::string& name, const std::string& claimId, const
// pass a txid as name for update // pass a txid as name for update
rpcfn_type rpc_method = tableRPC["supportclaim"]->actor; rpcfn_type rpc_method = tableRPC["supportclaim"]->actor;
JSONRPCRequest req; JSONRPCRequest req;
req.URI = "/wallet/tester_wallet";
req.params = UniValue(UniValue::VARR); req.params = UniValue(UniValue::VARR);
req.params.push_back(name); req.params.push_back(name);
req.params.push_back(claimId); req.params.push_back(claimId);
@ -82,6 +85,7 @@ uint256 SupportAName(const std::string& name, const std::string& claimId, const
UniValue LookupAllNames() { UniValue LookupAllNames() {
rpcfn_type rpc_method = tableRPC["listnameclaims"]->actor; rpcfn_type rpc_method = tableRPC["listnameclaims"]->actor;
JSONRPCRequest req; JSONRPCRequest req;
req.URI = "/wallet/tester_wallet";
req.params = UniValue(UniValue::VARR); req.params = UniValue(UniValue::VARR);
return rpc_method(req); return rpc_method(req);
} }
@ -89,6 +93,7 @@ UniValue LookupAllNames() {
std::vector<uint256> generateBlock(int blocks = 1) { std::vector<uint256> generateBlock(int blocks = 1) {
rpcfn_type rpc_method = tableRPC["generate"]->actor; rpcfn_type rpc_method = tableRPC["generate"]->actor;
JSONRPCRequest req; JSONRPCRequest req;
req.URI = "/wallet/tester_wallet";
req.params = UniValue(UniValue::VARR); req.params = UniValue(UniValue::VARR);
req.params.push_back(blocks); req.params.push_back(blocks);
UniValue results = rpc_method(req); UniValue results = rpc_method(req);
@ -107,6 +112,7 @@ void rollbackBlock(const std::vector<uint256>& ids) {
rpcfn_type rpc_method = tableRPC["invalidateblock"]->actor; rpcfn_type rpc_method = tableRPC["invalidateblock"]->actor;
for (auto it = ids.rbegin(); it != ids.rend(); ++it) { for (auto it = ids.rbegin(); it != ids.rend(); ++it) {
JSONRPCRequest req; JSONRPCRequest req;
req.URI = "/wallet/tester_wallet";
req.params = UniValue(UniValue::VARR); req.params = UniValue(UniValue::VARR);
req.params.push_back(it->GetHex()); req.params.push_back(it->GetHex());
rpc_method(req); rpc_method(req);
@ -119,6 +125,7 @@ void rollbackBlock(const std::vector<uint256>& ids) {
uint256 AbandonAClaim(const uint256& txid, bool isSupport = false) { uint256 AbandonAClaim(const uint256& txid, bool isSupport = false) {
rpcfn_type pre_rpc_method = tableRPC["getrawchangeaddress"]->actor; rpcfn_type pre_rpc_method = tableRPC["getrawchangeaddress"]->actor;
JSONRPCRequest pre_req; JSONRPCRequest pre_req;
pre_req.URI = "/wallet/tester_wallet";
pre_req.params = UniValue(UniValue::VARR); pre_req.params = UniValue(UniValue::VARR);
pre_req.params.push_back("legacy"); pre_req.params.push_back("legacy");
UniValue adr_hash = pre_rpc_method(pre_req); UniValue adr_hash = pre_rpc_method(pre_req);
@ -126,6 +133,7 @@ uint256 AbandonAClaim(const uint256& txid, bool isSupport = false) {
// pass a txid as name for update // pass a txid as name for update
rpcfn_type rpc_method = tableRPC[isSupport ? "abandonsupport" : "abandonclaim"]->actor; rpcfn_type rpc_method = tableRPC[isSupport ? "abandonsupport" : "abandonclaim"]->actor;
JSONRPCRequest req; JSONRPCRequest req;
req.URI = "/wallet/tester_wallet";
req.params = UniValue(UniValue::VARR); req.params = UniValue(UniValue::VARR);
req.params.push_back(txid.GetHex()); req.params.push_back(txid.GetHex());
req.params.push_back(adr_hash.get_str()); req.params.push_back(adr_hash.get_str());