Add example mock test of CheckTransaction

This commit is contained in:
Taylor Hornby 2016-06-15 17:01:55 -06:00
parent fe97a405e3
commit fc057da455
3 changed files with 40 additions and 13 deletions

View File

@ -13,7 +13,7 @@ zcash_gtest_SOURCES = \
zcash_gtest_CPPFLAGS = -DMULTICORE -fopenmp -DBINARY_OUTPUT -DCURVE_ALT_BN128 -DSTATIC zcash_gtest_CPPFLAGS = -DMULTICORE -fopenmp -DBINARY_OUTPUT -DCURVE_ALT_BN128 -DSTATIC
zcash_gtest_LDADD = -lgtest $(LIBBITCOIN_SERVER) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBBITCOIN_UNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \ zcash_gtest_LDADD = -lgtest -lgmock $(LIBBITCOIN_SERVER) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CRYPTO) $(LIBBITCOIN_UNIVALUE) $(LIBLEVELDB) $(LIBMEMENV) \
$(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) $(LIBSECP256K1) $(BOOST_LIBS) $(BOOST_UNIT_TEST_FRAMEWORK_LIB) $(LIBSECP256K1)
if ENABLE_WALLET if ENABLE_WALLET
zcash_gtest_LDADD += $(LIBBITCOIN_WALLET) zcash_gtest_LDADD += $(LIBBITCOIN_WALLET)

View File

@ -33,7 +33,7 @@ private:
bool pourVerify; bool pourVerify;
public: public:
CValidationState() : mode(MODE_VALID), nDoS(0), chRejectCode(0), corruptionPossible(false), pourVerify(true) {} CValidationState() : mode(MODE_VALID), nDoS(0), chRejectCode(0), corruptionPossible(false), pourVerify(true) {}
bool DoS(int level, bool ret = false, virtual bool DoS(int level, bool ret = false,
unsigned char chRejectCodeIn=0, std::string strRejectReasonIn="", unsigned char chRejectCodeIn=0, std::string strRejectReasonIn="",
bool corruptionIn=false) { bool corruptionIn=false) {
chRejectCode = chRejectCodeIn; chRejectCode = chRejectCodeIn;
@ -45,43 +45,43 @@ public:
mode = MODE_INVALID; mode = MODE_INVALID;
return ret; return ret;
} }
bool SetPerformPourVerification(bool pourVerifyIn) { virtual bool SetPerformPourVerification(bool pourVerifyIn) {
pourVerify = pourVerifyIn; pourVerify = pourVerifyIn;
} }
bool PerformPourVerification() { virtual bool PerformPourVerification() {
return pourVerify; return pourVerify;
} }
bool Invalid(bool ret = false, virtual bool Invalid(bool ret = false,
unsigned char _chRejectCode=0, std::string _strRejectReason="") { unsigned char _chRejectCode=0, std::string _strRejectReason="") {
return DoS(0, ret, _chRejectCode, _strRejectReason); return DoS(0, ret, _chRejectCode, _strRejectReason);
} }
bool Error(std::string strRejectReasonIn="") { virtual bool Error(std::string strRejectReasonIn="") {
if (mode == MODE_VALID) if (mode == MODE_VALID)
strRejectReason = strRejectReasonIn; strRejectReason = strRejectReasonIn;
mode = MODE_ERROR; mode = MODE_ERROR;
return false; return false;
} }
bool IsValid() const { virtual bool IsValid() const {
return mode == MODE_VALID; return mode == MODE_VALID;
} }
bool IsInvalid() const { virtual bool IsInvalid() const {
return mode == MODE_INVALID; return mode == MODE_INVALID;
} }
bool IsError() const { virtual bool IsError() const {
return mode == MODE_ERROR; return mode == MODE_ERROR;
} }
bool IsInvalid(int &nDoSOut) const { virtual bool IsInvalid(int &nDoSOut) const {
if (IsInvalid()) { if (IsInvalid()) {
nDoSOut = nDoS; nDoSOut = nDoS;
return true; return true;
} }
return false; return false;
} }
bool CorruptionPossible() const { virtual bool CorruptionPossible() const {
return corruptionPossible; return corruptionPossible;
} }
unsigned char GetRejectCode() const { return chRejectCode; } virtual unsigned char GetRejectCode() const { return chRejectCode; }
std::string GetRejectReason() const { return strRejectReason; } virtual std::string GetRejectReason() const { return strRejectReason; }
}; };
#endif // BITCOIN_CONSENSUS_VALIDATION_H #endif // BITCOIN_CONSENSUS_VALIDATION_H

View File

@ -1,4 +1,5 @@
#include <gtest/gtest.h> #include <gtest/gtest.h>
#include <gmock/gmock.h>
#include "main.h" #include "main.h"
#include "primitives/transaction.h" #include "primitives/transaction.h"
@ -24,3 +25,29 @@ TEST(checktransaction_tests, check_vpub_not_both_nonzero) {
EXPECT_EQ(state.GetRejectReason(), "bad-txns-vpubs-both-nonzero"); EXPECT_EQ(state.GetRejectReason(), "bad-txns-vpubs-both-nonzero");
} }
} }
class MockCValidationState : public CValidationState {
public:
MOCK_METHOD5(DoS, bool(int level, bool ret,
unsigned char chRejectCodeIn, std::string strRejectReasonIn,
bool corruptionIn));
MOCK_METHOD1(SetPerformPourVerification, bool(bool pourVerifyIn));
MOCK_METHOD0(PerformPourVerification, bool());
MOCK_METHOD3(Invalid, bool(bool ret,
unsigned char _chRejectCode, std::string _strRejectReason));
MOCK_METHOD1(Error, bool(std::string strRejectReasonIn));
MOCK_CONST_METHOD0(IsValid, bool());
MOCK_CONST_METHOD0(IsInvalid, bool());
MOCK_CONST_METHOD0(IsError, bool());
MOCK_CONST_METHOD1(IsInvalid, bool(int &nDoSOut));
MOCK_CONST_METHOD0(CorruptionPossible, bool());
MOCK_CONST_METHOD0(GetRejectCode, unsigned char());
MOCK_CONST_METHOD0(GetRejectReason, std::string());
};
TEST(checktransaction_tests, mock_proof_of_concept) {
CTransaction tx;
MockCValidationState state;
EXPECT_CALL(state, DoS(10, false, REJECT_INVALID, "bad-txns-vin-empty", false)).Times(1);
CheckTransaction(tx, state);
}