github.com/ZuluSpl0it/Sia@v1.3.7/siatest/wallet/wallet_test.go (about)

     1  package wallet
     2  
     3  import (
     4  	"errors"
     5  	"path/filepath"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/NebulousLabs/Sia/build"
    10  	"github.com/NebulousLabs/Sia/siatest"
    11  	"github.com/NebulousLabs/Sia/types"
    12  )
    13  
    14  // TestTransactionReorg makes sure that a processedTransaction isn't returned
    15  // by the API after bein reverted.
    16  func TestTransactionReorg(t *testing.T) {
    17  	if testing.Short() {
    18  		t.SkipNow()
    19  	}
    20  
    21  	testdir, err := siatest.TestDir(t.Name())
    22  	if err != nil {
    23  		t.Fatal(err)
    24  	}
    25  
    26  	// Create two miners
    27  	miner1, err := siatest.NewNode(siatest.Miner(filepath.Join(testdir, "miner1")))
    28  	if err != nil {
    29  		t.Fatal(err)
    30  	}
    31  	defer func() {
    32  		if err := miner1.Close(); err != nil {
    33  			t.Fatal(err)
    34  		}
    35  	}()
    36  	// miner1 sends a txn to itself and mines it.
    37  	uc, err := miner1.WalletAddressGet()
    38  	if err != nil {
    39  		t.Fatal(err)
    40  	}
    41  	wsp, err := miner1.WalletSiacoinsPost(types.SiacoinPrecision, uc.Address)
    42  	if err != nil {
    43  		t.Fatal(err)
    44  	}
    45  	blocks := 1
    46  	for i := 0; i < blocks; i++ {
    47  		if err := miner1.MineBlock(); err != nil {
    48  			t.Fatal(err)
    49  		}
    50  	}
    51  	// wait until the transaction from before shows up as processed.
    52  	txn := wsp.TransactionIDs[len(wsp.TransactionIDs)-1]
    53  	err = build.Retry(100, 100*time.Millisecond, func() error {
    54  		cg, err := miner1.ConsensusGet()
    55  		if err != nil {
    56  			return err
    57  		}
    58  		wtg, err := miner1.WalletTransactionsGet(1, cg.Height)
    59  		if err != nil {
    60  			return err
    61  		}
    62  		for _, t := range wtg.ConfirmedTransactions {
    63  			if t.TransactionID == txn {
    64  				return nil
    65  			}
    66  		}
    67  		return errors.New("txn isn't processed yet")
    68  	})
    69  	if err != nil {
    70  		t.Fatal(err)
    71  	}
    72  	miner2, err := siatest.NewNode(siatest.Miner(filepath.Join(testdir, "miner2")))
    73  	if err != nil {
    74  		t.Fatal(err)
    75  	}
    76  	defer func() {
    77  		if err := miner2.Close(); err != nil {
    78  			t.Fatal(err)
    79  		}
    80  	}()
    81  
    82  	// miner2 mines 2 blocks now to create a longer chain than miner1.
    83  	for i := 0; i < blocks+1; i++ {
    84  		if err := miner2.MineBlock(); err != nil {
    85  			t.Fatal(err)
    86  		}
    87  	}
    88  	// miner1 and miner2 connect. This should cause a reorg that reverts the
    89  	// transaction from before.
    90  	if err := miner1.GatewayConnectPost(miner2.GatewayAddress()); err != nil {
    91  		t.Fatal(err)
    92  	}
    93  	err = build.Retry(100, 100*time.Millisecond, func() error {
    94  		cg, err := miner1.ConsensusGet()
    95  		if err != nil {
    96  			return err
    97  		}
    98  		wtg, err := miner1.WalletTransactionsGet(1, cg.Height)
    99  		if err != nil {
   100  			return err
   101  		}
   102  		for _, t := range wtg.ConfirmedTransactions {
   103  			if t.TransactionID == txn {
   104  				return errors.New("txn is still processed")
   105  			}
   106  		}
   107  		return nil
   108  	})
   109  	if err != nil {
   110  		t.Fatal(err)
   111  	}
   112  }