mirror of
https://gitlab.com/pulsechaincom/prysm-pulse.git
synced 2025-01-15 06:28:20 +00:00
4ab0a91e51
* Begin adding DB to validator client Begin adding ValidatorProposalHistory Implement most of proposal history Finish tests Fix marking a proposal for the first time Change proposalhistory to not using bit shifting Add pb.go Change after proto/slashing added Finally fix protos Fix most tests Fix all tests for double proposal protection Start initialiing DB in validator client Add db to validator struct Add DB to ProposeBlock Fix test errors and begin mocking Fix test formatting and pass test for validator protection! Fix merge issues Fix renames Fix tests * Fix tests * Fix first startup on DB * Fix nil check tests * Fix E2E * Fix e2e flag * Fix comments * Fix for comments * Move proposal hepers to validator/client to keep DB clean * Add clear-db flag to validator client * Fix formatting * Clear out unintended changes * Fix build issues * Fix build issues * Gazelle * Fix mock test * Remove proposal history * Add terminal confirmation to DB clearing * Add interface for validatorDB, add context to DB functions * Add force-clear-db flag * Cleanup * Update validator/node/node.go Co-Authored-By: Raul Jordan <raul@prysmaticlabs.com> * Change db to clear file, not whole folder * Fix db test * Fix teardown test Co-authored-by: Raul Jordan <raul@prysmaticlabs.com>
175 lines
5.1 KiB
Go
175 lines
5.1 KiB
Go
package client
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"testing"
|
|
|
|
"github.com/golang/mock/gomock"
|
|
ethpb "github.com/prysmaticlabs/ethereumapis/eth/v1alpha1"
|
|
"github.com/prysmaticlabs/prysm/shared/testutil"
|
|
"github.com/prysmaticlabs/prysm/validator/db"
|
|
"github.com/prysmaticlabs/prysm/validator/internal"
|
|
logTest "github.com/sirupsen/logrus/hooks/test"
|
|
)
|
|
|
|
type mocks struct {
|
|
validatorClient *internal.MockBeaconNodeValidatorClient
|
|
aggregatorClient *internal.MockAggregatorServiceClient
|
|
}
|
|
|
|
func setup(t *testing.T) (*validator, *mocks, func()) {
|
|
valDB := db.SetupDB(t, [][48]byte{validatorPubKey})
|
|
ctrl := gomock.NewController(t)
|
|
m := &mocks{
|
|
validatorClient: internal.NewMockBeaconNodeValidatorClient(ctrl),
|
|
aggregatorClient: internal.NewMockAggregatorServiceClient(ctrl),
|
|
}
|
|
validator := &validator{
|
|
db: valDB,
|
|
validatorClient: m.validatorClient,
|
|
aggregatorClient: m.aggregatorClient,
|
|
keyManager: testKeyManager,
|
|
graffiti: []byte{},
|
|
attLogs: make(map[[32]byte]*attSubmitted),
|
|
}
|
|
|
|
return validator, m, ctrl.Finish
|
|
}
|
|
|
|
func TestProposeBlock_DoesNotProposeGenesisBlock(t *testing.T) {
|
|
hook := logTest.NewGlobal()
|
|
validator, _, finish := setup(t)
|
|
defer finish()
|
|
validator.ProposeBlock(context.Background(), 0, validatorPubKey)
|
|
|
|
testutil.AssertLogsContain(t, hook, "Assigned to genesis slot, skipping proposal")
|
|
}
|
|
|
|
func TestProposeBlock_DomainDataFailed(t *testing.T) {
|
|
hook := logTest.NewGlobal()
|
|
validator, m, finish := setup(t)
|
|
defer finish()
|
|
|
|
m.validatorClient.EXPECT().DomainData(
|
|
gomock.Any(), // ctx
|
|
gomock.Any(), // epoch
|
|
).Return(nil /*response*/, errors.New("uh oh"))
|
|
|
|
validator.ProposeBlock(context.Background(), 1, validatorPubKey)
|
|
testutil.AssertLogsContain(t, hook, "Failed to sign randao reveal")
|
|
}
|
|
|
|
func TestProposeBlock_RequestBlockFailed(t *testing.T) {
|
|
hook := logTest.NewGlobal()
|
|
validator, m, finish := setup(t)
|
|
defer finish()
|
|
|
|
m.validatorClient.EXPECT().DomainData(
|
|
gomock.Any(), // ctx
|
|
gomock.Any(), // epoch
|
|
).Return(ðpb.DomainResponse{}, nil /*err*/)
|
|
|
|
m.validatorClient.EXPECT().GetBlock(
|
|
gomock.Any(), // ctx
|
|
gomock.Any(), // block request
|
|
).Return(nil /*response*/, errors.New("uh oh"))
|
|
|
|
validator.ProposeBlock(context.Background(), 1, validatorPubKey)
|
|
testutil.AssertLogsContain(t, hook, "Failed to request block from beacon node")
|
|
}
|
|
|
|
func TestProposeBlock_ProposeBlockFailed(t *testing.T) {
|
|
hook := logTest.NewGlobal()
|
|
validator, m, finish := setup(t)
|
|
defer finish()
|
|
|
|
m.validatorClient.EXPECT().DomainData(
|
|
gomock.Any(), // ctx
|
|
gomock.Any(), //epoch
|
|
).Return(ðpb.DomainResponse{}, nil /*err*/)
|
|
|
|
m.validatorClient.EXPECT().GetBlock(
|
|
gomock.Any(), // ctx
|
|
gomock.Any(),
|
|
).Return(ðpb.BeaconBlock{Body: ðpb.BeaconBlockBody{}}, nil /*err*/)
|
|
|
|
m.validatorClient.EXPECT().DomainData(
|
|
gomock.Any(), // ctx
|
|
gomock.Any(), //epoch
|
|
).Return(ðpb.DomainResponse{}, nil /*err*/)
|
|
|
|
m.validatorClient.EXPECT().ProposeBlock(
|
|
gomock.Any(), // ctx
|
|
gomock.AssignableToTypeOf(ðpb.SignedBeaconBlock{}),
|
|
).Return(nil /*response*/, errors.New("uh oh"))
|
|
|
|
validator.ProposeBlock(context.Background(), 1, validatorPubKey)
|
|
testutil.AssertLogsContain(t, hook, "Failed to propose block")
|
|
}
|
|
|
|
func TestProposeBlock_BroadcastsBlock(t *testing.T) {
|
|
validator, m, finish := setup(t)
|
|
defer finish()
|
|
|
|
m.validatorClient.EXPECT().DomainData(
|
|
gomock.Any(), // ctx
|
|
gomock.Any(), //epoch
|
|
).Return(ðpb.DomainResponse{}, nil /*err*/)
|
|
|
|
m.validatorClient.EXPECT().GetBlock(
|
|
gomock.Any(), // ctx
|
|
gomock.Any(),
|
|
).Return(ðpb.BeaconBlock{Body: ðpb.BeaconBlockBody{}}, nil /*err*/)
|
|
|
|
m.validatorClient.EXPECT().DomainData(
|
|
gomock.Any(), // ctx
|
|
gomock.Any(), //epoch
|
|
).Return(ðpb.DomainResponse{}, nil /*err*/)
|
|
|
|
m.validatorClient.EXPECT().ProposeBlock(
|
|
gomock.Any(), // ctx
|
|
gomock.AssignableToTypeOf(ðpb.SignedBeaconBlock{}),
|
|
).Return(ðpb.ProposeResponse{}, nil /*error*/)
|
|
|
|
validator.ProposeBlock(context.Background(), 1, validatorPubKey)
|
|
}
|
|
|
|
func TestProposeBlock_BroadcastsBlock_WithGraffiti(t *testing.T) {
|
|
validator, m, finish := setup(t)
|
|
defer finish()
|
|
|
|
validator.graffiti = []byte("12345678901234567890123456789012")
|
|
|
|
m.validatorClient.EXPECT().DomainData(
|
|
gomock.Any(), // ctx
|
|
gomock.Any(), //epoch
|
|
).Return(ðpb.DomainResponse{}, nil /*err*/)
|
|
|
|
m.validatorClient.EXPECT().GetBlock(
|
|
gomock.Any(), // ctx
|
|
gomock.Any(),
|
|
).Return(ðpb.BeaconBlock{Body: ðpb.BeaconBlockBody{Graffiti: validator.graffiti}}, nil /*err*/)
|
|
|
|
m.validatorClient.EXPECT().DomainData(
|
|
gomock.Any(), // ctx
|
|
gomock.Any(), //epoch
|
|
).Return(ðpb.DomainResponse{}, nil /*err*/)
|
|
|
|
var sentBlock *ethpb.SignedBeaconBlock
|
|
|
|
m.validatorClient.EXPECT().ProposeBlock(
|
|
gomock.Any(), // ctx
|
|
gomock.AssignableToTypeOf(ðpb.SignedBeaconBlock{}),
|
|
).DoAndReturn(func(ctx context.Context, block *ethpb.SignedBeaconBlock) (*ethpb.ProposeResponse, error) {
|
|
sentBlock = block
|
|
return ðpb.ProposeResponse{}, nil
|
|
})
|
|
|
|
validator.ProposeBlock(context.Background(), 1, validatorPubKey)
|
|
|
|
if string(sentBlock.Block.Body.Graffiti) != string(validator.graffiti) {
|
|
t.Errorf("Block was broadcast with the wrong graffiti field, wanted \"%v\", got \"%v\"", string(validator.graffiti), string(sentBlock.Block.Body.Graffiti))
|
|
}
|
|
}
|