OSDN Git Service

1ca6a625510f05db57200850e4e9ae1519aaa06a
[bytom/vapor.git] / account / builder_test.go
1 package account
2
3 import (
4         "testing"
5         "time"
6
7         "github.com/vapor/blockchain/txbuilder"
8         "github.com/vapor/consensus"
9         "github.com/vapor/protocol/bc"
10         "github.com/vapor/testutil"
11 )
12
13 func TestMergeSpendAction(t *testing.T) {
14         testBTM := &bc.AssetID{}
15         if err := testBTM.UnmarshalText([]byte("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")); err != nil {
16                 t.Fatal(err)
17         }
18
19         testAssetID1 := &bc.AssetID{}
20         if err := testAssetID1.UnmarshalText([]byte("50ec80b6bc48073f6aa8fa045131a71213c33f3681203b15ddc2e4b81f1f4730")); err != nil {
21                 t.Fatal(err)
22         }
23
24         testAssetID2 := &bc.AssetID{}
25         if err := testAssetID2.UnmarshalText([]byte("43c6946d092b2959c1a82e90b282c68fca63e66de289048f6acd6cea9383c79c")); err != nil {
26                 t.Fatal(err)
27         }
28
29         cases := []struct {
30                 testActions     []txbuilder.Action
31                 wantActions     []txbuilder.Action
32                 testActionCount int
33                 wantActionCount int
34         }{
35                 {
36                         testActions: []txbuilder.Action{
37                                 txbuilder.Action(&spendAction{
38                                         AssetAmount: bc.AssetAmount{
39                                                 AssetId: testBTM,
40                                                 Amount:  100,
41                                         },
42                                         AccountID: "test_account",
43                                 }),
44                                 txbuilder.Action(&spendAction{
45                                         AssetAmount: bc.AssetAmount{
46                                                 AssetId: testBTM,
47                                                 Amount:  200,
48                                         },
49                                         AccountID: "test_account",
50                                 }),
51                                 txbuilder.Action(&spendAction{
52                                         AssetAmount: bc.AssetAmount{
53                                                 AssetId: testBTM,
54                                                 Amount:  300,
55                                         },
56                                         AccountID: "test_account",
57                                 }),
58                                 txbuilder.Action(&spendAction{
59                                         AssetAmount: bc.AssetAmount{
60                                                 AssetId: testAssetID1,
61                                                 Amount:  300,
62                                         },
63                                         AccountID: "test_account",
64                                 }),
65                         },
66                         wantActions: []txbuilder.Action{
67                                 txbuilder.Action(&spendAction{
68                                         AssetAmount: bc.AssetAmount{
69                                                 AssetId: testBTM,
70                                                 Amount:  600,
71                                         },
72                                         AccountID: "test_account",
73                                 }),
74                                 txbuilder.Action(&spendAction{
75                                         AssetAmount: bc.AssetAmount{
76                                                 AssetId: testAssetID1,
77                                                 Amount:  300,
78                                         },
79                                         AccountID: "test_account",
80                                 }),
81                         },
82                         testActionCount: 4,
83                         wantActionCount: 2,
84                 },
85                 {
86                         testActions: []txbuilder.Action{
87                                 txbuilder.Action(&spendAction{
88                                         AssetAmount: bc.AssetAmount{
89                                                 AssetId: testBTM,
90                                                 Amount:  100,
91                                         },
92                                         AccountID: "test_account",
93                                 }),
94                                 txbuilder.Action(&spendAction{
95                                         AssetAmount: bc.AssetAmount{
96                                                 AssetId: testAssetID1,
97                                                 Amount:  200,
98                                         },
99                                         AccountID: "test_account",
100                                 }),
101                                 txbuilder.Action(&spendAction{
102                                         AssetAmount: bc.AssetAmount{
103                                                 AssetId: testBTM,
104                                                 Amount:  500,
105                                         },
106                                         AccountID: "test_account",
107                                 }),
108                                 txbuilder.Action(&spendAction{
109                                         AssetAmount: bc.AssetAmount{
110                                                 AssetId: testAssetID1,
111                                                 Amount:  300,
112                                         },
113                                         AccountID: "test_account",
114                                 }),
115                         },
116                         wantActions: []txbuilder.Action{
117                                 txbuilder.Action(&spendAction{
118                                         AssetAmount: bc.AssetAmount{
119                                                 AssetId: testBTM,
120                                                 Amount:  600,
121                                         },
122                                         AccountID: "test_account",
123                                 }),
124                                 txbuilder.Action(&spendAction{
125                                         AssetAmount: bc.AssetAmount{
126                                                 AssetId: testAssetID1,
127                                                 Amount:  500,
128                                         },
129                                         AccountID: "test_account",
130                                 }),
131                         },
132                         testActionCount: 4,
133                         wantActionCount: 2,
134                 },
135                 {
136                         testActions: []txbuilder.Action{
137                                 txbuilder.Action(&spendAction{
138                                         AssetAmount: bc.AssetAmount{
139                                                 AssetId: testBTM,
140                                                 Amount:  100,
141                                         },
142                                         AccountID: "test_account",
143                                 }),
144                                 txbuilder.Action(&spendAction{
145                                         AssetAmount: bc.AssetAmount{
146                                                 AssetId: testAssetID1,
147                                                 Amount:  200,
148                                         },
149                                         AccountID: "test_account",
150                                 }),
151                                 txbuilder.Action(&spendAction{
152                                         AssetAmount: bc.AssetAmount{
153                                                 AssetId: testAssetID2,
154                                                 Amount:  300,
155                                         },
156                                         AccountID: "test_account",
157                                 }),
158                                 txbuilder.Action(&spendAction{
159                                         AssetAmount: bc.AssetAmount{
160                                                 AssetId: testAssetID1,
161                                                 Amount:  300,
162                                         },
163                                         AccountID: "test_account",
164                                 }),
165                                 txbuilder.Action(&spendAction{
166                                         AssetAmount: bc.AssetAmount{
167                                                 AssetId: testAssetID2,
168                                                 Amount:  500,
169                                         },
170                                         AccountID: "test_account",
171                                 }),
172                         },
173                         wantActions: []txbuilder.Action{
174                                 txbuilder.Action(&spendAction{
175                                         AssetAmount: bc.AssetAmount{
176                                                 AssetId: testBTM,
177                                                 Amount:  100,
178                                         },
179                                         AccountID: "test_account",
180                                 }),
181                                 txbuilder.Action(&spendAction{
182                                         AssetAmount: bc.AssetAmount{
183                                                 AssetId: testAssetID1,
184                                                 Amount:  500,
185                                         },
186                                         AccountID: "test_account",
187                                 }),
188                                 txbuilder.Action(&spendAction{
189                                         AssetAmount: bc.AssetAmount{
190                                                 AssetId: testAssetID2,
191                                                 Amount:  800,
192                                         },
193                                         AccountID: "test_account",
194                                 }),
195                         },
196                         testActionCount: 5,
197                         wantActionCount: 3,
198                 },
199                 {
200                         testActions: []txbuilder.Action{
201                                 txbuilder.Action(&spendAction{
202                                         AssetAmount: bc.AssetAmount{
203                                                 AssetId: testBTM,
204                                                 Amount:  100,
205                                         },
206                                         AccountID: "test_account",
207                                 }),
208                                 txbuilder.Action(&spendAction{
209                                         AssetAmount: bc.AssetAmount{
210                                                 AssetId: testBTM,
211                                                 Amount:  200,
212                                         },
213                                         AccountID: "test_account1",
214                                 }),
215                                 txbuilder.Action(&spendAction{
216                                         AssetAmount: bc.AssetAmount{
217                                                 AssetId: testBTM,
218                                                 Amount:  500,
219                                         },
220                                         AccountID: "test_account",
221                                 }),
222                                 txbuilder.Action(&spendAction{
223                                         AssetAmount: bc.AssetAmount{
224                                                 AssetId: testAssetID1,
225                                                 Amount:  300,
226                                         },
227                                         AccountID: "test_account1",
228                                 }),
229                         },
230                         wantActions: []txbuilder.Action{
231                                 txbuilder.Action(&spendAction{
232                                         AssetAmount: bc.AssetAmount{
233                                                 AssetId: testBTM,
234                                                 Amount:  600,
235                                         },
236                                         AccountID: "test_account",
237                                 }),
238                                 txbuilder.Action(&spendAction{
239                                         AssetAmount: bc.AssetAmount{
240                                                 AssetId: testBTM,
241                                                 Amount:  200,
242                                         },
243                                         AccountID: "test_account1",
244                                 }),
245                                 txbuilder.Action(&spendAction{
246                                         AssetAmount: bc.AssetAmount{
247                                                 AssetId: testAssetID1,
248                                                 Amount:  300,
249                                         },
250                                         AccountID: "test_account1",
251                                 }),
252                         },
253                         testActionCount: 4,
254                         wantActionCount: 3,
255                 },
256                 {
257                         testActions: []txbuilder.Action{
258                                 txbuilder.Action(&spendUTXOAction{
259                                         OutputID: &bc.Hash{V0: 128},
260                                 }),
261                                 txbuilder.Action(&spendAction{
262                                         AssetAmount: bc.AssetAmount{
263                                                 AssetId: testBTM,
264                                                 Amount:  100,
265                                         },
266                                         AccountID: "test_account",
267                                 }),
268                                 txbuilder.Action(&spendAction{
269                                         AssetAmount: bc.AssetAmount{
270                                                 AssetId: testAssetID1,
271                                                 Amount:  200,
272                                         },
273                                         AccountID: "test_account1",
274                                 }),
275                                 txbuilder.Action(&spendUTXOAction{
276                                         OutputID: &bc.Hash{V0: 256},
277                                 }),
278                                 txbuilder.Action(&spendAction{
279                                         AssetAmount: bc.AssetAmount{
280                                                 AssetId: testAssetID2,
281                                                 Amount:  300,
282                                         },
283                                         AccountID: "test_account2",
284                                 }),
285                         },
286                         wantActions: []txbuilder.Action{
287                                 txbuilder.Action(&spendUTXOAction{
288                                         OutputID: &bc.Hash{V0: 128},
289                                 }),
290                                 txbuilder.Action(&spendAction{
291                                         AssetAmount: bc.AssetAmount{
292                                                 AssetId: testBTM,
293                                                 Amount:  100,
294                                         },
295                                         AccountID: "test_account",
296                                 }),
297                                 txbuilder.Action(&spendAction{
298                                         AssetAmount: bc.AssetAmount{
299                                                 AssetId: testAssetID1,
300                                                 Amount:  200,
301                                         },
302                                         AccountID: "test_account1",
303                                 }),
304                                 txbuilder.Action(&spendUTXOAction{
305                                         OutputID: &bc.Hash{V0: 256},
306                                 }),
307                                 txbuilder.Action(&spendAction{
308                                         AssetAmount: bc.AssetAmount{
309                                                 AssetId: testAssetID2,
310                                                 Amount:  300,
311                                         },
312                                         AccountID: "test_account2",
313                                 }),
314                         },
315                         testActionCount: 5,
316                         wantActionCount: 5,
317                 },
318         }
319
320         for _, c := range cases {
321                 gotActions := MergeSpendAction(c.testActions)
322
323                 gotMap := make(map[string]uint64)
324                 wantMap := make(map[string]uint64)
325                 for _, got := range gotActions {
326                         switch got := got.(type) {
327                         case *spendAction:
328                                 gotKey := got.AssetId.String() + got.AccountID
329                                 gotMap[gotKey] = got.Amount
330                         default:
331                                 continue
332                         }
333                 }
334
335                 for _, want := range c.wantActions {
336                         switch want := want.(type) {
337                         case *spendAction:
338                                 wantKey := want.AssetId.String() + want.AccountID
339                                 wantMap[wantKey] = want.Amount
340                         default:
341                                 continue
342                         }
343                 }
344
345                 for key := range gotMap {
346                         if gotMap[key] != wantMap[key] {
347                                 t.Fatalf("gotMap[%s]=%v, wantMap[%s]=%v", key, gotMap[key], key, wantMap[key])
348                         }
349                 }
350
351                 if len(gotActions) != c.wantActionCount {
352                         t.Fatalf("number of gotActions=%d, wantActions=%d", len(gotActions), c.wantActionCount)
353                 }
354         }
355 }
356
357 func TestReserveBtmUtxoChain(t *testing.T) {
358         chainTxUtxoNum = 3
359         chainTxMergeGas = uint64(10000000)
360
361         utxos := []*UTXO{}
362         m := mockAccountManager(t)
363         for i := uint64(1); i <= 20; i++ {
364                 utxo := &UTXO{
365                         OutputID:  bc.Hash{V0: i},
366                         AccountID: "TestAccountID",
367                         AssetID:   *consensus.BTMAssetID,
368                         Amount:    i * chainTxMergeGas,
369                 }
370                 utxos = append(utxos, utxo)
371
372                 m.store.SetStandardUTXO(utxo.OutputID, utxo)
373         }
374
375         cases := []struct {
376                 amount uint64
377                 want   []uint64
378                 err    bool
379         }{
380                 {
381                         amount: 1 * chainTxMergeGas,
382                         want:   []uint64{1},
383                 },
384                 {
385                         amount: 888888 * chainTxMergeGas,
386                         want:   []uint64{},
387                         err:    true,
388                 },
389                 {
390                         amount: 7 * chainTxMergeGas,
391                         want:   []uint64{4, 3, 1},
392                 },
393                 {
394                         amount: 15 * chainTxMergeGas,
395                         want:   []uint64{5, 4, 3, 2, 1, 6},
396                 },
397                 {
398                         amount: 163 * chainTxMergeGas,
399                         want:   []uint64{20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 2, 1, 3},
400                 },
401         }
402
403         for i, c := range cases {
404                 m.utxoKeeper.expireReservation(time.Unix(999999999, 0))
405                 utxos, err := m.reserveBtmUtxoChain(&txbuilder.TemplateBuilder{}, "TestAccountID", c.amount, false)
406
407                 if err != nil != c.err {
408                         t.Fatalf("case %d got err %v want err = %v", i, err, c.err)
409                 }
410
411                 got := []uint64{}
412                 for _, utxo := range utxos {
413                         got = append(got, utxo.Amount/chainTxMergeGas)
414                 }
415
416                 if !testutil.DeepEqual(got, c.want) {
417                         t.Fatalf("case %d got %d want %d", i, got, c.want)
418                 }
419         }
420 }