Add unit tests for WriteWitnessCache

Requires moving implementation into header
This commit is contained in:
Jack Grigg
2016-10-10 23:13:36 -05:00
parent 6216b4b2dc
commit 82c2d97c60
3 changed files with 102 additions and 39 deletions

View File

@@ -11,11 +11,26 @@
#include "zcash/Note.hpp"
#include "zcash/NoteEncryption.hpp"
using ::testing::_;
using ::testing::Return;
ZCJoinSplit* params = ZCJoinSplit::Unopened();
ACTION(ThrowLogicError) {
throw std::logic_error("Boom");
}
class MockWalletDB {
public:
MOCK_METHOD0(TxnBegin, bool());
MOCK_METHOD0(TxnCommit, bool());
MOCK_METHOD0(TxnAbort, bool());
MOCK_METHOD2(WriteTx, bool(uint256 hash, const CWalletTx& wtx));
MOCK_METHOD1(WriteWitnessCacheSize, bool(int64_t nWitnessCacheSize));
};
template void CWallet::WriteWitnessCache<MockWalletDB>(MockWalletDB& walletdb);
class TestWallet : public CWallet {
public:
TestWallet() : CWallet() { }
@@ -28,6 +43,9 @@ public:
void DecrementNoteWitnesses() {
CWallet::DecrementNoteWitnesses();
}
void WriteWitnessCache(MockWalletDB& walletdb) {
CWallet::WriteWitnessCache(walletdb);
}
bool UpdatedNoteData(const CWalletTx& wtxIn, CWalletTx& wtx) {
return CWallet::UpdatedNoteData(wtxIn, wtx);
}
@@ -679,6 +697,50 @@ TEST(wallet_tests, ClearNoteWitnessCache) {
EXPECT_FALSE((bool) witnesses[1]);
}
TEST(wallet_tests, WriteWitnessCache) {
TestWallet wallet;
MockWalletDB walletdb;
auto sk = libzcash::SpendingKey::random();
wallet.AddSpendingKey(sk);
auto wtx = GetValidReceive(sk, 10, true);
wallet.AddToWallet(wtx, true, NULL);
EXPECT_CALL(walletdb, TxnBegin())
.WillOnce(Return(false))
.WillRepeatedly(Return(true));
EXPECT_CALL(walletdb, TxnCommit())
.WillOnce(Return(false))
.WillRepeatedly(Return(true));
EXPECT_CALL(walletdb, TxnAbort())
.Times(4);
EXPECT_CALL(walletdb, WriteTx(wtx.GetHash(), wtx))
.WillOnce(Return(false))
.WillOnce(ThrowLogicError())
.WillRepeatedly(Return(true));
EXPECT_CALL(walletdb, WriteWitnessCacheSize(0))
.WillOnce(Return(false))
.WillOnce(ThrowLogicError())
.WillRepeatedly(Return(true));
// TxnBegin fails
wallet.WriteWitnessCache(walletdb);
// WriteTx fails
wallet.WriteWitnessCache(walletdb);
// WriteTx throws
wallet.WriteWitnessCache(walletdb);
// WriteWitnessCacheSize fails
wallet.WriteWitnessCache(walletdb);
// WriteWitnessCacheSize throws
wallet.WriteWitnessCache(walletdb);
// TxCommit fails
wallet.WriteWitnessCache(walletdb);
// Everything succeeds
wallet.WriteWitnessCache(walletdb);
}
TEST(wallet_tests, UpdatedNoteData) {
TestWallet wallet;