mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2024-12-25 21:07:18 +00:00
83179376d4
* Clean testutil, change tool names to Deterministic * Cleanup errors * Merge branch 'master' of https://github.com/prysmaticlabs/prysm into clean-testutil * Fix bug with generating deposits * Fix a few tests * Fix most tests * Clean up some tests * Remove err pt. 1 * Remove err pt. 2 * Change tests to use genesis state util * Remove err from deposits * Merge branch 'master' of https://github.com/prysmaticlabs/Prysm into clean-testutil * Remove circular dependency * Remove uncompressed signature test * Merge branch 'master' of https://github.com/prysmaticlabs/Prysm into clean-testutil * Merge branch 'master' into clean-testutil * Goimports * gazelle * Merge branch 'master' of https://github.com/prysmaticlabs/Prysm into clean-testutil * Add back error handling * New attestation pool (#4185) * New pool * Better namings * Fmt * Gazelle * Merge branch 'master' of https://github.com/prysmaticlabs/prysm into define-pool * Raul's feedback * Raul's feedback * Log peer conected log for incoming connections (#4173) * Log peer conected log for incoming connections * Merge branch 'master' into peerconnected * Merge branch 'master' into peerconnected * Update handshake.go * Update handshake.go * Merge branch 'master' into peerconnected * Merge branch 'master' into peerconnected * Attestation pool to use go-cache (#4187) * Update EthereumAPIs (#4186) * include new patch targeting latest ethapis master * ensure project builds * Merge branch 'master' into update-all-api * fix up committees * Merge branch 'update-all-api' of github.com:prysmaticlabs/prysm into update-all-api * include latest eth apis * Merge branch 'master' into update-all-api * update block tests * Merge branch 'update-all-api' of github.com:prysmaticlabs/prysm into update-all-api * Merge branch 'master' into update-all-api * add todos * Implement GetValidator RPC Endpoint (#4188) * include new patch targeting latest ethapis master * ensure project builds * Merge branch 'master' into update-all-api * fix up committees * Merge branch 'update-all-api' of github.com:prysmaticlabs/prysm into update-all-api * include latest eth apis * Merge branch 'master' into update-all-api * update block tests * Merge branch 'update-all-api' of github.com:prysmaticlabs/prysm into update-all-api * Merge branch 'master' into update-all-api * add todos * implement get validator rpc * add test for get validator * table driven test * fix up test * fix confs * tests for more cases * fix up tests and add out of range * Slasher optimization (#4172) * size * batching and concurrency improvements * gaz * merge fixes * fix comment * fix test * fix test * fix build * ethpb * ethpb * fix test * fix comment * add benchmark * fix benchmark * Handle error for all testutil uses * Fix errors * Merge branch 'master' of https://github.com/prysmaticlabs/Prysm into clean-testutil * Revert error handling Revert "Fix errors" This reverts commit db081f5486f62c854e7a34e792f5e380cfa922e7. Revert "Handle error for all testutil uses" This reverts commit bdabef230632dd184491c2dad63c7d3e74a3861b. Revert "Add back error handling" This reverts commit da7e3d2020cd906f45f452d4e441b566f2d5c8aa. * Change genesis state func to use testing.T * Merge branch 'master' of https://github.com/prysmaticlabs/Prysm into clean-testutil * Merge branch 'master' of https://github.com/prysmaticlabs/Prysm into clean-testutil * Fix conflict * Merge branch 'master' of https://github.com/prysmaticlabs/Prysm into clean-testutil * Merge branch 'master' into clean-testutil * Merge branch 'master' into clean-testutil * Captialize other logs * Merge branch 'clean-testutil' of https://github.com/0xKiwi/Prysm into clean-testutil * Merge branch 'master' of https://github.com/prysmaticlabs/Prysm into clean-testutil * Merge branch 'master' into clean-testutil
158 lines
4.3 KiB
Go
158 lines
4.3 KiB
Go
package endtoend
|
|
|
|
import (
|
|
"bufio"
|
|
"context"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"net/http"
|
|
"os"
|
|
"path"
|
|
"strconv"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/bazelbuild/rules_go/go/tools/bazel"
|
|
ptypes "github.com/gogo/protobuf/types"
|
|
"github.com/pkg/errors"
|
|
eth "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
|
|
"github.com/prysmaticlabs/prysm/shared/params"
|
|
"google.golang.org/grpc"
|
|
)
|
|
|
|
func runEndToEndTest(t *testing.T, config *end2EndConfig) {
|
|
tmpPath := bazel.TestTmpDir()
|
|
config.tmpPath = tmpPath
|
|
t.Logf("Test Path: %s\n", tmpPath)
|
|
|
|
contractAddr, keystorePath, eth1PID := startEth1(t, tmpPath)
|
|
config.contractAddr = contractAddr
|
|
beaconNodes := startBeaconNodes(t, config)
|
|
valClients := initializeValidators(t, config, keystorePath, beaconNodes)
|
|
processIDs := []int{eth1PID}
|
|
for _, vv := range valClients {
|
|
processIDs = append(processIDs, vv.processID)
|
|
}
|
|
for _, bb := range beaconNodes {
|
|
processIDs = append(processIDs, bb.processID)
|
|
}
|
|
defer logOutput(t, tmpPath)
|
|
defer killProcesses(t, processIDs)
|
|
|
|
if config.numBeaconNodes > 1 {
|
|
t.Run("all_peers_connect", func(t *testing.T) {
|
|
for _, bNode := range beaconNodes {
|
|
if err := peersConnect(bNode.monitorPort, config.numBeaconNodes-1); err != nil {
|
|
t.Fatalf("Failed to connect to peers: %v", err)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
beaconLogFile, err := os.Open(path.Join(tmpPath, "beacon-0.log"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if err := waitForTextInFile(beaconLogFile, "Sending genesis time notification"); err != nil {
|
|
t.Fatalf("failed to find genesis in logs, this means the chain did not start: %v", err)
|
|
}
|
|
conn, err := grpc.Dial("127.0.0.1:4000", grpc.WithInsecure())
|
|
if err != nil {
|
|
t.Fatalf("Failed to dial: %v", err)
|
|
}
|
|
beaconClient := eth.NewBeaconChainClient(conn)
|
|
nodeClient := eth.NewNodeClient(conn)
|
|
|
|
genesis, err := nodeClient.GetGenesis(context.Background(), &ptypes.Empty{})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
// Small offset so evaluators perform in the middle of an epoch.
|
|
epochSeconds := params.BeaconConfig().SecondsPerSlot * params.BeaconConfig().SlotsPerEpoch
|
|
genesisTime := time.Unix(genesis.GenesisTime.Seconds+int64(epochSeconds/2), 0)
|
|
currentEpoch := uint64(0)
|
|
ticker := GetEpochTicker(genesisTime, epochSeconds)
|
|
for c := range ticker.C() {
|
|
if c >= config.epochsToRun {
|
|
ticker.Done()
|
|
break
|
|
}
|
|
|
|
for _, evaluator := range config.evaluators {
|
|
// Only run if the policy says so.
|
|
if !evaluator.Policy(currentEpoch) {
|
|
continue
|
|
}
|
|
t.Run(fmt.Sprintf(evaluator.Name, currentEpoch), func(t *testing.T) {
|
|
if err := evaluator.Evaluation(beaconClient); err != nil {
|
|
t.Fatalf("evaluation failed for epoch %d: %v", currentEpoch, err)
|
|
}
|
|
})
|
|
}
|
|
currentEpoch++
|
|
}
|
|
|
|
if currentEpoch < config.epochsToRun {
|
|
t.Fatalf("Test ended prematurely, only reached epoch %d", currentEpoch)
|
|
}
|
|
}
|
|
|
|
func peersConnect(port uint64, expectedPeers uint64) error {
|
|
response, err := http.Get(fmt.Sprintf("http://127.0.0.1:%d/p2p", port))
|
|
if err != nil {
|
|
return errors.Wrap(err, "failed to reach p2p metrics page")
|
|
}
|
|
dataInBytes, err := ioutil.ReadAll(response.Body)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
pageContent := string(dataInBytes)
|
|
if err := response.Body.Close(); err != nil {
|
|
return err
|
|
}
|
|
// Subtracting by 2 here since the libp2p page has "3 peers" as text.
|
|
// With a starting index before the "p", going two characters back should give us
|
|
// the number we need.
|
|
startIdx := strings.Index(pageContent, "peers") - 2
|
|
if startIdx == -3 {
|
|
return fmt.Errorf("could not find needed text in %s", pageContent)
|
|
}
|
|
peerCount, err := strconv.Atoi(pageContent[startIdx : startIdx+1])
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if expectedPeers != uint64(peerCount) {
|
|
return fmt.Errorf("unexpected amount of peers, expected %d, received %d", expectedPeers, peerCount)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func killProcesses(t *testing.T, pIDs []int) {
|
|
for _, id := range pIDs {
|
|
process, err := os.FindProcess(id)
|
|
if err != nil {
|
|
t.Fatalf("Could not find process %d: %v", id, err)
|
|
}
|
|
if err := process.Kill(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
}
|
|
|
|
func logOutput(t *testing.T, tmpPath string) {
|
|
if t.Failed() {
|
|
beacon1LogFile, err := os.Open(path.Join(tmpPath, "beacon-1.log"))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
scanner := bufio.NewScanner(beacon1LogFile)
|
|
t.Log("Beacon chain node output:")
|
|
for scanner.Scan() {
|
|
currentLine := scanner.Text()
|
|
t.Log(currentLine)
|
|
}
|
|
t.Log("End of beacon chain node output")
|
|
}
|
|
}
|