OSDN Git Service

update
[bytom/vapor.git] / test / builder_test.go
1 package test
2
3 import (
4         "testing"
5
6         acc "github.com/vapor/account"
7 )
8
9 var (
10         //chainTxUtxoNum maximum utxo quantity in a tx
11         chainTxUtxoNum = 5
12         //chainTxMergeGas chain tx gas
13         chainTxMergeGas = uint64(10000000)
14 )
15
16 // func TestReserveBtmUtxoChain(t *testing.T) {
17 //      dirPath, err := ioutil.TempDir(".", "")
18 //      if err != nil {
19 //              t.Fatal(err)
20 //      }
21 //      defer os.RemoveAll(dirPath)
22 //      testDB := dbm.NewDB("testdb", "memdb", dirPath)
23 //      store := database.NewAccountStore(testDB)
24 //      chainTxUtxoNum = 3
25 //      utxos := []*acc.UTXO{}
26 //      m := mockAccountManager(t)
27 //      for i := uint64(1); i <= 20; i++ {
28 //              utxo := &acc.UTXO{
29 //                      OutputID:  bc.Hash{V0: i},
30 //                      AccountID: "TestAccountID",
31 //                      AssetID:   *consensus.BTMAssetID,
32 //                      Amount:    i * chainTxMergeGas,
33 //              }
34 //              utxos = append(utxos, utxo)
35
36 //              data, err := json.Marshal(utxo)
37 //              if err != nil {
38 //                      t.Fatal(err)
39 //              }
40
41 //              store.SetStandardUTXO(utxo.OutputID, data)
42 //      }
43
44 //      cases := []struct {
45 //              amount uint64
46 //              want   []uint64
47 //              err    bool
48 //      }{
49 //              {
50 //                      amount: 1 * chainTxMergeGas,
51 //                      want:   []uint64{1},
52 //              },
53 //              {
54 //                      amount: 888888 * chainTxMergeGas,
55 //                      want:   []uint64{},
56 //                      err:    true,
57 //              },
58 //              {
59 //                      amount: 7 * chainTxMergeGas,
60 //                      want:   []uint64{4, 3, 1},
61 //              },
62 //              {
63 //                      amount: 15 * chainTxMergeGas,
64 //                      want:   []uint64{5, 4, 3, 2, 1, 6},
65 //              },
66 //              {
67 //                      amount: 163 * chainTxMergeGas,
68 //                      want:   []uint64{20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 2, 1, 3},
69 //              },
70 //      }
71
72 //      for i, c := range cases {
73 //              m.Manager.utxoKeeper.expireReservation(time.Unix(999999999, 0))
74 //              utxos, err := m.reserveBtmUtxoChain(&txbuilder.TemplateBuilder{}, "TestAccountID", c.amount, false)
75
76 //              if err != nil != c.err {
77 //                      t.Fatalf("case %d got err %v want err = %v", i, err, c.err)
78 //              }
79
80 //              got := []uint64{}
81 //              for _, utxo := range utxos {
82 //                      got = append(got, utxo.Amount/chainTxMergeGas)
83 //              }
84
85 //              if !testutil.DeepEqual(got, c.want) {
86 //                      t.Fatalf("case %d got %d want %d", i, got, c.want)
87 //              }
88 //      }
89 // }
90
91 // func TestBuildBtmTxChain(t *testing.T) {
92 //      chainTxUtxoNum = 3
93 //      m := mockAccountManager(t)
94 //      cases := []struct {
95 //              inputUtxo  []uint64
96 //              wantInput  [][]uint64
97 //              wantOutput [][]uint64
98 //              wantUtxo   uint64
99 //      }{
100 //              {
101 //                      inputUtxo:  []uint64{5},
102 //                      wantInput:  [][]uint64{},
103 //                      wantOutput: [][]uint64{},
104 //                      wantUtxo:   5 * chainTxMergeGas,
105 //              },
106 //              {
107 //                      inputUtxo: []uint64{5, 4},
108 //                      wantInput: [][]uint64{
109 //                              []uint64{5, 4},
110 //                      },
111 //                      wantOutput: [][]uint64{
112 //                              []uint64{8},
113 //                      },
114 //                      wantUtxo: 8 * chainTxMergeGas,
115 //              },
116 //              {
117 //                      inputUtxo: []uint64{5, 4, 1, 1},
118 //                      wantInput: [][]uint64{
119 //                              []uint64{5, 4, 1},
120 //                              []uint64{1, 9},
121 //                      },
122 //                      wantOutput: [][]uint64{
123 //                              []uint64{9},
124 //                              []uint64{9},
125 //                      },
126 //                      wantUtxo: 9 * chainTxMergeGas,
127 //              },
128 //              {
129 //                      inputUtxo: []uint64{22, 123, 53, 234, 23, 4, 2423, 24, 23, 43, 34, 234, 234, 24},
130 //                      wantInput: [][]uint64{
131 //                              []uint64{22, 123, 53},
132 //                              []uint64{234, 23, 4},
133 //                              []uint64{2423, 24, 23},
134 //                              []uint64{43, 34, 234},
135 //                              []uint64{234, 24, 197},
136 //                              []uint64{260, 2469, 310},
137 //                              []uint64{454, 3038},
138 //                      },
139 //                      wantOutput: [][]uint64{
140 //                              []uint64{197},
141 //                              []uint64{260},
142 //                              []uint64{2469},
143 //                              []uint64{310},
144 //                              []uint64{454},
145 //                              []uint64{3038},
146 //                              []uint64{3491},
147 //                      },
148 //                      wantUtxo: 3491 * chainTxMergeGas,
149 //              },
150 //      }
151
152 //      acct, err := m.Manager.Create([]chainkd.XPub{testutil.TestXPub}, 1, "testAccount", signers.BIP0044)
153 //      if err != nil {
154 //              t.Fatal(err)
155 //      }
156
157 //      acp, err := m.Manager.CreateAddress(acct.ID, false)
158 //      if err != nil {
159 //              t.Fatal(err)
160 //      }
161
162 //      for caseIndex, c := range cases {
163 //              utxos := []*acc.UTXO{}
164 //              for _, amount := range c.inputUtxo {
165 //                      utxos = append(utxos, &acc.UTXO{
166 //                              Amount:         amount * chainTxMergeGas,
167 //                              AssetID:        *consensus.BTMAssetID,
168 //                              Address:        acp.Address,
169 //                              ControlProgram: acp.ControlProgram,
170 //                      })
171 //              }
172
173 //              tpls, gotUtxo, err := m.Manager.buildBtmTxChain(utxos, acct.Signer)
174 //              if err != nil {
175 //                      t.Fatal(err)
176 //              }
177
178 //              for i, tpl := range tpls {
179 //                      gotInput := []uint64{}
180 //                      for _, input := range tpl.Transaction.Inputs {
181 //                              gotInput = append(gotInput, input.Amount()/chainTxMergeGas)
182 //                      }
183
184 //                      gotOutput := []uint64{}
185 //                      for _, output := range tpl.Transaction.Outputs {
186 //                              gotOutput = append(gotOutput, output.AssetAmount().Amount/chainTxMergeGas)
187 //                      }
188
189 //                      if !testutil.DeepEqual(c.wantInput[i], gotInput) {
190 //                              t.Fatalf("case %d tx %d input got %d want %d", caseIndex, i, gotInput, c.wantInput[i])
191 //                      }
192 //                      if !testutil.DeepEqual(c.wantOutput[i], gotOutput) {
193 //                              t.Fatalf("case %d tx %d output got %d want %d", caseIndex, i, gotOutput, c.wantOutput[i])
194 //                      }
195 //              }
196
197 //              if c.wantUtxo != gotUtxo.Amount {
198 //                      t.Fatalf("case %d got utxo=%d want utxo=%d", caseIndex, gotUtxo.Amount, c.wantUtxo)
199 //              }
200 //      }
201 // }
202
203 // func TestMergeSpendAction(t *testing.T) {
204 //      testBTM := &bc.AssetID{}
205 //      if err := testBTM.UnmarshalText([]byte("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")); err != nil {
206 //              t.Fatal(err)
207 //      }
208
209 //      testAssetID1 := &bc.AssetID{}
210 //      if err := testAssetID1.UnmarshalText([]byte("50ec80b6bc48073f6aa8fa045131a71213c33f3681203b15ddc2e4b81f1f4730")); err != nil {
211 //              t.Fatal(err)
212 //      }
213
214 //      testAssetID2 := &bc.AssetID{}
215 //      if err := testAssetID2.UnmarshalText([]byte("43c6946d092b2959c1a82e90b282c68fca63e66de289048f6acd6cea9383c79c")); err != nil {
216 //              t.Fatal(err)
217 //      }
218
219 //      cases := []struct {
220 //              testActions     []txbuilder.Action
221 //              wantActions     []txbuilder.Action
222 //              testActionCount int
223 //              wantActionCount int
224 //      }{
225 //              {
226 //                      testActions: []txbuilder.Action{
227 //                              txbuilder.Action(&spendAction{
228 //                                      AssetAmount: bc.AssetAmount{
229 //                                              AssetId: testBTM,
230 //                                              Amount:  100,
231 //                                      },
232 //                                      AccountID: "test_account",
233 //                              }),
234 //                              txbuilder.Action(&spendAction{
235 //                                      AssetAmount: bc.AssetAmount{
236 //                                              AssetId: testBTM,
237 //                                              Amount:  200,
238 //                                      },
239 //                                      AccountID: "test_account",
240 //                              }),
241 //                              txbuilder.Action(&spendAction{
242 //                                      AssetAmount: bc.AssetAmount{
243 //                                              AssetId: testBTM,
244 //                                              Amount:  300,
245 //                                      },
246 //                                      AccountID: "test_account",
247 //                              }),
248 //                              txbuilder.Action(&spendAction{
249 //                                      AssetAmount: bc.AssetAmount{
250 //                                              AssetId: testAssetID1,
251 //                                              Amount:  300,
252 //                                      },
253 //                                      AccountID: "test_account",
254 //                              }),
255 //                      },
256 //                      wantActions: []txbuilder.Action{
257 //                              txbuilder.Action(&spendAction{
258 //                                      AssetAmount: bc.AssetAmount{
259 //                                              AssetId: testBTM,
260 //                                              Amount:  600,
261 //                                      },
262 //                                      AccountID: "test_account",
263 //                              }),
264 //                              txbuilder.Action(&spendAction{
265 //                                      AssetAmount: bc.AssetAmount{
266 //                                              AssetId: testAssetID1,
267 //                                              Amount:  300,
268 //                                      },
269 //                                      AccountID: "test_account",
270 //                              }),
271 //                      },
272 //                      testActionCount: 4,
273 //                      wantActionCount: 2,
274 //              },
275 //              {
276 //                      testActions: []txbuilder.Action{
277 //                              txbuilder.Action(&spendAction{
278 //                                      AssetAmount: bc.AssetAmount{
279 //                                              AssetId: testBTM,
280 //                                              Amount:  100,
281 //                                      },
282 //                                      AccountID: "test_account",
283 //                              }),
284 //                              txbuilder.Action(&spendAction{
285 //                                      AssetAmount: bc.AssetAmount{
286 //                                              AssetId: testAssetID1,
287 //                                              Amount:  200,
288 //                                      },
289 //                                      AccountID: "test_account",
290 //                              }),
291 //                              txbuilder.Action(&spendAction{
292 //                                      AssetAmount: bc.AssetAmount{
293 //                                              AssetId: testBTM,
294 //                                              Amount:  500,
295 //                                      },
296 //                                      AccountID: "test_account",
297 //                              }),
298 //                              txbuilder.Action(&spendAction{
299 //                                      AssetAmount: bc.AssetAmount{
300 //                                              AssetId: testAssetID1,
301 //                                              Amount:  300,
302 //                                      },
303 //                                      AccountID: "test_account",
304 //                              }),
305 //                      },
306 //                      wantActions: []txbuilder.Action{
307 //                              txbuilder.Action(&spendAction{
308 //                                      AssetAmount: bc.AssetAmount{
309 //                                              AssetId: testBTM,
310 //                                              Amount:  600,
311 //                                      },
312 //                                      AccountID: "test_account",
313 //                              }),
314 //                              txbuilder.Action(&spendAction{
315 //                                      AssetAmount: bc.AssetAmount{
316 //                                              AssetId: testAssetID1,
317 //                                              Amount:  500,
318 //                                      },
319 //                                      AccountID: "test_account",
320 //                              }),
321 //                      },
322 //                      testActionCount: 4,
323 //                      wantActionCount: 2,
324 //              },
325 //              {
326 //                      testActions: []txbuilder.Action{
327 //                              txbuilder.Action(&spendAction{
328 //                                      AssetAmount: bc.AssetAmount{
329 //                                              AssetId: testBTM,
330 //                                              Amount:  100,
331 //                                      },
332 //                                      AccountID: "test_account",
333 //                              }),
334 //                              txbuilder.Action(&spendAction{
335 //                                      AssetAmount: bc.AssetAmount{
336 //                                              AssetId: testAssetID1,
337 //                                              Amount:  200,
338 //                                      },
339 //                                      AccountID: "test_account",
340 //                              }),
341 //                              txbuilder.Action(&spendAction{
342 //                                      AssetAmount: bc.AssetAmount{
343 //                                              AssetId: testAssetID2,
344 //                                              Amount:  300,
345 //                                      },
346 //                                      AccountID: "test_account",
347 //                              }),
348 //                              txbuilder.Action(&spendAction{
349 //                                      AssetAmount: bc.AssetAmount{
350 //                                              AssetId: testAssetID1,
351 //                                              Amount:  300,
352 //                                      },
353 //                                      AccountID: "test_account",
354 //                              }),
355 //                              txbuilder.Action(&spendAction{
356 //                                      AssetAmount: bc.AssetAmount{
357 //                                              AssetId: testAssetID2,
358 //                                              Amount:  500,
359 //                                      },
360 //                                      AccountID: "test_account",
361 //                              }),
362 //                      },
363 //                      wantActions: []txbuilder.Action{
364 //                              txbuilder.Action(&spendAction{
365 //                                      AssetAmount: bc.AssetAmount{
366 //                                              AssetId: testBTM,
367 //                                              Amount:  100,
368 //                                      },
369 //                                      AccountID: "test_account",
370 //                              }),
371 //                              txbuilder.Action(&spendAction{
372 //                                      AssetAmount: bc.AssetAmount{
373 //                                              AssetId: testAssetID1,
374 //                                              Amount:  500,
375 //                                      },
376 //                                      AccountID: "test_account",
377 //                              }),
378 //                              txbuilder.Action(&spendAction{
379 //                                      AssetAmount: bc.AssetAmount{
380 //                                              AssetId: testAssetID2,
381 //                                              Amount:  800,
382 //                                      },
383 //                                      AccountID: "test_account",
384 //                              }),
385 //                      },
386 //                      testActionCount: 5,
387 //                      wantActionCount: 3,
388 //              },
389 //              {
390 //                      testActions: []txbuilder.Action{
391 //                              txbuilder.Action(&spendAction{
392 //                                      AssetAmount: bc.AssetAmount{
393 //                                              AssetId: testBTM,
394 //                                              Amount:  100,
395 //                                      },
396 //                                      AccountID: "test_account",
397 //                              }),
398 //                              txbuilder.Action(&spendAction{
399 //                                      AssetAmount: bc.AssetAmount{
400 //                                              AssetId: testBTM,
401 //                                              Amount:  200,
402 //                                      },
403 //                                      AccountID: "test_account1",
404 //                              }),
405 //                              txbuilder.Action(&spendAction{
406 //                                      AssetAmount: bc.AssetAmount{
407 //                                              AssetId: testBTM,
408 //                                              Amount:  500,
409 //                                      },
410 //                                      AccountID: "test_account",
411 //                              }),
412 //                              txbuilder.Action(&spendAction{
413 //                                      AssetAmount: bc.AssetAmount{
414 //                                              AssetId: testAssetID1,
415 //                                              Amount:  300,
416 //                                      },
417 //                                      AccountID: "test_account1",
418 //                              }),
419 //                      },
420 //                      wantActions: []txbuilder.Action{
421 //                              txbuilder.Action(&spendAction{
422 //                                      AssetAmount: bc.AssetAmount{
423 //                                              AssetId: testBTM,
424 //                                              Amount:  600,
425 //                                      },
426 //                                      AccountID: "test_account",
427 //                              }),
428 //                              txbuilder.Action(&spendAction{
429 //                                      AssetAmount: bc.AssetAmount{
430 //                                              AssetId: testBTM,
431 //                                              Amount:  200,
432 //                                      },
433 //                                      AccountID: "test_account1",
434 //                              }),
435 //                              txbuilder.Action(&spendAction{
436 //                                      AssetAmount: bc.AssetAmount{
437 //                                              AssetId: testAssetID1,
438 //                                              Amount:  300,
439 //                                      },
440 //                                      AccountID: "test_account1",
441 //                              }),
442 //                      },
443 //                      testActionCount: 4,
444 //                      wantActionCount: 3,
445 //              },
446 //              {
447 //                      testActions: []txbuilder.Action{
448 //                              txbuilder.Action(&spendUTXOAction{
449 //                                      OutputID: &bc.Hash{V0: 128},
450 //                              }),
451 //                              txbuilder.Action(&spendAction{
452 //                                      AssetAmount: bc.AssetAmount{
453 //                                              AssetId: testBTM,
454 //                                              Amount:  100,
455 //                                      },
456 //                                      AccountID: "test_account",
457 //                              }),
458 //                              txbuilder.Action(&spendAction{
459 //                                      AssetAmount: bc.AssetAmount{
460 //                                              AssetId: testAssetID1,
461 //                                              Amount:  200,
462 //                                      },
463 //                                      AccountID: "test_account1",
464 //                              }),
465 //                              txbuilder.Action(&spendUTXOAction{
466 //                                      OutputID: &bc.Hash{V0: 256},
467 //                              }),
468 //                              txbuilder.Action(&spendAction{
469 //                                      AssetAmount: bc.AssetAmount{
470 //                                              AssetId: testAssetID2,
471 //                                              Amount:  300,
472 //                                      },
473 //                                      AccountID: "test_account2",
474 //                              }),
475 //                      },
476 //                      wantActions: []txbuilder.Action{
477 //                              txbuilder.Action(&spendUTXOAction{
478 //                                      OutputID: &bc.Hash{V0: 128},
479 //                              }),
480 //                              txbuilder.Action(&spendAction{
481 //                                      AssetAmount: bc.AssetAmount{
482 //                                              AssetId: testBTM,
483 //                                              Amount:  100,
484 //                                      },
485 //                                      AccountID: "test_account",
486 //                              }),
487 //                              txbuilder.Action(&spendAction{
488 //                                      AssetAmount: bc.AssetAmount{
489 //                                              AssetId: testAssetID1,
490 //                                              Amount:  200,
491 //                                      },
492 //                                      AccountID: "test_account1",
493 //                              }),
494 //                              txbuilder.Action(&spendUTXOAction{
495 //                                      OutputID: &bc.Hash{V0: 256},
496 //                              }),
497 //                              txbuilder.Action(&spendAction{
498 //                                      AssetAmount: bc.AssetAmount{
499 //                                              AssetId: testAssetID2,
500 //                                              Amount:  300,
501 //                                      },
502 //                                      AccountID: "test_account2",
503 //                              }),
504 //                      },
505 //                      testActionCount: 5,
506 //                      wantActionCount: 5,
507 //              },
508 //      }
509
510 //      for _, c := range cases {
511 //              gotActions := MergeSpendAction(c.testActions)
512
513 //              gotMap := make(map[string]uint64)
514 //              wantMap := make(map[string]uint64)
515 //              for _, got := range gotActions {
516 //                      switch got := got.(type) {
517 //                      case *spendAction:
518 //                              gotKey := got.AssetId.String() + got.AccountID
519 //                              gotMap[gotKey] = got.Amount
520 //                      default:
521 //                              continue
522 //                      }
523 //              }
524
525 //              for _, want := range c.wantActions {
526 //                      switch want := want.(type) {
527 //                      case *spendAction:
528 //                              wantKey := want.AssetId.String() + want.AccountID
529 //                              wantMap[wantKey] = want.Amount
530 //                      default:
531 //                              continue
532 //                      }
533 //              }
534
535 //              for key := range gotMap {
536 //                      if gotMap[key] != wantMap[key] {
537 //                              t.Fatalf("gotMap[%s]=%v, wantMap[%s]=%v", key, gotMap[key], key, wantMap[key])
538 //                      }
539 //              }
540
541 //              if len(gotActions) != c.wantActionCount {
542 //                      t.Fatalf("number of gotActions=%d, wantActions=%d", len(gotActions), c.wantActionCount)
543 //              }
544 //      }
545 // }
546
547 func TestCalcMergeGas(t *testing.T) {
548         chainTxUtxoNum = 10
549         cases := []struct {
550                 utxoNum int
551                 gas     uint64
552         }{
553                 {
554                         utxoNum: 0,
555                         gas:     0,
556                 },
557                 {
558                         utxoNum: 1,
559                         gas:     0,
560                 },
561                 {
562                         utxoNum: 9,
563                         gas:     chainTxMergeGas * 2,
564                 },
565                 {
566                         utxoNum: 10,
567                         gas:     chainTxMergeGas * 3,
568                 },
569                 {
570                         utxoNum: 11,
571                         gas:     chainTxMergeGas * 3,
572                 },
573                 {
574                         utxoNum: 20,
575                         gas:     chainTxMergeGas * 5,
576                 },
577                 {
578                         utxoNum: 21,
579                         gas:     chainTxMergeGas * 5,
580                 },
581                 {
582                         utxoNum: 74,
583                         gas:     chainTxMergeGas * 19,
584                 },
585         }
586
587         for i, c := range cases {
588                 gas := acc.CalcMergeGas(c.utxoNum)
589                 if gas != c.gas {
590                         t.Fatalf("case %d got %d want %d", i, gas, c.gas)
591                 }
592         }
593 }