github.com/ava-labs/subnet-evm@v0.6.4/tests/load/load_test.go (about)

     1  // Copyright (C) 2023, Ava Labs, Inc. All rights reserved.
     2  // See the file LICENSE for licensing terms.
     3  
     4  package load
     5  
     6  import (
     7  	"fmt"
     8  	"os"
     9  	"os/exec"
    10  	"path/filepath"
    11  	"strings"
    12  	"testing"
    13  
    14  	ginkgo "github.com/onsi/ginkgo/v2"
    15  
    16  	"github.com/onsi/gomega"
    17  
    18  	"github.com/stretchr/testify/require"
    19  
    20  	"github.com/ethereum/go-ethereum/log"
    21  
    22  	"github.com/ava-labs/avalanchego/ids"
    23  	"github.com/ava-labs/avalanchego/tests/fixture/e2e"
    24  	"github.com/ava-labs/avalanchego/tests/fixture/tmpnet"
    25  	"github.com/ava-labs/avalanchego/utils/set"
    26  
    27  	"github.com/ava-labs/subnet-evm/tests"
    28  	"github.com/ava-labs/subnet-evm/tests/utils"
    29  )
    30  
    31  const (
    32  	// The load test requires 5 nodes
    33  	nodeCount = 5
    34  
    35  	subnetAName = "load-subnet-a"
    36  )
    37  
    38  var (
    39  	flagVars     *e2e.FlagVars
    40  	repoRootPath = tests.GetRepoRootPath("tests/load")
    41  )
    42  
    43  func init() {
    44  	// Configures flags used to configure tmpnet
    45  	flagVars = e2e.RegisterFlags()
    46  }
    47  
    48  func TestE2E(t *testing.T) {
    49  	gomega.RegisterFailHandler(ginkgo.Fail)
    50  	ginkgo.RunSpecs(t, "subnet-evm small load simulator test suite")
    51  }
    52  
    53  var _ = ginkgo.Describe("[Load Simulator]", ginkgo.Ordered, func() {
    54  	require := require.New(ginkgo.GinkgoT())
    55  
    56  	var env *e2e.TestEnvironment
    57  
    58  	ginkgo.BeforeAll(func() {
    59  		genesisPath := filepath.Join(repoRootPath, "tests/load/genesis/genesis.json")
    60  
    61  		nodes := utils.NewTmpnetNodes(nodeCount)
    62  
    63  		env = e2e.NewTestEnvironment(
    64  			flagVars,
    65  			utils.NewTmpnetNetwork(
    66  				"subnet-evm-small-load",
    67  				nodes,
    68  				tmpnet.FlagsMap{},
    69  				utils.NewTmpnetSubnet(subnetAName, genesisPath, utils.DefaultChainConfig, nodes...),
    70  			),
    71  		)
    72  	})
    73  
    74  	ginkgo.It("basic subnet load test", ginkgo.Label("load"), func() {
    75  		network := env.GetNetwork()
    76  
    77  		subnet := network.GetSubnet(subnetAName)
    78  		require.NotNil(subnet)
    79  		blockchainID := subnet.Chains[0].ChainID
    80  
    81  		nodeURIs := tmpnet.GetNodeURIs(network.Nodes)
    82  		validatorIDs := set.NewSet[ids.NodeID](len(subnet.ValidatorIDs))
    83  		validatorIDs.Add(subnet.ValidatorIDs...)
    84  		rpcEndpoints := make([]string, 0, len(nodeURIs))
    85  		for _, nodeURI := range nodeURIs {
    86  			if !validatorIDs.Contains(nodeURI.NodeID) {
    87  				continue
    88  			}
    89  			rpcEndpoints = append(rpcEndpoints, fmt.Sprintf("%s/ext/bc/%s/rpc", nodeURI.URI, blockchainID))
    90  		}
    91  		commaSeparatedRPCEndpoints := strings.Join(rpcEndpoints, ",")
    92  		err := os.Setenv("RPC_ENDPOINTS", commaSeparatedRPCEndpoints)
    93  		require.NoError(err)
    94  
    95  		log.Info("Running load simulator...", "rpcEndpoints", commaSeparatedRPCEndpoints)
    96  		cmd := exec.Command("./scripts/run_simulator.sh")
    97  		cmd.Dir = repoRootPath
    98  		log.Info("Running load simulator script", "cmd", cmd.String())
    99  
   100  		out, err := cmd.CombinedOutput()
   101  		fmt.Printf("\nCombined output:\n\n%s\n", string(out))
   102  		require.NoError(err)
   103  	})
   104  })