diff --git a/src/Makefile.gtest.include b/src/Makefile.gtest.include index 690f0dab..1a76f846 100644 --- a/src/Makefile.gtest.include +++ b/src/Makefile.gtest.include @@ -13,7 +13,7 @@ zcash_gtest_SOURCES = \ 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) if ENABLE_WALLET zcash_gtest_LDADD += $(LIBBITCOIN_WALLET) diff --git a/src/consensus/validation.h b/src/consensus/validation.h index 68ac4163..8e1ac2ef 100644 --- a/src/consensus/validation.h +++ b/src/consensus/validation.h @@ -33,7 +33,7 @@ private: bool pourVerify; public: 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="", bool corruptionIn=false) { chRejectCode = chRejectCodeIn; @@ -45,43 +45,43 @@ public: mode = MODE_INVALID; return ret; } - bool SetPerformPourVerification(bool pourVerifyIn) { + virtual bool SetPerformPourVerification(bool pourVerifyIn) { pourVerify = pourVerifyIn; } - bool PerformPourVerification() { + virtual bool PerformPourVerification() { return pourVerify; } - bool Invalid(bool ret = false, + virtual bool Invalid(bool ret = false, unsigned char _chRejectCode=0, std::string _strRejectReason="") { return DoS(0, ret, _chRejectCode, _strRejectReason); } - bool Error(std::string strRejectReasonIn="") { + virtual bool Error(std::string strRejectReasonIn="") { if (mode == MODE_VALID) strRejectReason = strRejectReasonIn; mode = MODE_ERROR; return false; } - bool IsValid() const { + virtual bool IsValid() const { return mode == MODE_VALID; } - bool IsInvalid() const { + virtual bool IsInvalid() const { return mode == MODE_INVALID; } - bool IsError() const { + virtual bool IsError() const { return mode == MODE_ERROR; } - bool IsInvalid(int &nDoSOut) const { + virtual bool IsInvalid(int &nDoSOut) const { if (IsInvalid()) { nDoSOut = nDoS; return true; } return false; } - bool CorruptionPossible() const { + virtual bool CorruptionPossible() const { return corruptionPossible; } - unsigned char GetRejectCode() const { return chRejectCode; } - std::string GetRejectReason() const { return strRejectReason; } + virtual unsigned char GetRejectCode() const { return chRejectCode; } + virtual std::string GetRejectReason() const { return strRejectReason; } }; #endif // BITCOIN_CONSENSUS_VALIDATION_H diff --git a/src/gtest/test_checktransaction.cpp b/src/gtest/test_checktransaction.cpp index 48d8d5e7..eaaa6f08 100644 --- a/src/gtest/test_checktransaction.cpp +++ b/src/gtest/test_checktransaction.cpp @@ -1,4 +1,5 @@ #include +#include #include "main.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"); } } + +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); +}