OSDN Git Service

Merge branch 'dev' into wallet_optimise
[bytom/bytom.git] / account / reserve_test.go
1 package account
2
3 import (
4         "context"
5         "encoding/json"
6         "io/ioutil"
7         "os"
8         "testing"
9         "time"
10
11         dbm "github.com/tendermint/tmlibs/db"
12
13         "github.com/bytom/blockchain/pseudohsm"
14         "github.com/bytom/consensus"
15         "github.com/bytom/crypto/ed25519/chainkd"
16         "github.com/bytom/database/leveldb"
17         "github.com/bytom/database/storage"
18         "github.com/bytom/protocol"
19         "github.com/bytom/protocol/bc"
20         "github.com/bytom/protocol/state"
21 )
22
23 func TestCancelReservation(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         chain, err := mockChain(testDB)
34         if err != nil {
35                 t.Fatal(err)
36         }
37
38         accountManager := NewManager(testDB, chain)
39         hsm, err := pseudohsm.New(dirPath)
40         if err != nil {
41                 t.Fatal(err)
42         }
43
44         xpub1, err := hsm.XCreate("test_pub", "password")
45         if err != nil {
46                 t.Fatal(err)
47         }
48
49         testAccount, err := accountManager.Create(nil, []chainkd.XPub{xpub1.XPub}, 1, "testAccount")
50         if err != nil {
51                 t.Fatal(err)
52         }
53
54         controlProg, err := accountManager.CreateAddress(nil, testAccount.ID, false)
55         if err != nil {
56                 t.Fatal(err)
57         }
58
59         utxo := mockUTXO(controlProg)
60
61         batch := testDB.NewBatch()
62
63         utxoE := struct {
64                 hash      bc.Hash
65                 utxoEntry *storage.UtxoEntry
66                 exist     bool
67         }{
68                 hash:      utxo.OutputID,
69                 utxoEntry: storage.NewUtxoEntry(true, 0, false),
70                 exist:     true,
71         }
72
73         view := state.NewUtxoViewpoint()
74         view.Entries[utxoE.hash] = utxoE.utxoEntry
75
76         leveldb.SaveUtxoView(batch, view)
77         batch.Write()
78
79         utxoDB := newReserver(chain, testDB)
80
81         batch = utxoDB.db.NewBatch()
82
83         data, err := json.Marshal(utxo)
84         if err != nil {
85                 t.Fatal(err)
86         }
87
88         batch.Set(StandardUTXOKey(utxo.OutputID), data)
89         batch.Write()
90
91         outid := utxo.OutputID
92
93         ctx := context.Background()
94         res, err := utxoDB.ReserveUTXO(ctx, outid, nil, time.Now())
95         if err != nil {
96                 t.Fatal(err)
97         }
98
99         // Verify that the UTXO is reserved.
100         _, err = utxoDB.ReserveUTXO(ctx, outid, nil, time.Now())
101         if err != ErrReserved {
102                 t.Fatalf("got=%s want=%s", err, ErrReserved)
103         }
104
105         // Cancel the reservation.
106         err = utxoDB.Cancel(ctx, res.ID)
107         if err != nil {
108                 t.Fatal(err)
109         }
110
111         // Reserving again should succeed.
112         _, err = utxoDB.ReserveUTXO(ctx, outid, nil, time.Now())
113         if err != nil {
114                 t.Fatal(err)
115         }
116 }
117
118 func mockChain(testDB dbm.DB) (*protocol.Chain, error) {
119         store := leveldb.NewStore(testDB)
120         txPool := protocol.NewTxPool()
121         chain, err := protocol.NewChain(store, txPool)
122         if err != nil {
123                 return nil, err
124         }
125         return chain, nil
126 }
127
128 func mockUTXO(controlProg *CtrlProgram) *UTXO {
129         utxo := &UTXO{}
130         utxo.OutputID = bc.Hash{V0: 1}
131         utxo.SourceID = bc.Hash{V0: 2}
132         utxo.AssetID = *consensus.BTMAssetID
133         utxo.Amount = 1000000000
134         utxo.SourcePos = 0
135         utxo.ControlProgram = controlProg.ControlProgram
136         utxo.AccountID = controlProg.AccountID
137         utxo.Address = controlProg.Address
138         utxo.ControlProgramIndex = controlProg.KeyIndex
139         return utxo
140 }