bsc/cmd/geth/initnetwork_test.go
Mister-EA 6932673003
cmd: add tests for init-network (#1899)
* cmd: add tests for init-network command

* cmd: add setup function
2023-09-29 20:54:20 +08:00

148 lines
4.2 KiB
Go

package main
import (
"fmt"
"os"
"path/filepath"
"runtime"
"strconv"
"strings"
"testing"
)
var size int
var basePort int
var configPath string
var genesisPath string
func setup(t *testing.T) {
size = 4
_, filename, _, ok := runtime.Caller(0)
if !ok {
t.Fatalf("error getting current file path")
}
currentDirectory := filepath.Dir(filename)
configPath = filepath.Join(currentDirectory, "testdata/config.toml")
genesisPath = filepath.Join(currentDirectory, "testdata/parlia.json")
basePort = 30311
}
func TestInitNetworkLocalhost(t *testing.T) {
setup(t)
ipStr := ""
testInitNetwork(t, size, basePort, ipStr, configPath, genesisPath)
}
func TestInitNetworkRemoteHosts(t *testing.T) {
setup(t)
ipStr := "192.168.24.103,172.15.67.89,10.0.17.36,203.113.45.76"
testInitNetwork(t, size, basePort, ipStr, configPath, genesisPath)
}
func testInitNetwork(t *testing.T, size, basePort int, ipStr, configPath, genesisPath string) {
dir := t.TempDir()
geth := runGeth(t, "init-network", "--init.dir", dir, "--init.size", strconv.Itoa(size),
"--init.ips", ipStr, "--init.p2p-port", strconv.Itoa(basePort), "--config", configPath,
genesisPath)
// expect the command to complete first
geth.WaitExit()
// Read the output of the command
files, err := os.ReadDir(dir)
if err != nil {
t.Fatal(err)
}
if len(files) != size {
t.Fatalf("expected %d node folders but found %d instead", size, len(files))
}
for i, file := range files {
if file.IsDir() {
expectedNodeDirName := fmt.Sprintf("node%d", i)
if file.Name() != expectedNodeDirName {
t.Fatalf("node dir name is %s but %s was expected", file.Name(), expectedNodeDirName)
}
configFilePath := filepath.Join(dir, file.Name(), "config.toml")
var config gethConfig
err := loadConfig(configFilePath, &config)
if err != nil {
t.Fatalf("failed to load config.toml : %v", err)
}
if ipStr == "" {
verifyConfigFileLocalhost(t, &config, i, basePort, size)
} else {
verifyConfigFileRemoteHosts(t, &config, ipStr, i, basePort, size)
}
}
}
}
func verifyConfigFileRemoteHosts(t *testing.T, config *gethConfig, ipStr string, i, basePort, size int) {
// 1. check ip string
ips := strings.Split(ipStr, ",")
if len(ips) != size {
t.Fatalf("found %d ips in ipStr=%s instead of %d", len(ips), ipStr, size)
}
// 2. check listening port
expectedListenAddr := fmt.Sprintf(":%d", basePort)
if config.Node.P2P.ListenAddr != expectedListenAddr {
t.Fatalf("expected ListenAddr to be %s but it is %s instead", expectedListenAddr, config.Node.P2P.ListenAddr)
}
bootnodes := config.Node.P2P.BootstrapNodes
// 3. check correctness of peers' hosts
for j := 0; j < i; j++ {
ip := bootnodes[j].IP().String()
if ip != ips[j] {
t.Fatalf("expected IP of bootnode to be %s but found %s instead", ips[j], ip)
}
}
for j := i + 1; j < size; j++ {
ip := bootnodes[j-1].IP().String()
if ip != ips[j] {
t.Fatalf("expected IP of bootnode to be %s but found %s instead", ips[j-1], ip)
}
}
// 4. check correctness of peer port numbers
for j := 0; j < size-1; j++ {
if bootnodes[j].UDP() != basePort {
t.Fatalf("expected bootnode port at position %d to be %d but got %d instead", j, basePort, bootnodes[j].UDP())
}
}
}
func verifyConfigFileLocalhost(t *testing.T, config *gethConfig, i int, basePort int, size int) {
// 1. check listening port
expectedListenAddr := fmt.Sprintf(":%d", basePort+i)
if config.Node.P2P.ListenAddr != expectedListenAddr {
t.Fatalf("expected ListenAddr to be %s but it is %s instead", expectedListenAddr, config.Node.P2P.ListenAddr)
}
bootnodes := config.Node.P2P.BootstrapNodes
// 2. check correctness of peers' hosts
localhost := "127.0.0.1"
for j := 0; j < size-1; j++ {
ip := bootnodes[j].IP().String()
if ip != localhost {
t.Fatalf("expected IP of bootnode to be %s but found %s instead", localhost, ip)
}
}
// 3. check correctness of peer port numbers
for j := 0; j < i; j++ {
if bootnodes[j].UDP() != basePort+j {
t.Fatalf("expected bootnode port at position %d to be %d but got %d instead", j, basePort+j, bootnodes[j].UDP())
}
}
for j := i + 1; j < size; j++ {
if bootnodes[j-1].UDP() != basePort+j {
t.Fatalf("expected bootnode port at position %d to be %d but got %d instead", j-1, basePort+j, bootnodes[j-1].UDP())
}
}
}