Skip to content

Commit

Permalink
Switch testing framework from MAIN to new UNITTEST network
Browse files Browse the repository at this point in the history
UNITTEST inherites from MAIN but allows synamically changing its parameters using the ModifiableParams() interface
  • Loading branch information
SergioDemianLerner authored and laanwj committed Sep 29, 2014
1 parent 41150d6 commit a25fd6b
Show file tree
Hide file tree
Showing 12 changed files with 329 additions and 3 deletions.
1 change: 1 addition & 0 deletions src/Makefile.test.include
Expand Up @@ -51,6 +51,7 @@ BITCOIN_TESTS =\
test/key_tests.cpp \
test/main_tests.cpp \
test/miner_tests.cpp \
test/blockv2_tests.cpp \
test/mruset_tests.cpp \
test/multisig_tests.cpp \
test/netbase_tests.cpp \
Expand Down
44 changes: 44 additions & 0 deletions src/chainparams.cpp
Expand Up @@ -214,8 +214,50 @@ class CRegTestParams : public CTestNetParams {
};
static CRegTestParams regTestParams;

//
// Regression test
//
class CUnitTestParams : public CMainParams, public CModifiableParams {
public:
CUnitTestParams() {
networkID = CBaseChainParams::UNITTEST;
strNetworkID = "unittest";
nDefaultPort = 18445;
vFixedSeeds.clear();
vSeeds.clear(); // Regtest mode doesn't have any DNS seeds.

fRequireRPCPassword = false;
fMiningRequiresPeers = false;
fDefaultCheckMemPool = true;
fAllowMinDifficultyBlocks = false;
fMineBlocksOnDemand = true;
fSkipProofOfWorkCheck = false;
}
virtual bool SkipProofOfWorkCheck() const { return fSkipProofOfWorkCheck; }
protected:
bool fSkipProofOfWorkCheck;
public:
// Published setters to allow changing values in unit test cases
virtual void setSubsidyHalvingInterval(int anSubsidyHalvingInterval) { nSubsidyHalvingInterval=anSubsidyHalvingInterval; }
virtual void setEnforceBlockUpgradeMajority(int anEnforceBlockUpgradeMajority) { nEnforceBlockUpgradeMajority=anEnforceBlockUpgradeMajority; }
virtual void setRejectBlockOutdatedMajority(int anRejectBlockOutdatedMajority) { nRejectBlockOutdatedMajority=anRejectBlockOutdatedMajority; }
virtual void setToCheckBlockUpgradeMajority(int anToCheckBlockUpgradeMajority) { nToCheckBlockUpgradeMajority=anToCheckBlockUpgradeMajority; }
virtual void setDefaultCheckMemPool(bool aDefaultCheckMemPool) { fDefaultCheckMemPool=aDefaultCheckMemPool; }
virtual void setAllowMinDifficultyBlocks(bool aAllowMinDifficultyBlocks) { fAllowMinDifficultyBlocks=aAllowMinDifficultyBlocks; }
virtual void setSkipProofOfWorkCheck(bool aSkipProofOfWorkCheck) { fSkipProofOfWorkCheck = aSkipProofOfWorkCheck; }
};
static CUnitTestParams unitTestParams;


static CChainParams *pCurrentParams = 0;

CModifiableParams *ModifiableParams()
{
assert(pCurrentParams);
assert(pCurrentParams==&unitTestParams);
return (CModifiableParams*)&unitTestParams;
}

const CChainParams &Params() {
assert(pCurrentParams);
return *pCurrentParams;
Expand All @@ -229,6 +271,8 @@ CChainParams &Params(CBaseChainParams::Network network) {
return testNetParams;
case CBaseChainParams::REGTEST:
return regTestParams;
case CBaseChainParams::UNITTEST:
return unitTestParams;
default:
assert(false && "Unimplemented network");
return mainParams;
Expand Down
23 changes: 23 additions & 0 deletions src/chainparams.h
Expand Up @@ -61,6 +61,8 @@ class CChainParams
bool DefaultCheckMemPool() const { return fDefaultCheckMemPool; }
/* Allow mining of a min-difficulty block */
bool AllowMinDifficultyBlocks() const { return fAllowMinDifficultyBlocks; }
/* Skip proof-of-work check: allow mining of any difficulty block */
virtual bool SkipProofOfWorkCheck() const { return false; }
/* Make standard checks */
bool RequireStandard() const { return fRequireStandard; }
int64_t TargetTimespan() const { return nTargetTimespan; }
Expand Down Expand Up @@ -105,6 +107,24 @@ class CChainParams
bool fMineBlocksOnDemand;
};

/** Modifiable parameters interface is used by test cases to adapt the parameters in order
*** to test specific features more easily. Test cases should always restore the previous
*** values after finalization.
**/

class CModifiableParams {
public:
// Published setters to allow changing values in unit test cases
virtual void setSubsidyHalvingInterval(int anSubsidyHalvingInterval) =0;
virtual void setEnforceBlockUpgradeMajority(int anEnforceBlockUpgradeMajority)=0;
virtual void setRejectBlockOutdatedMajority(int anRejectBlockOutdatedMajority)=0;
virtual void setToCheckBlockUpgradeMajority(int anToCheckBlockUpgradeMajority)=0;
virtual void setDefaultCheckMemPool(bool aDefaultCheckMemPool)=0;
virtual void setAllowMinDifficultyBlocks(bool aAllowMinDifficultyBlocks)=0;
virtual void setSkipProofOfWorkCheck(bool aSkipProofOfWorkCheck)=0;
};


/**
* Return the currently selected parameters. This won't change after app startup
* outside of the unit tests.
Expand All @@ -114,6 +134,9 @@ const CChainParams &Params();
/** Return parameters for the given network. */
CChainParams &Params(CBaseChainParams::Network network);

/** Get modifyable network parameters (UNITTEST only) */
CModifiableParams *ModifiableParams();

/** Sets the params returned by Params() to those for the given network. */
void SelectParams(CBaseChainParams::Network network);

Expand Down
17 changes: 17 additions & 0 deletions src/chainparamsbase.cpp
Expand Up @@ -57,6 +57,20 @@ class CBaseRegTestParams : public CBaseTestNetParams
};
static CBaseRegTestParams regTestParams;

