7 "github.com/vapor/blockchain/txbuilder"
8 "github.com/vapor/consensus"
9 "github.com/vapor/protocol/bc"
10 "github.com/vapor/testutil"
13 func TestMergeSpendAction(t *testing.T) {
14 testBTM := &bc.AssetID{}
15 if err := testBTM.UnmarshalText([]byte("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff")); err != nil {
19 testAssetID1 := &bc.AssetID{}
20 if err := testAssetID1.UnmarshalText([]byte("50ec80b6bc48073f6aa8fa045131a71213c33f3681203b15ddc2e4b81f1f4730")); err != nil {
24 testAssetID2 := &bc.AssetID{}
25 if err := testAssetID2.UnmarshalText([]byte("43c6946d092b2959c1a82e90b282c68fca63e66de289048f6acd6cea9383c79c")); err != nil {
30 testActions []txbuilder.Action
31 wantActions []txbuilder.Action
36 testActions: []txbuilder.Action{
37 txbuilder.Action(&spendAction{
38 AssetAmount: bc.AssetAmount{
42 AccountID: "test_account",
44 txbuilder.Action(&spendAction{
45 AssetAmount: bc.AssetAmount{
49 AccountID: "test_account",
51 txbuilder.Action(&spendAction{
52 AssetAmount: bc.AssetAmount{
56 AccountID: "test_account",
58 txbuilder.Action(&spendAction{
59 AssetAmount: bc.AssetAmount{
60 AssetId: testAssetID1,
63 AccountID: "test_account",
66 wantActions: []txbuilder.Action{
67 txbuilder.Action(&spendAction{
68 AssetAmount: bc.AssetAmount{
72 AccountID: "test_account",
74 txbuilder.Action(&spendAction{
75 AssetAmount: bc.AssetAmount{
76 AssetId: testAssetID1,
79 AccountID: "test_account",
86 testActions: []txbuilder.Action{
87 txbuilder.Action(&spendAction{
88 AssetAmount: bc.AssetAmount{
92 AccountID: "test_account",
94 txbuilder.Action(&spendAction{
95 AssetAmount: bc.AssetAmount{
96 AssetId: testAssetID1,
99 AccountID: "test_account",
101 txbuilder.Action(&spendAction{
102 AssetAmount: bc.AssetAmount{
106 AccountID: "test_account",
108 txbuilder.Action(&spendAction{
109 AssetAmount: bc.AssetAmount{
110 AssetId: testAssetID1,
113 AccountID: "test_account",
116 wantActions: []txbuilder.Action{
117 txbuilder.Action(&spendAction{
118 AssetAmount: bc.AssetAmount{
122 AccountID: "test_account",
124 txbuilder.Action(&spendAction{
125 AssetAmount: bc.AssetAmount{
126 AssetId: testAssetID1,
129 AccountID: "test_account",
136 testActions: []txbuilder.Action{
137 txbuilder.Action(&spendAction{
138 AssetAmount: bc.AssetAmount{
142 AccountID: "test_account",
144 txbuilder.Action(&spendAction{
145 AssetAmount: bc.AssetAmount{
146 AssetId: testAssetID1,
149 AccountID: "test_account",
151 txbuilder.Action(&spendAction{
152 AssetAmount: bc.AssetAmount{
153 AssetId: testAssetID2,
156 AccountID: "test_account",
158 txbuilder.Action(&spendAction{
159 AssetAmount: bc.AssetAmount{
160 AssetId: testAssetID1,
163 AccountID: "test_account",
165 txbuilder.Action(&spendAction{
166 AssetAmount: bc.AssetAmount{
167 AssetId: testAssetID2,
170 AccountID: "test_account",
173 wantActions: []txbuilder.Action{
174 txbuilder.Action(&spendAction{
175 AssetAmount: bc.AssetAmount{
179 AccountID: "test_account",
181 txbuilder.Action(&spendAction{
182 AssetAmount: bc.AssetAmount{
183 AssetId: testAssetID1,
186 AccountID: "test_account",
188 txbuilder.Action(&spendAction{
189 AssetAmount: bc.AssetAmount{
190 AssetId: testAssetID2,
193 AccountID: "test_account",
200 testActions: []txbuilder.Action{
201 txbuilder.Action(&spendAction{
202 AssetAmount: bc.AssetAmount{
206 AccountID: "test_account",
208 txbuilder.Action(&spendAction{
209 AssetAmount: bc.AssetAmount{
213 AccountID: "test_account1",
215 txbuilder.Action(&spendAction{
216 AssetAmount: bc.AssetAmount{
220 AccountID: "test_account",
222 txbuilder.Action(&spendAction{
223 AssetAmount: bc.AssetAmount{
224 AssetId: testAssetID1,
227 AccountID: "test_account1",
230 wantActions: []txbuilder.Action{
231 txbuilder.Action(&spendAction{
232 AssetAmount: bc.AssetAmount{
236 AccountID: "test_account",
238 txbuilder.Action(&spendAction{
239 AssetAmount: bc.AssetAmount{
243 AccountID: "test_account1",
245 txbuilder.Action(&spendAction{
246 AssetAmount: bc.AssetAmount{
247 AssetId: testAssetID1,
250 AccountID: "test_account1",
257 testActions: []txbuilder.Action{
258 txbuilder.Action(&spendUTXOAction{
259 OutputID: &bc.Hash{V0: 128},
261 txbuilder.Action(&spendAction{
262 AssetAmount: bc.AssetAmount{
266 AccountID: "test_account",
268 txbuilder.Action(&spendAction{
269 AssetAmount: bc.AssetAmount{
270 AssetId: testAssetID1,
273 AccountID: "test_account1",
275 txbuilder.Action(&spendUTXOAction{
276 OutputID: &bc.Hash{V0: 256},
278 txbuilder.Action(&spendAction{
279 AssetAmount: bc.AssetAmount{
280 AssetId: testAssetID2,
283 AccountID: "test_account2",
286 wantActions: []txbuilder.Action{
287 txbuilder.Action(&spendUTXOAction{
288 OutputID: &bc.Hash{V0: 128},
290 txbuilder.Action(&spendAction{
291 AssetAmount: bc.AssetAmount{
295 AccountID: "test_account",
297 txbuilder.Action(&spendAction{
298 AssetAmount: bc.AssetAmount{
299 AssetId: testAssetID1,
302 AccountID: "test_account1",
304 txbuilder.Action(&spendUTXOAction{
305 OutputID: &bc.Hash{V0: 256},
307 txbuilder.Action(&spendAction{
308 AssetAmount: bc.AssetAmount{
309 AssetId: testAssetID2,
312 AccountID: "test_account2",
320 for _, c := range cases {
321 gotActions := MergeSpendAction(c.testActions)
323 gotMap := make(map[string]uint64)
324 wantMap := make(map[string]uint64)
325 for _, got := range gotActions {
326 switch got := got.(type) {
328 gotKey := got.AssetId.String() + got.AccountID
329 gotMap[gotKey] = got.Amount
335 for _, want := range c.wantActions {
336 switch want := want.(type) {
338 wantKey := want.AssetId.String() + want.AccountID
339 wantMap[wantKey] = want.Amount
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])
351 if len(gotActions) != c.wantActionCount {
352 t.Fatalf("number of gotActions=%d, wantActions=%d", len(gotActions), c.wantActionCount)
357 func TestCalcMergeGas(t *testing.T) {
373 gas: chainTxMergeGas,
377 gas: chainTxMergeGas,
381 gas: chainTxMergeGas * 2,
385 gas: chainTxMergeGas * 3,
389 gas: chainTxMergeGas * 3,
393 gas: chainTxMergeGas * 9,
397 for i, c := range cases {
398 gas := calcMergeGas(c.utxoNum)
400 t.Fatalf("case %d got %d want %d", i, gas, c.gas)
405 func TestReserveBtmUtxoChain(t *testing.T) {
408 m := mockAccountManager(t)
409 for i := uint64(1); i <= 20; i++ {
411 OutputID: bc.Hash{V0: i},
412 AccountID: "TestAccountID",
413 AssetID: *consensus.BTMAssetID,
414 Amount: i * chainTxMergeGas,
416 utxos = append(utxos, utxo)
418 m.store.SetStandardUTXO(utxo.OutputID, utxo)
427 amount: 1 * chainTxMergeGas,
431 amount: 888888 * chainTxMergeGas,
436 amount: 7 * chainTxMergeGas,
437 want: []uint64{4, 3, 1},
440 amount: 15 * chainTxMergeGas,
441 want: []uint64{5, 4, 3, 2, 1, 6},
444 amount: 163 * chainTxMergeGas,
445 want: []uint64{20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 2, 1, 3},
449 for i, c := range cases {
450 m.utxoKeeper.expireReservation(time.Unix(999999999, 0))
451 utxos, err := m.reserveBtmUtxoChain(&txbuilder.TemplateBuilder{}, "TestAccountID", c.amount, false)
453 if err != nil != c.err {
454 t.Fatalf("case %d got err %v want err = %v", i, err, c.err)
458 for _, utxo := range utxos {
459 got = append(got, utxo.Amount/chainTxMergeGas)
462 if !testutil.DeepEqual(got, c.want) {
463 t.Fatalf("case %d got %d want %d", i, got, c.want)