Line data Source code
1 : // Copyright (c) 2012-2014 The Bitcoin Core developers
2 : // Distributed under the MIT software license, see the accompanying
3 : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4 :
5 : #include "wallet/wallet.h"
6 : #include "wallet/walletdb.h"
7 :
8 : #include "test/test_bitcoin.h"
9 :
10 : #include <stdint.h>
11 :
12 : #include <boost/foreach.hpp>
13 : #include <boost/test/unit_test.hpp>
14 :
15 : extern CWallet* pwalletMain;
16 :
17 1 : BOOST_FIXTURE_TEST_SUITE(accounting_tests, TestingSetup)
18 :
19 : static void
20 4 : GetResults(CWalletDB& walletdb, std::map<CAmount, CAccountingEntry>& results)
21 : {
22 : std::list<CAccountingEntry> aes;
23 :
24 : results.clear();
25 32 : BOOST_CHECK(walletdb.ReorderTransactions(pwalletMain) == DB_LOAD_OK);
26 12 : walletdb.ListAccountCreditDebit("", aes);
27 96 : BOOST_FOREACH(CAccountingEntry& ae, aes)
28 : {
29 12 : results[ae.nOrderPos] = ae;
30 : }
31 4 : }
32 :
33 6 : BOOST_AUTO_TEST_CASE(acc_orderupgrade)
34 : {
35 1 : CWalletDB walletdb(pwalletMain->strWalletFile);
36 : std::vector<CWalletTx*> vpwtx;
37 2 : CWalletTx wtx;
38 2 : CAccountingEntry ae;
39 : std::map<CAmount, CAccountingEntry> results;
40 :
41 1 : LOCK(pwalletMain->cs_wallet);
42 :
43 : ae.strAccount = "";
44 1 : ae.nCreditDebit = 1;
45 1 : ae.nTime = 1333333333;
46 : ae.strOtherAccount = "b";
47 : ae.strComment = "";
48 1 : walletdb.WriteAccountingEntry(ae);
49 :
50 3 : wtx.mapValue["comment"] = "z";
51 1 : pwalletMain->AddToWallet(wtx, false, &walletdb);
52 1 : vpwtx.push_back(&pwalletMain->mapWallet[wtx.GetHash()]);
53 1 : vpwtx[0]->nTimeReceived = (unsigned int)1333333335;
54 1 : vpwtx[0]->nOrderPos = -1;
55 :
56 1 : ae.nTime = 1333333336;
57 : ae.strOtherAccount = "c";
58 1 : walletdb.WriteAccountingEntry(ae);
59 :
60 1 : GetResults(walletdb, results);
61 :
62 8 : BOOST_CHECK(pwalletMain->nOrderPosNext == 3);
63 8 : BOOST_CHECK(2 == results.size());
64 7 : BOOST_CHECK(results[0].nTime == 1333333333);
65 9 : BOOST_CHECK(results[0].strComment.empty());
66 8 : BOOST_CHECK(1 == vpwtx[0]->nOrderPos);
67 8 : BOOST_CHECK(results[2].nTime == 1333333336);
68 9 : BOOST_CHECK(results[2].strOtherAccount == "c");
69 :
70 :
71 1 : ae.nTime = 1333333330;
72 : ae.strOtherAccount = "d";
73 1 : ae.nOrderPos = pwalletMain->IncOrderPosNext();
74 1 : walletdb.WriteAccountingEntry(ae);
75 :
76 1 : GetResults(walletdb, results);
77 :
78 8 : BOOST_CHECK(results.size() == 3);
79 8 : BOOST_CHECK(pwalletMain->nOrderPosNext == 4);
80 8 : BOOST_CHECK(results[0].nTime == 1333333333);
81 8 : BOOST_CHECK(1 == vpwtx[0]->nOrderPos);
82 8 : BOOST_CHECK(results[2].nTime == 1333333336);
83 8 : BOOST_CHECK(results[3].nTime == 1333333330);
84 9 : BOOST_CHECK(results[3].strComment.empty());
85 :
86 :
87 3 : wtx.mapValue["comment"] = "y";
88 : {
89 1 : CMutableTransaction tx(wtx);
90 1 : --tx.nLockTime; // Just to change the hash :)
91 2 : *static_cast<CTransaction*>(&wtx) = CTransaction(tx);
92 : }
93 1 : pwalletMain->AddToWallet(wtx, false, &walletdb);
94 1 : vpwtx.push_back(&pwalletMain->mapWallet[wtx.GetHash()]);
95 1 : vpwtx[1]->nTimeReceived = (unsigned int)1333333336;
96 :
97 3 : wtx.mapValue["comment"] = "x";
98 : {
99 1 : CMutableTransaction tx(wtx);
100 1 : --tx.nLockTime; // Just to change the hash :)
101 2 : *static_cast<CTransaction*>(&wtx) = CTransaction(tx);
102 : }
103 1 : pwalletMain->AddToWallet(wtx, false, &walletdb);
104 1 : vpwtx.push_back(&pwalletMain->mapWallet[wtx.GetHash()]);
105 1 : vpwtx[2]->nTimeReceived = (unsigned int)1333333329;
106 1 : vpwtx[2]->nOrderPos = -1;
107 :
108 1 : GetResults(walletdb, results);
109 :
110 8 : BOOST_CHECK(results.size() == 3);
111 8 : BOOST_CHECK(pwalletMain->nOrderPosNext == 6);
112 8 : BOOST_CHECK(0 == vpwtx[2]->nOrderPos);
113 8 : BOOST_CHECK(results[1].nTime == 1333333333);
114 7 : BOOST_CHECK(2 == vpwtx[0]->nOrderPos);
115 8 : BOOST_CHECK(results[3].nTime == 1333333336);
116 8 : BOOST_CHECK(results[4].nTime == 1333333330);
117 9 : BOOST_CHECK(results[4].strComment.empty());
118 8 : BOOST_CHECK(5 == vpwtx[1]->nOrderPos);
119 :
120 :
121 1 : ae.nTime = 1333333334;
122 : ae.strOtherAccount = "e";
123 1 : ae.nOrderPos = -1;
124 1 : walletdb.WriteAccountingEntry(ae);
125 :
126 1 : GetResults(walletdb, results);
127 :
128 8 : BOOST_CHECK(results.size() == 4);
129 8 : BOOST_CHECK(pwalletMain->nOrderPosNext == 7);
130 8 : BOOST_CHECK(0 == vpwtx[2]->nOrderPos);
131 8 : BOOST_CHECK(results[1].nTime == 1333333333);
132 8 : BOOST_CHECK(2 == vpwtx[0]->nOrderPos);
133 8 : BOOST_CHECK(results[3].nTime == 1333333336);
134 9 : BOOST_CHECK(results[3].strComment.empty());
135 8 : BOOST_CHECK(results[4].nTime == 1333333330);
136 9 : BOOST_CHECK(results[4].strComment.empty());
137 8 : BOOST_CHECK(results[5].nTime == 1333333334);
138 8 : BOOST_CHECK(6 == vpwtx[1]->nOrderPos);
139 1 : }
140 :
141 3 : BOOST_AUTO_TEST_SUITE_END()
|