decred.org/dcrdex@v1.0.5/client/asset/eth/txdb_test.go (about) 1 //go:build !harness && !rpclive 2 3 package eth 4 5 import ( 6 "math/big" 7 "reflect" 8 "testing" 9 10 "decred.org/dcrdex/client/asset" 11 "decred.org/dcrdex/dex" 12 ) 13 14 func TestTxDB(t *testing.T) { 15 tempDir := t.TempDir() 16 tLogger := dex.StdOutLogger("TXDB", dex.LevelTrace) 17 18 // Grab these for the tx generation utilities 19 _, eth, node, shutdown := tassetWallet(BipID) 20 shutdown() 21 22 txHistoryStore, err := newBadgerTxDB(tempDir, tLogger) 23 if err != nil { 24 t.Fatalf("error connecting to tx history store: %v", err) 25 } 26 27 txs, err := txHistoryStore.getTxs(0, nil, true, nil) 28 if err != nil { 29 t.Fatalf("error retrieving txs: %v", err) 30 } 31 if len(txs) != 0 { 32 t.Fatalf("expected 0 txs but got %d", len(txs)) 33 } 34 35 newTx := func(nonce uint64) *extendedWalletTx { 36 return eth.extendedTx(node.newTransaction(nonce, big.NewInt(1)), asset.Send, 1, nil) 37 } 38 39 wt1 := newTx(1) 40 wt1.Confirmed = true 41 wt1.TokenID = &usdcTokenID 42 wt2 := newTx(2) 43 wt3 := newTx(3) 44 wt4 := newTx(4) 45 46 err = txHistoryStore.storeTx(wt1) 47 if err != nil { 48 t.Fatalf("error storing tx: %v", err) 49 } 50 51 txs, err = txHistoryStore.getTxs(0, nil, true, nil) 52 if err != nil { 53 t.Fatalf("error retrieving txs: %v", err) 54 } 55 expectedTxs := []*asset.WalletTransaction{wt1.WalletTransaction} 56 if !reflect.DeepEqual(expectedTxs, txs) { 57 t.Fatalf("expected txs %+v but got %+v", expectedTxs, txs) 58 } 59 60 err = txHistoryStore.storeTx(wt2) 61 if err != nil { 62 t.Fatalf("error storing tx: %v", err) 63 } 64 txs, err = txHistoryStore.getTxs(0, nil, true, nil) 65 if err != nil { 66 t.Fatalf("error retrieving txs: %v", err) 67 } 68 expectedTxs = []*asset.WalletTransaction{wt2.WalletTransaction, wt1.WalletTransaction} 69 if !reflect.DeepEqual(expectedTxs, txs) { 70 t.Fatalf("expected txs %+v but got %+v", expectedTxs, txs) 71 } 72 73 err = txHistoryStore.storeTx(wt3) 74 if err != nil { 75 t.Fatalf("error storing tx: %v", err) 76 } 77 txs, err = txHistoryStore.getTxs(2, nil, true, nil) 78 if err != nil { 79 t.Fatalf("error retrieving txs: %v", err) 80 } 81 expectedTxs = []*asset.WalletTransaction{wt3.WalletTransaction, wt2.WalletTransaction} 82 if !reflect.DeepEqual(expectedTxs, txs) { 83 t.Fatalf("expected txs %+v but got %+v", expectedTxs, txs) 84 } 85 86 txs, err = txHistoryStore.getTxs(0, &wt2.txHash, true, nil) 87 if err != nil { 88 t.Fatalf("error retrieving txs: %v", err) 89 } 90 expectedTxs = []*asset.WalletTransaction{wt2.WalletTransaction, wt1.WalletTransaction} 91 if !reflect.DeepEqual(expectedTxs, txs) { 92 t.Fatalf("expected txs %+v but got %+v", expectedTxs, txs) 93 } 94 95 txs, err = txHistoryStore.getTxs(0, &wt2.txHash, false, nil) 96 if err != nil { 97 t.Fatalf("error retrieving txs: %v", err) 98 } 99 expectedTxs = []*asset.WalletTransaction{wt2.WalletTransaction, wt3.WalletTransaction} 100 if !reflect.DeepEqual(expectedTxs, txs) { 101 t.Fatalf("expected txs %+v but got %+v", expectedTxs, txs) 102 } 103 104 allTxs := []*asset.WalletTransaction{wt4.WalletTransaction, wt3.WalletTransaction, wt2.WalletTransaction, wt1.WalletTransaction} 105 106 // Update same tx with new fee 107 wt4.Fees = 300 108 err = txHistoryStore.storeTx(wt4) 109 if err != nil { 110 t.Fatalf("error storing tx: %v", err) 111 } 112 txs, err = txHistoryStore.getTxs(0, nil, false, nil) 113 if err != nil { 114 t.Fatalf("error retrieving txs: %v", err) 115 } 116 if !reflect.DeepEqual(allTxs, txs) { 117 t.Fatalf("expected txs %+v but got %+v", expectedTxs, txs) 118 } 119 txHistoryStore.Close() 120 121 txHistoryStore, err = newBadgerTxDB(tempDir, dex.StdOutLogger("TXDB", dex.LevelTrace)) 122 if err != nil { 123 t.Fatalf("error connecting to tx history store: %v", err) 124 } 125 defer txHistoryStore.Close() 126 127 txs, err = txHistoryStore.getTxs(0, nil, false, nil) 128 if err != nil { 129 t.Fatalf("error retrieving txs: %v", err) 130 } 131 if !reflect.DeepEqual(allTxs, txs) { 132 t.Fatalf("expected txs %+v but got %+v", expectedTxs, txs) 133 } 134 135 unconfirmedTxs, err := txHistoryStore.getPendingTxs() 136 if err != nil { 137 t.Fatalf("error retrieving txs: %v", err) 138 } 139 expectedUnconfirmedTxs := []*extendedWalletTx{wt2, wt3, wt4} 140 compareTxs := func(txs0, txs1 []*extendedWalletTx) bool { 141 if len(txs0) != len(txs1) { 142 return false 143 } 144 for i, tx0 := range txs0 { 145 tx1 := txs1[i] 146 n0, n1 := tx0.Nonce, tx1.Nonce 147 tx0.Nonce, tx1.Nonce = nil, nil 148 eq := reflect.DeepEqual(tx0.WalletTransaction, tx1.WalletTransaction) 149 tx0.Nonce, tx1.Nonce = n0, n1 150 if !eq { 151 return false 152 } 153 } 154 return true 155 } 156 if !compareTxs(expectedUnconfirmedTxs, unconfirmedTxs) { 157 t.Fatalf("expected txs %+v but got %+v", expectedUnconfirmedTxs, unconfirmedTxs) 158 } 159 160 txs, err = txHistoryStore.getTxs(0, nil, false, nil) 161 if err != nil { 162 t.Fatalf("error retrieving txs: %v", err) 163 } 164 if !reflect.DeepEqual(allTxs, txs) { 165 t.Fatalf("expected txs %+v but got %+v", expectedTxs, txs) 166 } 167 168 txs, err = txHistoryStore.getTxs(0, nil, false, &usdcTokenID) 169 if err != nil { 170 t.Fatalf("error retrieving txs: %v", err) 171 } 172 expectedTxs = []*asset.WalletTransaction{wt1.WalletTransaction} 173 if !reflect.DeepEqual(expectedTxs, txs) { 174 t.Fatalf("expected txs %+v but got %+v", expectedTxs, txs) 175 } 176 }