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 }