Skip to content

Commit

Permalink
Feat: Create integration test network with nodes having mana. (iotale…
Browse files Browse the repository at this point in the history
…dger#1232)

* create network with mana

* create peer with mana

* fix sendFaucetRequest
  • Loading branch information
acha-bill authored Apr 29, 2021
1 parent de52cb5 commit eeb5f08
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 5 deletions.
8 changes: 6 additions & 2 deletions client/faucet.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,14 @@ const (
)

// SendFaucetRequest requests funds from faucet nodes by sending a faucet request payload message.
func (api *GoShimmerAPI) SendFaucetRequest(base58EncodedAddr string) (*jsonmodels.FaucetResponse, error) {
func (api *GoShimmerAPI) SendFaucetRequest(base58EncodedAddr string, pledgeIDs ...string) (*jsonmodels.FaucetResponse, error) {
aManaPledgeID, cManaPledgeID := "", ""
if len(pledgeIDs) > 1 {
aManaPledgeID, cManaPledgeID = pledgeIDs[0], pledgeIDs[1]
}
res := &jsonmodels.FaucetResponse{}
if err := api.do(http.MethodPost, routeFaucet,
&jsonmodels.FaucetRequest{Address: base58EncodedAddr}, res); err != nil {
&jsonmodels.FaucetRequest{Address: base58EncodedAddr, AccessManaPledgeID: aManaPledgeID, ConsensusManaPledgeID: cManaPledgeID}, res); err != nil {
return nil, err
}

Expand Down
29 changes: 29 additions & 0 deletions tools/integration-tests/tester/framework/framework.go
Original file line number Diff line number Diff line change
Expand Up @@ -324,3 +324,32 @@ func (f *Framework) CreateDRNGNetwork(name string, members, peers, minimumNeighb

return drng, nil
}

// CreateNetworkWithMana creates and returns a (Docker) Network that contains peers that all have some mana.
// Mana is gotten by sending faucet requests.
func (f *Framework) CreateNetworkWithMana(name string, peers, minimumNeighbors int, config CreateNetworkConfig) (*Network, error) {
n, err := f.CreateNetwork(name, peers, minimumNeighbors, config)
if err != nil {
return nil, err
}
if !config.Faucet {
return nil, fmt.Errorf("faucet is required")
}
if !config.Mana {
return nil, fmt.Errorf("mana plugin is required to load mana snapshot")
}
for i := 1; i < len(n.peers); i++ {
peer := n.peers[i]
addr := peer.Seed.Address(uint64(0)).Address()
ID := base58.Encode(peer.ID().Bytes())
_, err := peer.SendFaucetRequest(addr.Base58(), ID, ID)
if err != nil {
return nil, fmt.Errorf("faucet request failed on peer %s: %w", peer.ID(), err)
}
}
err = n.WaitForMana()
if err != nil {
return nil, err
}
return n, nil
}
51 changes: 51 additions & 0 deletions tools/integration-tests/tester/framework/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -164,6 +164,27 @@ func (n *Network) CreatePeer(c GoShimmerConfig) (*Peer, error) {
return peer, nil
}

// CreatePeerWithMana creates a new peers/Goshimmer node in the network and returns it.
// It requests funds from the faucet and pledges mana to itself.
func (n *Network) CreatePeerWithMana(c GoShimmerConfig) (*Peer, error) {
peer, err := n.CreatePeer(c)
if err != nil {
return nil, err
}
addr := peer.Seed.Address(uint64(0)).Address()
ID := base58.Encode(peer.ID().Bytes())
_, err = peer.SendFaucetRequest(addr.Base58(), ID, ID)
if err != nil {
_ = peer.Stop()
return nil, fmt.Errorf("error sending faucet request... shutting down: %w", err)
}
err = n.WaitForMana(peer)
if err != nil {
return nil, err
}
return peer, nil
}

// Shutdown creates logs and removes network and containers.
// Should always be called when a network is not needed anymore!
func (n *Network) Shutdown() error {
Expand Down Expand Up @@ -308,6 +329,36 @@ func (n *Network) WaitForAutopeering(minimumNeighbors int) error {
return fmt.Errorf("autopeering not successful")
}

// WaitForMana waits until all peers have access mana.
// Returns error if all peers don't have mana after waitForManaMaxTries
func (n *Network) WaitForMana(optionalPeers ...*Peer) error {
log.Printf("Waiting for nodes to get mana...\n")
defer log.Printf("Waiting for nodes to get mana... done\n")

peers := n.peers
if len(optionalPeers) > 0 {
peers = optionalPeers
}
m := make(map[*Peer]struct{})
for _, peer := range peers {
m[peer] = struct{}{}
}
for i := waitForManaMaxTries; i > 0; i-- {
for peer := range m {
infoRes, err := peer.Info()
if err == nil && infoRes.Mana.Access > 0.0 {
delete(m, peer)
}
}
if len(m) == 0 {
return nil
}
log.Println("Not done yet. Try again in 5 seconds...")
time.Sleep(5 * time.Second)
}
return fmt.Errorf("waiting for mana not successful")
}

// namePrefix returns the suffix prefixed with the name.
func (n *Network) namePrefix(suffix string) string {
return fmt.Sprintf("%s-%s", n.name, suffix)
Expand Down
1 change: 1 addition & 0 deletions tools/integration-tests/tester/framework/parameters.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package framework

const (
autopeeringMaxTries = 50
waitForManaMaxTries = 10

apiPort = "8080"

Expand Down
14 changes: 11 additions & 3 deletions tools/integration-tests/tester/tests/testutil.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (
"github.com/iotaledger/hive.go/identity"
"github.com/iotaledger/hive.go/stringify"
"github.com/iotaledger/hive.go/types"
"github.com/mr-tron/base58"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"golang.org/x/crypto/blake2b"
Expand Down Expand Up @@ -104,9 +105,16 @@ func SendFaucetRequestOnRandomPeer(t *testing.T, peers []*framework.Peer, numMes
return ids, addrBalance
}

// SendFaucetRequest sends a data message on a given peer and returns the id and a DataMessageSent struct.
func SendFaucetRequest(t *testing.T, peer *framework.Peer, addr ledgerstate.Address) (string, DataMessageSent) {
resp, err := peer.SendFaucetRequest(addr.Base58())
// SendFaucetRequest sends a data message on a given peer and returns the id and a DataMessageSent struct. By default,
// it pledges mana to the peer making the request.
func SendFaucetRequest(t *testing.T, peer *framework.Peer, addr ledgerstate.Address, manaPledgeIDs ...string) (string, DataMessageSent) {
peerID := base58.Encode(peer.ID().Bytes())
aManaPledgeID, cManaPledgeID := peerID, peerID
if len(manaPledgeIDs) > 1 {
aManaPledgeID, cManaPledgeID = manaPledgeIDs[0], manaPledgeIDs[1]
}

resp, err := peer.SendFaucetRequest(addr.Base58(), aManaPledgeID, cManaPledgeID)
require.NoErrorf(t, err, "Could not send faucet request on %s", peer.String())

sent := DataMessageSent{
Expand Down

0 comments on commit eeb5f08

Please sign in to comment.