OSDN Git Service

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