Changeset View
Changeset View
Standalone View
Standalone View
src/wallet/test/walletdb_tests.cpp
// Copyright (c) 2017 The Bitcoin developers | // Copyright (c) 2017 The Bitcoin developers | ||||
// Distributed under the MIT software license, see the accompanying | // Distributed under the MIT software license, see the accompanying | ||||
// file COPYING or http://www.opensource.org/licenses/mit-license.php. | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | ||||
#include <wallet/walletdb.h> | #include <wallet/walletdb.h> | ||||
#include <chainparams.h> | #include <chainparams.h> | ||||
#include <wallet/wallet.h> | #include <wallet/wallet.h> | ||||
#include <test/test_bitcoin.h> | #include <test/test_bitcoin.h> | ||||
#include <wallet/test/wallet_test_fixture.h> | #include <wallet/test/wallet_test_fixture.h> | ||||
#include <boost/test/unit_test.hpp> | #include <boost/test/unit_test.hpp> | ||||
namespace { | namespace { | ||||
static std::unique_ptr<CWallet> LoadWallet(CWalletDB *db) { | static std::unique_ptr<CWallet> LoadWallet(WalletBatch &batch) { | ||||
std::unique_ptr<CWallet> wallet( | std::unique_ptr<CWallet> wallet( | ||||
new CWallet(Params(), "dummy", CWalletDBWrapper::CreateDummy())); | new CWallet(Params(), "dummy", WalletDatabase::CreateDummy())); | ||||
DBErrors res = db->LoadWallet(wallet.get()); | DBErrors res = batch.LoadWallet(wallet.get()); | ||||
BOOST_CHECK(res == DBErrors::LOAD_OK); | BOOST_CHECK(res == DBErrors::LOAD_OK); | ||||
return wallet; | return wallet; | ||||
} | } | ||||
} // namespace | } // namespace | ||||
BOOST_FIXTURE_TEST_SUITE(walletdb_tests, WalletTestingSetup) | BOOST_FIXTURE_TEST_SUITE(walletdb_tests, WalletTestingSetup) | ||||
BOOST_AUTO_TEST_CASE(write_erase_name) { | BOOST_AUTO_TEST_CASE(write_erase_name) { | ||||
CWalletDB walletdb(m_wallet.GetDBHandle(), "cr+"); | WalletBatch batch(m_wallet.GetDBHandle(), "cr+"); | ||||
CTxDestination dst1 = CKeyID(uint160S("c0ffee")); | CTxDestination dst1 = CKeyID(uint160S("c0ffee")); | ||||
CTxDestination dst2 = CKeyID(uint160S("f00d")); | CTxDestination dst2 = CKeyID(uint160S("f00d")); | ||||
BOOST_CHECK(walletdb.WriteName(dst1, "name1")); | BOOST_CHECK(batch.WriteName(dst1, "name1")); | ||||
BOOST_CHECK(walletdb.WriteName(dst2, "name2")); | BOOST_CHECK(batch.WriteName(dst2, "name2")); | ||||
{ | { | ||||
auto w = LoadWallet(&walletdb); | auto w = LoadWallet(batch); | ||||
BOOST_CHECK_EQUAL(1, w->mapAddressBook.count(dst1)); | BOOST_CHECK_EQUAL(1, w->mapAddressBook.count(dst1)); | ||||
BOOST_CHECK_EQUAL("name1", w->mapAddressBook[dst1].name); | BOOST_CHECK_EQUAL("name1", w->mapAddressBook[dst1].name); | ||||
BOOST_CHECK_EQUAL("name2", w->mapAddressBook[dst2].name); | BOOST_CHECK_EQUAL("name2", w->mapAddressBook[dst2].name); | ||||
} | } | ||||
walletdb.EraseName(dst1); | batch.EraseName(dst1); | ||||
{ | { | ||||
auto w = LoadWallet(&walletdb); | auto w = LoadWallet(batch); | ||||
BOOST_CHECK_EQUAL(0, w->mapAddressBook.count(dst1)); | BOOST_CHECK_EQUAL(0, w->mapAddressBook.count(dst1)); | ||||
BOOST_CHECK_EQUAL(1, w->mapAddressBook.count(dst2)); | BOOST_CHECK_EQUAL(1, w->mapAddressBook.count(dst2)); | ||||
} | } | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(write_erase_purpose) { | BOOST_AUTO_TEST_CASE(write_erase_purpose) { | ||||
CWalletDB walletdb(m_wallet.GetDBHandle(), "cr+"); | WalletBatch batch(m_wallet.GetDBHandle(), "cr+"); | ||||
CTxDestination dst1 = CKeyID(uint160S("c0ffee")); | CTxDestination dst1 = CKeyID(uint160S("c0ffee")); | ||||
CTxDestination dst2 = CKeyID(uint160S("f00d")); | CTxDestination dst2 = CKeyID(uint160S("f00d")); | ||||
BOOST_CHECK(walletdb.WritePurpose(dst1, "purpose1")); | BOOST_CHECK(batch.WritePurpose(dst1, "purpose1")); | ||||
BOOST_CHECK(walletdb.WritePurpose(dst2, "purpose2")); | BOOST_CHECK(batch.WritePurpose(dst2, "purpose2")); | ||||
{ | { | ||||
auto w = LoadWallet(&walletdb); | auto w = LoadWallet(batch); | ||||
BOOST_CHECK_EQUAL(1, w->mapAddressBook.count(dst1)); | BOOST_CHECK_EQUAL(1, w->mapAddressBook.count(dst1)); | ||||
BOOST_CHECK_EQUAL("purpose1", w->mapAddressBook[dst1].purpose); | BOOST_CHECK_EQUAL("purpose1", w->mapAddressBook[dst1].purpose); | ||||
BOOST_CHECK_EQUAL("purpose2", w->mapAddressBook[dst2].purpose); | BOOST_CHECK_EQUAL("purpose2", w->mapAddressBook[dst2].purpose); | ||||
} | } | ||||
walletdb.ErasePurpose(dst1); | batch.ErasePurpose(dst1); | ||||
{ | { | ||||
auto w = LoadWallet(&walletdb); | auto w = LoadWallet(batch); | ||||
BOOST_CHECK_EQUAL(0, w->mapAddressBook.count(dst1)); | BOOST_CHECK_EQUAL(0, w->mapAddressBook.count(dst1)); | ||||
BOOST_CHECK_EQUAL(1, w->mapAddressBook.count(dst2)); | BOOST_CHECK_EQUAL(1, w->mapAddressBook.count(dst2)); | ||||
} | } | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(write_erase_destdata) { | BOOST_AUTO_TEST_CASE(write_erase_destdata) { | ||||
CWalletDB walletdb(m_wallet.GetDBHandle(), "cr+"); | WalletBatch batch(m_wallet.GetDBHandle(), "cr+"); | ||||
CTxDestination dst1 = CKeyID(uint160S("c0ffee")); | CTxDestination dst1 = CKeyID(uint160S("c0ffee")); | ||||
CTxDestination dst2 = CKeyID(uint160S("f00d")); | CTxDestination dst2 = CKeyID(uint160S("f00d")); | ||||
BOOST_CHECK(walletdb.WriteDestData(dst1, "key1", "value1")); | BOOST_CHECK(batch.WriteDestData(dst1, "key1", "value1")); | ||||
BOOST_CHECK(walletdb.WriteDestData(dst1, "key2", "value2")); | BOOST_CHECK(batch.WriteDestData(dst1, "key2", "value2")); | ||||
BOOST_CHECK(walletdb.WriteDestData(dst2, "key1", "value3")); | BOOST_CHECK(batch.WriteDestData(dst2, "key1", "value3")); | ||||
BOOST_CHECK(walletdb.WriteDestData(dst2, "key2", "value4")); | BOOST_CHECK(batch.WriteDestData(dst2, "key2", "value4")); | ||||
{ | { | ||||
auto w = LoadWallet(&walletdb); | auto w = LoadWallet(batch); | ||||
std::string val; | std::string val; | ||||
BOOST_CHECK(w->GetDestData(dst1, "key1", &val)); | BOOST_CHECK(w->GetDestData(dst1, "key1", &val)); | ||||
BOOST_CHECK_EQUAL("value1", val); | BOOST_CHECK_EQUAL("value1", val); | ||||
BOOST_CHECK(w->GetDestData(dst1, "key2", &val)); | BOOST_CHECK(w->GetDestData(dst1, "key2", &val)); | ||||
BOOST_CHECK_EQUAL("value2", val); | BOOST_CHECK_EQUAL("value2", val); | ||||
BOOST_CHECK(w->GetDestData(dst2, "key1", &val)); | BOOST_CHECK(w->GetDestData(dst2, "key1", &val)); | ||||
BOOST_CHECK_EQUAL("value3", val); | BOOST_CHECK_EQUAL("value3", val); | ||||
BOOST_CHECK(w->GetDestData(dst2, "key2", &val)); | BOOST_CHECK(w->GetDestData(dst2, "key2", &val)); | ||||
BOOST_CHECK_EQUAL("value4", val); | BOOST_CHECK_EQUAL("value4", val); | ||||
} | } | ||||
walletdb.EraseDestData(dst1, "key2"); | batch.EraseDestData(dst1, "key2"); | ||||
{ | { | ||||
auto w = LoadWallet(&walletdb); | auto w = LoadWallet(batch); | ||||
std::string dummy; | std::string dummy; | ||||
BOOST_CHECK(w->GetDestData(dst1, "key1", &dummy)); | BOOST_CHECK(w->GetDestData(dst1, "key1", &dummy)); | ||||
BOOST_CHECK(!w->GetDestData(dst1, "key2", &dummy)); | BOOST_CHECK(!w->GetDestData(dst1, "key2", &dummy)); | ||||
BOOST_CHECK(w->GetDestData(dst2, "key1", &dummy)); | BOOST_CHECK(w->GetDestData(dst2, "key1", &dummy)); | ||||
BOOST_CHECK(w->GetDestData(dst2, "key2", &dummy)); | BOOST_CHECK(w->GetDestData(dst2, "key2", &dummy)); | ||||
} | } | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(no_dest_fails) { | BOOST_AUTO_TEST_CASE(no_dest_fails) { | ||||
CWalletDB walletdb(m_wallet.GetDBHandle(), "cr+"); | WalletBatch batch(m_wallet.GetDBHandle(), "cr+"); | ||||
CTxDestination dst = CNoDestination{}; | CTxDestination dst = CNoDestination{}; | ||||
BOOST_CHECK(!walletdb.WriteName(dst, "name")); | BOOST_CHECK(!batch.WriteName(dst, "name")); | ||||
BOOST_CHECK(!walletdb.WritePurpose(dst, "purpose")); | BOOST_CHECK(!batch.WritePurpose(dst, "purpose")); | ||||
BOOST_CHECK(!walletdb.WriteDestData(dst, "key", "value")); | BOOST_CHECK(!batch.WriteDestData(dst, "key", "value")); | ||||
} | } | ||||
BOOST_AUTO_TEST_SUITE_END() | BOOST_AUTO_TEST_SUITE_END() |