OSDN Git Service

init for remove issue (#63)
[bytom/vapor.git] / wallet / utxo_test.go
1 package wallet
2
3 import (
4         "encoding/hex"
5         "encoding/json"
6         "fmt"
7         "os"
8         "sort"
9         "testing"
10
11         "github.com/vapor/account"
12         "github.com/vapor/consensus"
13         dbm "github.com/vapor/database/leveldb"
14         "github.com/vapor/protocol/bc"
15         "github.com/vapor/protocol/bc/types"
16         "github.com/vapor/testutil"
17 )
18
19 func TestGetAccountUtxos(t *testing.T) {
20         testDB := dbm.NewDB("testdb", "leveldb", "temp")
21         defer os.RemoveAll("temp")
22
23         cases := []struct {
24                 dbUtxos          map[string]*account.UTXO
25                 unconfirmedUtxos []*account.UTXO
26                 id               string
27                 unconfirmed      bool
28                 isSmartContract  bool
29                 wantUtxos        []*account.UTXO
30         }{
31                 {
32                         dbUtxos:         map[string]*account.UTXO{},
33                         id:              "",
34                         unconfirmed:     false,
35                         isSmartContract: false,
36                         wantUtxos:       []*account.UTXO{},
37                 },
38                 {
39                         dbUtxos: map[string]*account.UTXO{
40                                 string(account.StandardUTXOKey(bc.Hash{V0: 1})): &account.UTXO{
41                                         OutputID: bc.Hash{V0: 1},
42                                 },
43                                 string(account.StandardUTXOKey(bc.Hash{V0: 2})): &account.UTXO{
44                                         OutputID: bc.Hash{V0: 2},
45                                 },
46                                 string(account.StandardUTXOKey(bc.Hash{V0: 3})): &account.UTXO{
47                                         OutputID: bc.Hash{V0: 3},
48                                 },
49                                 string(account.ContractUTXOKey(bc.Hash{V0: 4})): &account.UTXO{
50                                         OutputID: bc.Hash{V0: 4},
51                                 },
52                         },
53                         unconfirmedUtxos: []*account.UTXO{},
54                         id:               "",
55                         isSmartContract:  false,
56                         wantUtxos: []*account.UTXO{
57                                 &account.UTXO{OutputID: bc.Hash{V0: 1}},
58                                 &account.UTXO{OutputID: bc.Hash{V0: 2}},
59                                 &account.UTXO{OutputID: bc.Hash{V0: 3}},
60                         },
61                 },
62                 {
63                         dbUtxos: map[string]*account.UTXO{
64                                 string(account.StandardUTXOKey(bc.Hash{V0: 1})): &account.UTXO{
65                                         OutputID: bc.Hash{V0: 1},
66                                 },
67                                 string(account.StandardUTXOKey(bc.Hash{V0: 2})): &account.UTXO{
68                                         OutputID: bc.Hash{V0: 2},
69                                 },
70                                 string(account.StandardUTXOKey(bc.Hash{V0: 3})): &account.UTXO{
71                                         OutputID: bc.Hash{V0: 3},
72                                 },
73                                 string(account.ContractUTXOKey(bc.Hash{V0: 4})): &account.UTXO{
74                                         OutputID: bc.Hash{V0: 4},
75                                 },
76                         },
77                         unconfirmedUtxos: []*account.UTXO{
78                                 &account.UTXO{
79                                         OutputID:       bc.Hash{V0: 5},
80                                         ControlProgram: []byte("smart contract"),
81                                 },
82                         },
83                         id:              "",
84                         unconfirmed:     false,
85                         isSmartContract: true,
86                         wantUtxos: []*account.UTXO{
87                                 &account.UTXO{OutputID: bc.Hash{V0: 4}},
88                         },
89                 },
90                 {
91                         dbUtxos: map[string]*account.UTXO{
92                                 string(account.StandardUTXOKey(bc.Hash{V0: 1})): &account.UTXO{
93                                         OutputID: bc.Hash{V0: 1},
94                                 },
95                                 string(account.StandardUTXOKey(bc.Hash{V0: 1, V1: 2})): &account.UTXO{
96                                         OutputID: bc.Hash{V0: 1, V1: 2},
97                                 },
98                                 string(account.StandardUTXOKey(bc.Hash{V0: 2})): &account.UTXO{
99                                         OutputID: bc.Hash{V0: 2},
100                                 },
101                                 string(account.StandardUTXOKey(bc.Hash{V0: 2, V1: 2})): &account.UTXO{
102                                         OutputID: bc.Hash{V0: 2, V1: 2},
103                                 },
104                         },
105                         unconfirmedUtxos: []*account.UTXO{
106                                 &account.UTXO{
107                                         OutputID:       bc.Hash{V0: 6},
108                                         ControlProgram: []byte{0x51},
109                                 },
110                         },
111                         id:              "0000000000000002",
112                         unconfirmed:     false,
113                         isSmartContract: false,
114                         wantUtxos: []*account.UTXO{
115                                 &account.UTXO{OutputID: bc.Hash{V0: 2}},
116                                 &account.UTXO{OutputID: bc.Hash{V0: 2, V1: 2}},
117                         },
118                 },
119                 {
120                         dbUtxos: map[string]*account.UTXO{
121                                 string(account.StandardUTXOKey(bc.Hash{V0: 3})): &account.UTXO{
122                                         OutputID: bc.Hash{V0: 3},
123                                 },
124                                 string(account.ContractUTXOKey(bc.Hash{V0: 4})): &account.UTXO{
125                                         OutputID: bc.Hash{V0: 4},
126                                 },
127                         },
128                         unconfirmedUtxos: []*account.UTXO{
129                                 &account.UTXO{
130                                         OutputID:       bc.Hash{V0: 5},
131                                         ControlProgram: []byte("smart contract"),
132                                 },
133                                 &account.UTXO{
134                                         OutputID:       bc.Hash{V0: 6},
135                                         ControlProgram: []byte{0x51},
136                                 },
137                         },
138                         id:              "",
139                         unconfirmed:     true,
140                         isSmartContract: true,
141                         wantUtxos: []*account.UTXO{
142                                 &account.UTXO{
143                                         OutputID:       bc.Hash{V0: 5},
144                                         ControlProgram: []byte("smart contract"),
145                                 },
146                                 &account.UTXO{
147                                         OutputID: bc.Hash{V0: 4},
148                                 },
149                         },
150                 },
151                 {
152                         dbUtxos: map[string]*account.UTXO{
153                                 string(account.StandardUTXOKey(bc.Hash{V0: 3})): &account.UTXO{
154                                         OutputID: bc.Hash{V0: 3},
155                                 },
156                                 string(account.ContractUTXOKey(bc.Hash{V0: 4})): &account.UTXO{
157                                         OutputID: bc.Hash{V0: 4},
158                                 },
159                         },
160                         unconfirmedUtxos: []*account.UTXO{
161                                 &account.UTXO{
162                                         OutputID:       bc.Hash{V0: 5},
163                                         ControlProgram: []byte("smart contract"),
164                                 },
165                                 &account.UTXO{
166                                         OutputID:       bc.Hash{V0: 6},
167                                         ControlProgram: []byte{0x51},
168                                 },
169                         },
170                         id:              "",
171                         unconfirmed:     true,
172                         isSmartContract: false,
173                         wantUtxos: []*account.UTXO{
174                                 &account.UTXO{
175                                         OutputID:       bc.Hash{V0: 6},
176                                         ControlProgram: []byte{0x51},
177                                 },
178                                 &account.UTXO{
179                                         OutputID: bc.Hash{V0: 3},
180                                 },
181                         },
182                 },
183         }
184
185         w := &Wallet{DB: testDB}
186         for i, c := range cases {
187                 for k, u := range c.dbUtxos {
188                         data, err := json.Marshal(u)
189                         if err != nil {
190                                 t.Error(err)
191                         }
192                         testDB.Set([]byte(k), data)
193                 }
194
195                 w.AccountMgr = account.NewManager(testDB, nil)
196                 w.AccountMgr.AddUnconfirmedUtxo(c.unconfirmedUtxos)
197                 gotUtxos := w.GetAccountUtxos("", c.id, c.unconfirmed, c.isSmartContract)
198                 if !testutil.DeepEqual(gotUtxos, c.wantUtxos) {
199                         t.Errorf("case %d: got %v want %v", i, gotUtxos, c.wantUtxos)
200                 }
201
202                 for k := range c.dbUtxos {
203                         testDB.Delete([]byte(k))
204                 }
205         }
206 }
207
208 func TestFilterAccountUtxo(t *testing.T) {
209         testDB := dbm.NewDB("testdb", "leveldb", "temp")
210         defer os.RemoveAll("temp")
211
212         cases := []struct {
213                 dbPrograms map[string]*account.CtrlProgram
214                 input      []*account.UTXO
215                 wantUtxos  []*account.UTXO
216         }{
217                 {
218                         dbPrograms: map[string]*account.CtrlProgram{},
219                         input:      []*account.UTXO{},
220                         wantUtxos:  []*account.UTXO{},
221                 },
222                 {
223                         dbPrograms: map[string]*account.CtrlProgram{
224                                 "436f6e74726163743a2a37a64a4e15a772ab43bf3f5956d0d1f353946496788e7f40d0ff1796286a6f": &account.CtrlProgram{
225                                         AccountID: "testAccount",
226                                         Address:   "testAddress",
227                                         KeyIndex:  53,
228                                         Change:    true,
229                                 },
230                         },
231                         input: []*account.UTXO{
232                                 &account.UTXO{
233                                         ControlProgram: []byte{0x00, 0x14, 0x62, 0x50, 0x18, 0xb6, 0x85, 0x77, 0xba, 0x9b, 0x26, 0x19, 0xc8, 0x1d, 0x2e, 0x96, 0xba, 0x22, 0xbe, 0x77, 0x77, 0xd7},
234                                         AssetID:        bc.AssetID{V0: 1},
235                                         Amount:         3,
236                                 },
237                                 &account.UTXO{
238                                         ControlProgram: []byte{0x91},
239                                         AssetID:        bc.AssetID{V0: 1},
240                                         Amount:         4,
241                                 },
242                         },
243                         wantUtxos: []*account.UTXO{
244                                 &account.UTXO{
245                                         ControlProgram:      []byte{0x00, 0x14, 0x62, 0x50, 0x18, 0xb6, 0x85, 0x77, 0xba, 0x9b, 0x26, 0x19, 0xc8, 0x1d, 0x2e, 0x96, 0xba, 0x22, 0xbe, 0x77, 0x77, 0xd7},
246                                         AssetID:             bc.AssetID{V0: 1},
247                                         Amount:              3,
248                                         AccountID:           "testAccount",
249                                         Address:             "testAddress",
250                                         ControlProgramIndex: 53,
251                                         Change:              true,
252                                 },
253                                 &account.UTXO{
254                                         ControlProgram: []byte{0x91},
255                                         AssetID:        bc.AssetID{V0: 1},
256                                         Amount:         4,
257                                 },
258                         },
259                 },
260                 {
261                         dbPrograms: map[string]*account.CtrlProgram{},
262                         input: []*account.UTXO{
263                                 &account.UTXO{
264                                         ControlProgram: []byte{0x00, 0x14, 0x62, 0x50, 0x18, 0xb6, 0x85, 0x77, 0xba, 0x9b, 0x26, 0x19, 0xc8, 0x1d, 0x2e, 0x96, 0xba, 0x22, 0xbe, 0x77, 0x77, 0xd7},
265                                         AssetID:        bc.AssetID{V0: 1},
266                                         Amount:         3,
267                                 },
268                                 &account.UTXO{
269                                         ControlProgram: []byte{0x91},
270                                         AssetID:        bc.AssetID{V0: 1},
271                                         Amount:         3,
272                                 },
273                         },
274                         wantUtxos: []*account.UTXO{
275                                 &account.UTXO{
276                                         ControlProgram: []byte{0x91},
277                                         AssetID:        bc.AssetID{V0: 1},
278                                         Amount:         3,
279                                 },
280                         },
281                 },
282                 {
283                         dbPrograms: map[string]*account.CtrlProgram{
284                                 "436f6e74726163743a2a37a64a4e15a772ab43bf3f5956d0d1f353946496788e7f40d0ff1796286a6f": &account.CtrlProgram{
285                                         AccountID: "testAccount",
286                                         Address:   "testAddress",
287                                         KeyIndex:  53,
288                                         Change:    true,
289                                 },
290                                 "436f6e74726163743adb4d86262c12ba70d50b3ca3ae102d5682436243bd1e8c79569603f75675036a": &account.CtrlProgram{
291                                         AccountID: "testAccount2",
292                                         Address:   "testAddress2",
293                                         KeyIndex:  72,
294                                         Change:    false,
295                                 },
296                         },
297                         input: []*account.UTXO{
298                                 &account.UTXO{
299                                         ControlProgram: []byte{0x00, 0x14, 0x62, 0x50, 0x18, 0xb6, 0x85, 0x77, 0xba, 0x9b, 0x26, 0x19, 0xc8, 0x1d, 0x2e, 0x96, 0xba, 0x22, 0xbe, 0x77, 0x77, 0xd7},
300                                         AssetID:        bc.AssetID{V0: 1},
301                                         Amount:         3,
302                                 },
303                                 &account.UTXO{
304                                         ControlProgram: []byte{0x00, 0x14, 0x62, 0x50, 0x18, 0xb6, 0x85, 0x77, 0xba, 0x9b, 0x26, 0x19, 0xc8, 0x1d, 0x2e, 0x96, 0xba, 0x22, 0xbe, 0x77, 0x77, 0xd7},
305                                         AssetID:        bc.AssetID{V0: 1},
306                                         Amount:         5,
307                                 },
308                                 &account.UTXO{
309                                         ControlProgram: []byte{0x00, 0x14, 0xc6, 0xbf, 0x22, 0x19, 0x64, 0x2a, 0xc5, 0x9e, 0x5b, 0xe4, 0xeb, 0xdf, 0x5b, 0x22, 0x49, 0x56, 0xa7, 0x98, 0xa4, 0xdf},
310                                         AssetID:        bc.AssetID{V0: 1},
311                                         Amount:         7,
312                                 },
313                         },
314                         wantUtxos: []*account.UTXO{
315                                 &account.UTXO{
316                                         ControlProgram:      []byte{0x00, 0x14, 0x62, 0x50, 0x18, 0xb6, 0x85, 0x77, 0xba, 0x9b, 0x26, 0x19, 0xc8, 0x1d, 0x2e, 0x96, 0xba, 0x22, 0xbe, 0x77, 0x77, 0xd7},
317                                         AssetID:             bc.AssetID{V0: 1},
318                                         Amount:              3,
319                                         AccountID:           "testAccount",
320                                         Address:             "testAddress",
321                                         ControlProgramIndex: 53,
322                                         Change:              true,
323                                 },
324                                 &account.UTXO{
325                                         ControlProgram:      []byte{0x00, 0x14, 0x62, 0x50, 0x18, 0xb6, 0x85, 0x77, 0xba, 0x9b, 0x26, 0x19, 0xc8, 0x1d, 0x2e, 0x96, 0xba, 0x22, 0xbe, 0x77, 0x77, 0xd7},
326                                         AssetID:             bc.AssetID{V0: 1},
327                                         Amount:              5,
328                                         AccountID:           "testAccount",
329                                         Address:             "testAddress",
330                                         ControlProgramIndex: 53,
331                                         Change:              true,
332                                 },
333                                 &account.UTXO{
334                                         ControlProgram:      []byte{0x00, 0x14, 0xc6, 0xbf, 0x22, 0x19, 0x64, 0x2a, 0xc5, 0x9e, 0x5b, 0xe4, 0xeb, 0xdf, 0x5b, 0x22, 0x49, 0x56, 0xa7, 0x98, 0xa4, 0xdf},
335                                         AssetID:             bc.AssetID{V0: 1},
336                                         Amount:              7,
337                                         AccountID:           "testAccount2",
338                                         Address:             "testAddress2",
339                                         ControlProgramIndex: 72,
340                                         Change:              false,
341                                 },
342                         },
343                 },
344         }
345
346         w := &Wallet{DB: testDB}
347         for i, c := range cases {
348                 for s, p := range c.dbPrograms {
349                         data, err := json.Marshal(p)
350                         if err != nil {
351                                 t.Error(err)
352                         }
353                         key, err := hex.DecodeString(s)
354                         if err != nil {
355                                 t.Error(err)
356                         }
357                         testDB.Set(key, data)
358                 }
359
360                 gotUtxos := w.filterAccountUtxo(c.input)
361                 sort.Slice(gotUtxos[:], func(i, j int) bool {
362                         return gotUtxos[i].Amount < gotUtxos[j].Amount
363                 })
364
365                 if !testutil.DeepEqual(gotUtxos, c.wantUtxos) {
366                         t.Errorf("case %d: got %v want %v", i, gotUtxos, c.wantUtxos)
367                 }
368                 for s := range c.dbPrograms {
369                         key, err := hex.DecodeString(s)
370                         if err != nil {
371                                 t.Error(err)
372                         }
373                         testDB.Delete(key)
374                 }
375         }
376 }
377
378 func TestTxInToUtxos(t *testing.T) {
379         cases := []struct {
380                 tx         *types.Tx
381                 statusFail bool
382                 wantUtxos  []*account.UTXO
383         }{
384                 {
385                         tx: types.NewTx(types.TxData{
386                                 Inputs: []*types.TxInput{
387                                         types.NewCoinbaseInput([]byte{0x51}),
388                                 },
389                                 Outputs: []*types.TxOutput{
390                                         types.NewIntraChainOutput(*consensus.BTMAssetID, 41250000000, []byte{0x51}),
391                                 },
392                         }),
393                         statusFail: false,
394                         wantUtxos:  []*account.UTXO{},
395                 },
396                 {
397                         tx: types.NewTx(types.TxData{
398                                 Inputs: []*types.TxInput{
399                                         types.NewSpendInput([][]byte{}, bc.Hash{V0: 1}, bc.AssetID{V0: 1}, 1, 1, []byte{0x51}),
400                                         types.NewSpendInput([][]byte{}, bc.Hash{V0: 2}, bc.AssetID{V0: 1}, 3, 2, []byte{0x52}),
401                                         types.NewSpendInput([][]byte{}, bc.Hash{V0: 3}, *consensus.BTMAssetID, 5, 3, []byte{0x53}),
402                                         types.NewSpendInput([][]byte{}, bc.Hash{V0: 4}, *consensus.BTMAssetID, 7, 4, []byte{0x54}),
403                                 },
404                                 Outputs: []*types.TxOutput{
405                                         types.NewIntraChainOutput(bc.AssetID{V0: 1}, 4, []byte{0x51}),
406                                         types.NewIntraChainOutput(*consensus.BTMAssetID, 12, []byte{0x53}),
407                                 },
408                         }),
409                         statusFail: false,
410                         wantUtxos: []*account.UTXO{
411                                 &account.UTXO{
412                                         OutputID:       bc.NewHash([32]byte{0x62, 0xf2, 0xc4, 0xa0, 0x9b, 0x47, 0xd1, 0x53, 0x58, 0xe7, 0x8c, 0x49, 0x36, 0x75, 0x02, 0xc1, 0x63, 0x46, 0x51, 0xc4, 0x0f, 0xef, 0x63, 0xe2, 0x7d, 0xe4, 0x3c, 0xb3, 0x2c, 0xfe, 0x97, 0xa2}),
413                                         AssetID:        bc.AssetID{V0: 1},
414                                         Amount:         1,
415                                         ControlProgram: []byte{0x51},
416                                         SourceID:       bc.Hash{V0: 1},
417                                         SourcePos:      1,
418                                 },
419                                 &account.UTXO{
420                                         OutputID:       bc.NewHash([32]byte{0x99, 0x30, 0x35, 0x15, 0x9b, 0x0b, 0xcc, 0xdf, 0xbd, 0x15, 0x49, 0xb5, 0x2b, 0x4c, 0xc8, 0x71, 0x20, 0xe7, 0x2f, 0x77, 0x87, 0xcd, 0x88, 0x92, 0xba, 0xd8, 0x97, 0xfa, 0x4a, 0x2a, 0x1a, 0x10}),
421                                         AssetID:        bc.AssetID{V0: 1},
422                                         Amount:         3,
423                                         ControlProgram: []byte{0x52},
424                                         SourceID:       bc.Hash{V0: 2},
425                                         SourcePos:      2,
426                                 },
427                                 &account.UTXO{
428                                         OutputID:       bc.NewHash([32]byte{0xe5, 0x21, 0x0a, 0x9f, 0x17, 0xa2, 0x3a, 0xcf, 0x47, 0x57, 0xf2, 0x16, 0x12, 0x9d, 0xd8, 0xea, 0x7a, 0x9f, 0x5a, 0x14, 0xa8, 0xd6, 0x32, 0x6f, 0xe8, 0xa8, 0x8e, 0xb7, 0xf4, 0xb4, 0xfb, 0xbd}),
429                                         AssetID:        *consensus.BTMAssetID,
430                                         Amount:         5,
431                                         ControlProgram: []byte{0x53},
432                                         SourceID:       bc.Hash{V0: 3},
433                                         SourcePos:      3,
434                                 },
435                                 &account.UTXO{
436                                         OutputID:       bc.NewHash([32]byte{0x57, 0x65, 0x8d, 0x41, 0xed, 0xb7, 0x49, 0xd5, 0x1c, 0xf5, 0x95, 0x93, 0x16, 0x57, 0xf8, 0x66, 0x54, 0x1b, 0xb3, 0x45, 0x84, 0x19, 0x73, 0x2f, 0xb3, 0x3e, 0x44, 0x7c, 0x97, 0x33, 0x77, 0x12}),
437                                         AssetID:        *consensus.BTMAssetID,
438                                         Amount:         7,
439                                         ControlProgram: []byte{0x54},
440                                         SourceID:       bc.Hash{V0: 4},
441                                         SourcePos:      4,
442                                 },
443                         },
444                 },
445                 {
446                         tx: types.NewTx(types.TxData{
447                                 Inputs: []*types.TxInput{
448                                         types.NewSpendInput([][]byte{}, bc.Hash{V0: 1}, bc.AssetID{V0: 1}, 1, 1, []byte{0x51}),
449                                         types.NewSpendInput([][]byte{}, bc.Hash{V0: 2}, bc.AssetID{V0: 1}, 3, 2, []byte{0x52}),
450                                         types.NewSpendInput([][]byte{}, bc.Hash{V0: 3}, *consensus.BTMAssetID, 5, 3, []byte{0x53}),
451                                         types.NewSpendInput([][]byte{}, bc.Hash{V0: 4}, *consensus.BTMAssetID, 7, 4, []byte{0x54}),
452                                 },
453                                 Outputs: []*types.TxOutput{
454                                         types.NewIntraChainOutput(bc.AssetID{V0: 1}, 4, []byte{0x51}),
455                                         types.NewIntraChainOutput(*consensus.BTMAssetID, 12, []byte{0x53}),
456                                 },
457                         }),
458                         statusFail: true,
459                         wantUtxos: []*account.UTXO{
460                                 &account.UTXO{
461                                         OutputID:       bc.NewHash([32]byte{0xe5, 0x21, 0x0a, 0x9f, 0x17, 0xa2, 0x3a, 0xcf, 0x47, 0x57, 0xf2, 0x16, 0x12, 0x9d, 0xd8, 0xea, 0x7a, 0x9f, 0x5a, 0x14, 0xa8, 0xd6, 0x32, 0x6f, 0xe8, 0xa8, 0x8e, 0xb7, 0xf4, 0xb4, 0xfb, 0xbd}),
462                                         AssetID:        *consensus.BTMAssetID,
463                                         Amount:         5,
464                                         ControlProgram: []byte{0x53},
465                                         SourceID:       bc.Hash{V0: 3},
466                                         SourcePos:      3,
467                                 },
468                                 &account.UTXO{
469                                         OutputID:       bc.NewHash([32]byte{0x57, 0x65, 0x8d, 0x41, 0xed, 0xb7, 0x49, 0xd5, 0x1c, 0xf5, 0x95, 0x93, 0x16, 0x57, 0xf8, 0x66, 0x54, 0x1b, 0xb3, 0x45, 0x84, 0x19, 0x73, 0x2f, 0xb3, 0x3e, 0x44, 0x7c, 0x97, 0x33, 0x77, 0x12}),
470                                         AssetID:        *consensus.BTMAssetID,
471                                         Amount:         7,
472                                         ControlProgram: []byte{0x54},
473                                         SourceID:       bc.Hash{V0: 4},
474                                         SourcePos:      4,
475                                 },
476                         },
477                 },
478         }
479
480         for i, c := range cases {
481                 if gotUtxos := txInToUtxos(c.tx, c.statusFail); !testutil.DeepEqual(gotUtxos, c.wantUtxos) {
482                         for k, v := range gotUtxos {
483                                 data, _ := json.Marshal(v)
484                                 fmt.Println(k, string(data))
485                         }
486                         for k, v := range c.wantUtxos {
487                                 data, _ := json.Marshal(v)
488                                 fmt.Println(k, string(data))
489                         }
490                         t.Errorf("case %d: got %v want %v", i, gotUtxos, c.wantUtxos)
491                 }
492         }
493 }
494
495 func TestTxOutToUtxos(t *testing.T) {
496         cases := []struct {
497                 tx          *types.Tx
498                 statusFail  bool
499                 vaildHeight uint64
500                 wantUtxos   []*account.UTXO
501         }{
502                 {
503                         tx: types.NewTx(types.TxData{
504                                 Inputs: []*types.TxInput{
505                                         types.NewCoinbaseInput([]byte{0x51}),
506                                 },
507                                 Outputs: []*types.TxOutput{
508                                         types.NewIntraChainOutput(*consensus.BTMAssetID, 41250000000, []byte{0x51}),
509                                 },
510                         }),
511                         statusFail:  false,
512                         vaildHeight: 98,
513                         wantUtxos: []*account.UTXO{
514                                 &account.UTXO{
515                                         OutputID:       bc.Hash{V0: 1728735075694344097, V1: 884766857607786922, V2: 12293210594955921685, V3: 11109045974561998790},
516                                         AssetID:        *consensus.BTMAssetID,
517                                         Amount:         41250000000,
518                                         ControlProgram: []byte{0x51},
519                                         SourceID:       bc.NewHash([32]byte{0xb4, 0x7e, 0x94, 0x31, 0x88, 0xfe, 0xd3, 0xe9, 0xac, 0x99, 0x7c, 0xfc, 0x99, 0x6d, 0xd7, 0x4d, 0x04, 0x10, 0x77, 0xcb, 0x1c, 0xf8, 0x95, 0x14, 0x00, 0xe3, 0x42, 0x00, 0x8d, 0x05, 0xec, 0xdc}),
520                                         SourcePos:      0,
521                                         ValidHeight:    98,
522                                 },
523                         },
524                 },
525                 {
526                         tx: types.NewTx(types.TxData{
527                                 Inputs: []*types.TxInput{
528                                         types.NewSpendInput([][]byte{}, bc.Hash{V0: 1}, bc.AssetID{V0: 1}, 5, 1, []byte{0x51}),
529                                         types.NewSpendInput([][]byte{}, bc.Hash{V0: 2}, *consensus.BTMAssetID, 7, 1, []byte{0x51}),
530                                 },
531                                 Outputs: []*types.TxOutput{
532                                         types.NewIntraChainOutput(bc.AssetID{V0: 1}, 2, []byte{0x51}),
533                                         types.NewIntraChainOutput(bc.AssetID{V0: 1}, 3, []byte{0x52}),
534                                         types.NewIntraChainOutput(*consensus.BTMAssetID, 2, []byte{0x53}),
535                                         types.NewIntraChainOutput(*consensus.BTMAssetID, 5, []byte{0x54}),
536                                 },
537                         }),
538                         statusFail:  false,
539                         vaildHeight: 0,
540                         wantUtxos: []*account.UTXO{
541                                 &account.UTXO{
542                                         OutputID:       bc.Hash{V0: 8675398163687045889, V1: 7549510466747714094, V2: 13693077838209211470, V3: 6878568403630757599},
543                                         AssetID:        bc.AssetID{V0: 1},
544                                         Amount:         2,
545                                         ControlProgram: []byte{0x51},
546                                         SourceID:       bc.Hash{V0: 968805671293010031, V1: 9297014342000792994, V2: 16963674611624423333, V3: 2728293460397542670},
547                                         SourcePos:      0,
548                                 },
549                                 &account.UTXO{
550                                         OutputID:       bc.Hash{V0: 10393356437681643401, V1: 233963481123580514, V2: 17312171816916184445, V3: 16199332547392196559},
551                                         AssetID:        bc.AssetID{V0: 1},
552                                         Amount:         3,
553                                         ControlProgram: []byte{0x52},
554                                         SourceID:       bc.Hash{V0: 968805671293010031, V1: 9297014342000792994, V2: 16963674611624423333, V3: 2728293460397542670},
555                                         SourcePos:      1,
556                                 },
557                                 &account.UTXO{
558                                         OutputID:       bc.Hash{V0: 7067560744282869147, V1: 8991714784298240423, V2: 2595857933262917893, V3: 11490631006811252506},
559                                         AssetID:        *consensus.BTMAssetID,
560                                         Amount:         2,
561                                         ControlProgram: []byte{0x53},
562                                         SourceID:       bc.Hash{V0: 968805671293010031, V1: 9297014342000792994, V2: 16963674611624423333, V3: 2728293460397542670},
563                                         SourcePos:      2,
564                                 },
565                                 &account.UTXO{
566                                         OutputID:       bc.Hash{V0: 15425148469684856658, V1: 11568657474526458285, V2: 11930588814405533063, V3: 5058456773104068022},
567                                         AssetID:        *consensus.BTMAssetID,
568                                         Amount:         5,
569                                         ControlProgram: []byte{0x54},
570                                         SourceID:       bc.Hash{V0: 968805671293010031, V1: 9297014342000792994, V2: 16963674611624423333, V3: 2728293460397542670},
571                                         SourcePos:      3,
572                                 },
573                         },
574                 },
575                 {
576                         tx: types.NewTx(types.TxData{
577                                 Inputs: []*types.TxInput{
578                                         types.NewSpendInput([][]byte{}, bc.Hash{V0: 1}, bc.AssetID{V0: 1}, 5, 1, []byte{0x51}),
579                                         types.NewSpendInput([][]byte{}, bc.Hash{V0: 2}, *consensus.BTMAssetID, 7, 1, []byte{0x51}),
580                                 },
581                                 Outputs: []*types.TxOutput{
582                                         types.NewIntraChainOutput(bc.AssetID{V0: 1}, 2, []byte{0x51}),
583                                         types.NewIntraChainOutput(bc.AssetID{V0: 1}, 3, []byte{0x52}),
584                                         types.NewIntraChainOutput(*consensus.BTMAssetID, 2, []byte{0x53}),
585                                         types.NewIntraChainOutput(*consensus.BTMAssetID, 5, []byte{0x54}),
586                                 },
587                         }),
588                         statusFail:  true,
589                         vaildHeight: 0,
590                         wantUtxos: []*account.UTXO{
591                                 &account.UTXO{
592                                         OutputID:       bc.Hash{V0: 7067560744282869147, V1: 8991714784298240423, V2: 2595857933262917893, V3: 11490631006811252506},
593                                         AssetID:        *consensus.BTMAssetID,
594                                         Amount:         2,
595                                         ControlProgram: []byte{0x53},
596                                         SourceID:       bc.Hash{V0: 968805671293010031, V1: 9297014342000792994, V2: 16963674611624423333, V3: 2728293460397542670},
597                                         SourcePos:      2,
598                                 },
599                                 &account.UTXO{
600                                         OutputID:       bc.Hash{V0: 15425148469684856658, V1: 11568657474526458285, V2: 11930588814405533063, V3: 5058456773104068022},
601                                         AssetID:        *consensus.BTMAssetID,
602                                         Amount:         5,
603                                         ControlProgram: []byte{0x54},
604                                         SourceID:       bc.Hash{V0: 968805671293010031, V1: 9297014342000792994, V2: 16963674611624423333, V3: 2728293460397542670},
605                                         SourcePos:      3,
606                                 },
607                         },
608                 },
609         }
610
611         for i, c := range cases {
612                 if gotUtxos := txOutToUtxos(c.tx, c.statusFail, c.vaildHeight); !testutil.DeepEqual(gotUtxos, c.wantUtxos) {
613                         t.Errorf("case %d: got %v want %v", i, gotUtxos, c.wantUtxos)
614
615                         for j, u := range gotUtxos {
616                                 t.Errorf("case %d: gotUtxos[%d] %v", i, j, u)
617                         }
618
619                         for j, u := range c.wantUtxos {
620                                 t.Errorf("case %d: c.wantUtxos[%d] %v", i, j, u)
621                         }
622                 }
623         }
624 }