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  }