github.com/ZuluSpl0it/Sia@v1.3.7/siatest/testnode.go (about) 1 package siatest 2 3 import ( 4 "github.com/NebulousLabs/Sia/node" 5 "github.com/NebulousLabs/Sia/node/api/client" 6 "github.com/NebulousLabs/Sia/node/api/server" 7 "github.com/NebulousLabs/Sia/types" 8 9 "github.com/NebulousLabs/errors" 10 ) 11 12 // TestNode is a helper struct for testing that contains a server and a client 13 // as embedded fields. 14 type TestNode struct { 15 *server.Server 16 client.Client 17 params node.NodeParams 18 primarySeed string 19 } 20 21 // RestartNode restarts a TestNode 22 func (tn *TestNode) RestartNode() error { 23 err := tn.StopNode() 24 if err != nil { 25 return errors.AddContext(err, "Could not stop node") 26 } 27 err = tn.StartNode() 28 if err != nil { 29 return errors.AddContext(err, "Could not start node") 30 } 31 return nil 32 } 33 34 // StartNode starts a TestNode from an active group 35 func (tn *TestNode) StartNode() error { 36 // Create server 37 s, err := server.New(":0", tn.UserAgent, tn.Password, tn.params) 38 if err != nil { 39 return err 40 } 41 tn.Server = s 42 tn.Client.Address = s.APIAddress() 43 return tn.WalletUnlockPost(tn.primarySeed) 44 } 45 46 // StopNode stops a TestNode 47 func (tn *TestNode) StopNode() error { 48 return errors.AddContext(tn.Close(), "failed to stop node") 49 } 50 51 // NewNode creates a new funded TestNode 52 func NewNode(nodeParams node.NodeParams) (*TestNode, error) { 53 // We can't create a funded node without a miner 54 if !nodeParams.CreateMiner && nodeParams.Miner == nil { 55 return nil, errors.New("Can't create funded node without miner") 56 } 57 // Create clean node 58 tn, err := NewCleanNode(nodeParams) 59 if err != nil { 60 return nil, err 61 } 62 // Fund the node 63 for i := types.BlockHeight(0); i <= types.MaturityDelay+types.TaxHardforkHeight; i++ { 64 if err := tn.MineBlock(); err != nil { 65 return nil, err 66 } 67 } 68 // Return TestNode 69 return tn, nil 70 } 71 72 // NewCleanNode creates a new TestNode that's not yet funded 73 func NewCleanNode(nodeParams node.NodeParams) (*TestNode, error) { 74 userAgent := "Sia-Agent" 75 password := "password" 76 77 // Create server 78 s, err := server.New(":0", userAgent, password, nodeParams) 79 if err != nil { 80 return nil, err 81 } 82 83 // Create client 84 c := client.New(s.APIAddress()) 85 c.UserAgent = userAgent 86 c.Password = password 87 88 // Create TestNode 89 tn := &TestNode{s, *c, nodeParams, ""} 90 91 // Init wallet 92 wip, err := tn.WalletInitPost("", false) 93 if err != nil { 94 return nil, err 95 } 96 tn.primarySeed = wip.PrimarySeed 97 98 // Unlock wallet 99 if err := tn.WalletUnlockPost(tn.primarySeed); err != nil { 100 return nil, err 101 } 102 103 // Return TestNode 104 return tn, nil 105 }