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  }