OSDN Git Service

add dpos consensus
[bytom/vapor.git] / wallet / wallet_test.go
1 package wallet
2
3 import (
4         "io/ioutil"
5         "os"
6         "testing"
7         "time"
8
9         dbm "github.com/tendermint/tmlibs/db"
10         "github.com/vapor/blockchain/signers"
11
12         "github.com/vapor/account"
13         "github.com/vapor/asset"
14         "github.com/vapor/blockchain/pseudohsm"
15         "github.com/vapor/blockchain/txbuilder"
16         "github.com/vapor/consensus"
17         "github.com/vapor/crypto/ed25519/chainkd"
18         "github.com/vapor/database/leveldb"
19         "github.com/vapor/protocol"
20         "github.com/vapor/protocol/bc"
21         "github.com/vapor/protocol/bc/types"
22 )
23
24 func TestWalletUpdate(t *testing.T) {
25         dirPath, err := ioutil.TempDir(".", "")
26         if err != nil {
27                 t.Fatal(err)
28         }
29         defer os.RemoveAll(dirPath)
30
31         testDB := dbm.NewDB("testdb", "leveldb", "temp")
32         defer os.RemoveAll("temp")
33
34         store := leveldb.NewStore(testDB)
35         txPool := protocol.NewTxPool(store)
36
37         chain, err := protocol.NewChain(store, txPool)
38         if err != nil {
39                 t.Fatal(err)
40         }
41
42         accountManager := account.NewManager(testDB, chain)
43         hsm, err := pseudohsm.New(dirPath)
44         if err != nil {
45                 t.Fatal(err)
46         }
47
48         xpub1, _, err := hsm.XCreate("test_pub1", "password", "en")
49         if err != nil {
50                 t.Fatal(err)
51         }
52
53         testAccount, err := accountManager.Create([]chainkd.XPub{xpub1.XPub}, 1, "testAccount", signers.BIP0044)
54         if err != nil {
55                 t.Fatal(err)
56         }
57
58         controlProg, err := accountManager.CreateAddress(testAccount.ID, false)
59         if err != nil {
60                 t.Fatal(err)
61         }
62
63         controlProg.KeyIndex = 1
64
65         reg := asset.NewRegistry(testDB, chain)
66         asset, err := reg.Define([]chainkd.XPub{xpub1.XPub}, 1, nil, "TESTASSET", nil)
67         if err != nil {
68                 t.Fatal(err)
69         }
70
71         utxos := []*account.UTXO{}
72         btmUtxo := mockUTXO(controlProg, consensus.BTMAssetID)
73         utxos = append(utxos, btmUtxo)
74         OtherUtxo := mockUTXO(controlProg, &asset.AssetID)
75         utxos = append(utxos, OtherUtxo)
76
77         _, txData, err := mockTxData(utxos, testAccount)
78         if err != nil {
79                 t.Fatal(err)
80         }
81
82         tx := types.NewTx(*txData)
83         block := mockSingleBlock(tx)
84         txStatus := bc.NewTransactionStatus()
85         txStatus.SetStatus(0, false)
86         store.SaveBlock(block, txStatus)
87
88         w := mockWallet(testDB, accountManager, reg, chain)
89         err = w.AttachBlock(block)
90         if err != nil {
91                 t.Fatal(err)
92         }
93
94         if _, err := w.GetTransactionByTxID(tx.ID.String()); err != nil {
95                 t.Fatal(err)
96         }
97
98         wants, err := w.GetTransactions("")
99         if len(wants) != 1 {
100                 t.Fatal(err)
101         }
102 }
103
104 func mockUTXO(controlProg *account.CtrlProgram, assetID *bc.AssetID) *account.UTXO {
105         utxo := &account.UTXO{}
106         utxo.OutputID = bc.Hash{V0: 1}
107         utxo.SourceID = bc.Hash{V0: 2}
108         utxo.AssetID = *assetID
109         utxo.Amount = 1000000000
110         utxo.SourcePos = 0
111         utxo.ControlProgram = controlProg.ControlProgram
112         utxo.AccountID = controlProg.AccountID
113         utxo.Address = controlProg.Address
114         utxo.ControlProgramIndex = controlProg.KeyIndex
115         return utxo
116 }
117
118 func mockTxData(utxos []*account.UTXO, testAccount *account.Account) (*txbuilder.Template, *types.TxData, error) {
119         tplBuilder := txbuilder.NewBuilder(time.Now())
120
121         for _, utxo := range utxos {
122                 txInput, sigInst, err := account.UtxoToInputs(testAccount.Signer, utxo)
123                 if err != nil {
124                         return nil, nil, err
125                 }
126                 tplBuilder.AddInput(txInput, sigInst)
127
128                 out := &types.TxOutput{}
129                 if utxo.AssetID == *consensus.BTMAssetID {
130                         out = types.NewTxOutput(utxo.AssetID, 100, utxo.ControlProgram)
131                 } else {
132                         out = types.NewTxOutput(utxo.AssetID, utxo.Amount, utxo.ControlProgram)
133                 }
134                 tplBuilder.AddOutput(out)
135         }
136
137         return tplBuilder.Build()
138 }
139
140 func mockWallet(walletDB dbm.DB, account *account.Manager, asset *asset.Registry, chain *protocol.Chain) *Wallet {
141         wallet := &Wallet{
142                 DB:          walletDB,
143                 AccountMgr:  account,
144                 AssetReg:    asset,
145                 chain:       chain,
146                 RecoveryMgr: newRecoveryManager(walletDB, account),
147         }
148         return wallet
149 }
150
151 func mockSingleBlock(tx *types.Tx) *types.Block {
152         return &types.Block{
153                 BlockHeader: types.BlockHeader{
154                         Version: 1,
155                         Height:  1,
156                 },
157                 Transactions: []*types.Tx{tx},
158         }
159 }