//
// Unit test
//
class CBaseUnitTestParams : public CBaseMainParams
{
public:
CBaseUnitTestParams()
{
networkID = CBaseChainParams::UNITTEST;
strDataDir = "unittest";
}
};
static CBaseUnitTestParams unitTestParams;

static CBaseChainParams* pCurrentBaseParams = 0;

const CBaseChainParams& BaseParams()
Expand All @@ -77,6 +91,9 @@ void SelectBaseParams(CBaseChainParams::Network network)
case CBaseChainParams::REGTEST:
pCurrentBaseParams = &regTestParams;
break;
case CBaseChainParams::UNITTEST:
pCurrentBaseParams = &unitTestParams;
break;
default:
assert(false && "Unimplemented network");
return;
Expand Down
1 change: 1 addition & 0 deletions src/chainparamsbase.h
Expand Up @@ -19,6 +19,7 @@ class CBaseChainParams
MAIN,
TESTNET,
REGTEST,
UNITTEST,

MAX_NETWORK_TYPES
};
Expand Down
2 changes: 2 additions & 0 deletions src/checkpoints.cpp
Expand Up @@ -88,6 +88,8 @@ namespace Checkpoints {
return dataTestnet;
else if (Params().NetworkID() == CBaseChainParams::MAIN)
return data;
else if (Params().NetworkID() == CBaseChainParams::UNITTEST) // UnitTest share the same checkpoints as MAIN
return data;
else
return dataRegtest;
}
Expand Down
1 change: 1 addition & 0 deletions src/main.cpp
Expand Up @@ -2304,6 +2304,7 @@ bool AcceptBlockHeader(CBlockHeader& block, CValidationState& state, CBlockIndex
nHeight = pindexPrev->nHeight+1;

// Check proof of work
if (!Params().SkipProofOfWorkCheck())
if (block.nBits != GetNextWorkRequired(pindexPrev, &block))
return state.DoS(100, error("AcceptBlock() : incorrect proof of work"),
REJECT_INVALID, "bad-diffbits");
Expand Down
4 changes: 4 additions & 0 deletions src/pow.cpp
Expand Up @@ -81,6 +81,10 @@ bool CheckProofOfWork(uint256 hash, unsigned int nBits)
bool fNegative;
bool fOverflow;
uint256 bnTarget;

if (Params().SkipProofOfWorkCheck())
return true;

bnTarget.SetCompact(nBits, &fNegative, &fOverflow);

// Check range
Expand Down
4 changes: 2 additions & 2 deletions src/test/base58_tests.cpp
Expand Up @@ -175,7 +175,7 @@ BOOST_AUTO_TEST_CASE(base58_keys_valid_parse)
BOOST_CHECK_MESSAGE(!secret.IsValid(), "IsValid pubkey as privkey:" + strTest);
}
}
SelectParams(CBaseChainParams::MAIN);
SelectParams(CBaseChainParams::UNITTEST);
}

// Goal: check that generated keys match test vectors
Expand Down Expand Up @@ -243,7 +243,7 @@ BOOST_AUTO_TEST_CASE(base58_keys_valid_gen)
CTxDestination nodest = CNoDestination();
BOOST_CHECK(!dummyAddr.Set(nodest));

SelectParams(CBaseChainParams::MAIN);
SelectParams(CBaseChainParams::UNITTEST);
}

// Goal: check that base58 parsing code is robust against a variety of corrupted data
Expand Down

0 comments on commit a25fd6b

Please sign in to comment.