Compare commits

..

9 Commits

Author SHA1 Message Date
james-prysm
fd969afaeb changelog 2026-02-02 15:17:54 -06:00
james-prysm
0a582f4970 changing last host comparison to connection counter to avoid race conditions using the same host but an old connection 2026-02-02 15:09:38 -06:00
james-prysm
abdeaa981f gaz 2026-02-02 13:39:32 -06:00
james-prysm
f07f56ded8 Merge branch 'develop' into host-fallback-cleanup 2026-02-02 11:21:10 -08:00
james-prysm
2d9cef23e3 fixing duplicate log declared 2026-02-02 13:20:28 -06:00
james-prysm
7373332c72 missing failover log 2026-02-02 13:19:35 -06:00
james-prysm
44412f57a5 moving failover logic to own package and cleaning up validator client code duplication 2026-02-02 13:13:56 -06:00
james-prysm
3aa0e6145b renaming rest handler to just handler to not stutter 2026-02-02 10:27:54 -06:00
james-prysm
f1116ac175 manu's comments 2026-02-02 09:54:14 -06:00
85 changed files with 1149 additions and 901 deletions

19
api/failover/BUILD.bazel Normal file
View File

@@ -0,0 +1,19 @@
load("@prysm//tools/go:def.bzl", "go_library", "go_test")
go_library(
name = "go_default_library",
srcs = [
"failover.go",
"log.go",
],
importpath = "github.com/OffchainLabs/prysm/v7/api/failover",
visibility = ["//visibility:public"],
deps = ["@com_github_sirupsen_logrus//:go_default_library"],
)
go_test(
name = "go_default_test",
srcs = ["failover_test.go"],
embed = [":go_default_library"],
deps = ["//testing/assert:go_default_library"],
)

75
api/failover/failover.go Normal file
View File

@@ -0,0 +1,75 @@
package failover
import (
"context"
"github.com/sirupsen/logrus"
)
// HostProvider is the subset of connection-provider methods that EnsureReady
// needs. Both grpc.GrpcConnectionProvider and rest.RestConnectionProvider
// satisfy this interface.
type HostProvider interface {
Hosts() []string
CurrentHost() string
SwitchHost(index int) error
}
// ReadyChecker can report whether the current endpoint is ready.
// iface.NodeClient satisfies this implicitly.
type ReadyChecker interface {
IsReady(ctx context.Context) bool
}
// EnsureReady iterates through the configured hosts and returns true as soon as
// one responds as ready. It starts from the provider's current host and wraps
// around using modular arithmetic, performing failover when a host is not ready.
func EnsureReady(ctx context.Context, provider HostProvider, checker ReadyChecker) bool {
hosts := provider.Hosts()
numHosts := len(hosts)
startingHost := provider.CurrentHost()
var attemptedHosts []string
// Find current index
currentIdx := 0
for i, h := range hosts {
if h == startingHost {
currentIdx = i
break
}
}
for i := range numHosts {
if checker.IsReady(ctx) {
if len(attemptedHosts) > 0 {
log.WithFields(logrus.Fields{
"previousHost": startingHost,
"newHost": provider.CurrentHost(),
"failedAttempts": attemptedHosts,
}).Info("Failover succeeded: connected to healthy beacon node")
}
return true
}
log.WithField("host", provider.CurrentHost()).Debug("Beacon node not fully synced")
attemptedHosts = append(attemptedHosts, provider.CurrentHost())
// Try next host if not the last iteration
if i < numHosts-1 {
nextIdx := (currentIdx + i + 1) % numHosts
log.WithFields(logrus.Fields{
"currentHost": hosts[currentIdx],
"nextHost": hosts[nextIdx],
}).Warn("Beacon node is not responding, switching host")
if err := provider.SwitchHost(nextIdx); err != nil {
log.WithError(err).Error("Failed to switch host")
}
}
}
if numHosts == 1 {
log.WithField("host", provider.CurrentHost()).Warn("Beacon node is not fully synced, no backup node configured")
} else {
log.Warn("No fully synced beacon node found")
}
return false
}

View File

@@ -0,0 +1,94 @@
package failover
import (
"context"
"testing"
"github.com/OffchainLabs/prysm/v7/testing/assert"
)
// mockHostProvider is a minimal HostProvider for unit tests.
type mockHostProvider struct {
hosts []string
hostIndex int
}
func (m *mockHostProvider) Hosts() []string { return m.hosts }
func (m *mockHostProvider) CurrentHost() string {
return m.hosts[m.hostIndex%len(m.hosts)]
}
func (m *mockHostProvider) SwitchHost(index int) error { m.hostIndex = index; return nil }
// mockReadyChecker records per-call IsReady results in sequence.
type mockReadyChecker struct {
results []bool
idx int
}
func (m *mockReadyChecker) IsReady(_ context.Context) bool {
if m.idx >= len(m.results) {
return false
}
r := m.results[m.idx]
m.idx++
return r
}
func TestEnsureReady_SingleHostReady(t *testing.T) {
provider := &mockHostProvider{hosts: []string{"http://host1:3500"}, hostIndex: 0}
checker := &mockReadyChecker{results: []bool{true}}
assert.Equal(t, true, EnsureReady(t.Context(), provider, checker))
assert.Equal(t, 0, provider.hostIndex)
}
func TestEnsureReady_SingleHostNotReady(t *testing.T) {
provider := &mockHostProvider{hosts: []string{"http://host1:3500"}, hostIndex: 0}
checker := &mockReadyChecker{results: []bool{false}}
assert.Equal(t, false, EnsureReady(t.Context(), provider, checker))
}
func TestEnsureReady_SingleHostError(t *testing.T) {
provider := &mockHostProvider{hosts: []string{"http://host1:3500"}, hostIndex: 0}
checker := &mockReadyChecker{results: []bool{false}}
assert.Equal(t, false, EnsureReady(t.Context(), provider, checker))
}
func TestEnsureReady_MultipleHostsFirstReady(t *testing.T) {
provider := &mockHostProvider{
hosts: []string{"http://host1:3500", "http://host2:3500"},
hostIndex: 0,
}
checker := &mockReadyChecker{results: []bool{true}}
assert.Equal(t, true, EnsureReady(t.Context(), provider, checker))
assert.Equal(t, 0, provider.hostIndex)
}
func TestEnsureReady_MultipleHostsFailoverToSecond(t *testing.T) {
provider := &mockHostProvider{
hosts: []string{"http://host1:3500", "http://host2:3500"},
hostIndex: 0,
}
checker := &mockReadyChecker{results: []bool{false, true}}
assert.Equal(t, true, EnsureReady(t.Context(), provider, checker))
assert.Equal(t, 1, provider.hostIndex)
}
func TestEnsureReady_MultipleHostsNoneReady(t *testing.T) {
provider := &mockHostProvider{
hosts: []string{"http://host1:3500", "http://host2:3500", "http://host3:3500"},
hostIndex: 0,
}
checker := &mockReadyChecker{results: []bool{false, false, false}}
assert.Equal(t, false, EnsureReady(t.Context(), provider, checker))
}
func TestEnsureReady_WrapAroundFromNonZeroIndex(t *testing.T) {
provider := &mockHostProvider{
hosts: []string{"http://host0:3500", "http://host1:3500", "http://host2:3500"},
hostIndex: 1,
}
// host1 (start) fails, host2 fails, host0 succeeds
checker := &mockReadyChecker{results: []bool{false, false, true}}
assert.Equal(t, true, EnsureReady(t.Context(), provider, checker))
assert.Equal(t, 0, provider.hostIndex)
}

9
api/failover/log.go Normal file
View File

@@ -0,0 +1,9 @@
// Code generated by hack/gen-logs.sh; DO NOT EDIT.
// This file is created and regenerated automatically. Anything added here might get removed.
package failover
import "github.com/sirupsen/logrus"
// The prefix for logs from this package will be the text after the last slash in the package path.
// If you wish to change this, you should add your desired name in the runtime/logging/logrus-prefixed-formatter/prefix-replacement.go file.
var log = logrus.WithField("package", "api/failover")

View File

@@ -25,6 +25,11 @@ type GrpcConnectionProvider interface {
// SwitchHost switches to the endpoint at the given index. // SwitchHost switches to the endpoint at the given index.
// The new connection is created lazily on next CurrentConn() call. // The new connection is created lazily on next CurrentConn() call.
SwitchHost(index int) error SwitchHost(index int) error
// ConnectionCounter returns a monotonically increasing counter that increments
// each time SwitchHost changes the active endpoint. This allows consumers to
// detect connection changes even when the host string returns to a previous value
// (e.g., host0 → host1 → host0).
ConnectionCounter() uint64
// Close closes the current connection. // Close closes the current connection.
Close() Close()
} }
@@ -38,6 +43,7 @@ type grpcConnectionProvider struct {
// Current connection state (protected by mutex) // Current connection state (protected by mutex)
currentIndex uint64 currentIndex uint64
conn *grpc.ClientConn conn *grpc.ClientConn
connCounter uint64
mu sync.Mutex mu sync.Mutex
closed bool closed bool
@@ -138,6 +144,7 @@ func (p *grpcConnectionProvider) SwitchHost(index int) error {
p.conn = nil // Clear immediately - new connection created lazily p.conn = nil // Clear immediately - new connection created lazily
p.currentIndex = uint64(index) p.currentIndex = uint64(index)
p.connCounter++
// Close old connection asynchronously to avoid blocking the caller // Close old connection asynchronously to avoid blocking the caller
if oldConn != nil { if oldConn != nil {
@@ -155,6 +162,12 @@ func (p *grpcConnectionProvider) SwitchHost(index int) error {
return nil return nil
} }
func (p *grpcConnectionProvider) ConnectionCounter() uint64 {
p.mu.Lock()
defer p.mu.Unlock()
return p.connCounter
}
func (p *grpcConnectionProvider) Close() { func (p *grpcConnectionProvider) Close() {
p.mu.Lock() p.mu.Lock()
defer p.mu.Unlock() defer p.mu.Unlock()

View File

@@ -4,17 +4,24 @@ import "google.golang.org/grpc"
// MockGrpcProvider implements GrpcConnectionProvider for testing. // MockGrpcProvider implements GrpcConnectionProvider for testing.
type MockGrpcProvider struct { type MockGrpcProvider struct {
MockConn *grpc.ClientConn MockConn *grpc.ClientConn
MockHosts []string MockHosts []string
CurrentIndex int
ConnCounter uint64
} }
func (m *MockGrpcProvider) CurrentConn() *grpc.ClientConn { return m.MockConn } func (m *MockGrpcProvider) CurrentConn() *grpc.ClientConn { return m.MockConn }
func (m *MockGrpcProvider) CurrentHost() string { func (m *MockGrpcProvider) CurrentHost() string {
if len(m.MockHosts) > 0 { if len(m.MockHosts) > 0 {
return m.MockHosts[0] return m.MockHosts[m.CurrentIndex]
} }
return "" return ""
} }
func (m *MockGrpcProvider) Hosts() []string { return m.MockHosts } func (m *MockGrpcProvider) Hosts() []string { return m.MockHosts }
func (m *MockGrpcProvider) SwitchHost(int) error { return nil } func (m *MockGrpcProvider) SwitchHost(idx int) error {
func (m *MockGrpcProvider) Close() {} m.CurrentIndex = idx
m.ConnCounter++
return nil
}
func (m *MockGrpcProvider) ConnectionCounter() uint64 { return m.ConnCounter }
func (m *MockGrpcProvider) Close() {}

View File

@@ -9,13 +9,13 @@ import (
// MockRestProvider implements RestConnectionProvider for testing. // MockRestProvider implements RestConnectionProvider for testing.
type MockRestProvider struct { type MockRestProvider struct {
MockClient *http.Client MockClient *http.Client
MockHandler RestHandler MockHandler Handler
MockHosts []string MockHosts []string
HostIndex int HostIndex int
} }
func (m *MockRestProvider) HttpClient() *http.Client { return m.MockClient } func (m *MockRestProvider) HttpClient() *http.Client { return m.MockClient }
func (m *MockRestProvider) RestHandler() RestHandler { return m.MockHandler } func (m *MockRestProvider) Handler() Handler { return m.MockHandler }
func (m *MockRestProvider) CurrentHost() string { func (m *MockRestProvider) CurrentHost() string {
if len(m.MockHosts) > 0 { if len(m.MockHosts) > 0 {
return m.MockHosts[m.HostIndex%len(m.MockHosts)] return m.MockHosts[m.HostIndex%len(m.MockHosts)]
@@ -25,25 +25,22 @@ func (m *MockRestProvider) CurrentHost() string {
func (m *MockRestProvider) Hosts() []string { return m.MockHosts } func (m *MockRestProvider) Hosts() []string { return m.MockHosts }
func (m *MockRestProvider) SwitchHost(index int) error { m.HostIndex = index; return nil } func (m *MockRestProvider) SwitchHost(index int) error { m.HostIndex = index; return nil }
// MockRestHandler implements RestHandler for testing. // MockHandler implements Handler for testing.
type MockRestHandler struct { type MockHandler struct {
MockHost string MockHost string
MockClient *http.Client
} }
func (m *MockRestHandler) Get(_ context.Context, _ string, _ any) error { return nil } func (m *MockHandler) Get(_ context.Context, _ string, _ any) error { return nil }
func (m *MockRestHandler) GetStatusCode(_ context.Context, _ string) (int, error) { func (m *MockHandler) GetStatusCode(_ context.Context, _ string) (int, error) {
return http.StatusOK, nil return http.StatusOK, nil
} }
func (m *MockRestHandler) GetSSZ(_ context.Context, _ string) ([]byte, http.Header, error) { func (m *MockHandler) GetSSZ(_ context.Context, _ string) ([]byte, http.Header, error) {
return nil, nil, nil return nil, nil, nil
} }
func (m *MockRestHandler) Post(_ context.Context, _ string, _ map[string]string, _ *bytes.Buffer, _ any) error { func (m *MockHandler) Post(_ context.Context, _ string, _ map[string]string, _ *bytes.Buffer, _ any) error {
return nil return nil
} }
func (m *MockRestHandler) PostSSZ(_ context.Context, _ string, _ map[string]string, _ *bytes.Buffer) ([]byte, http.Header, error) { func (m *MockHandler) PostSSZ(_ context.Context, _ string, _ map[string]string, _ *bytes.Buffer) ([]byte, http.Header, error) {
return nil, nil, nil return nil, nil, nil
} }
func (m *MockRestHandler) HttpClient() *http.Client { return m.MockClient } func (m *MockHandler) Host() string { return m.MockHost }
func (m *MockRestHandler) Host() string { return m.MockHost }
func (m *MockRestHandler) SwitchHost(host string) { m.MockHost = host }

View File

@@ -17,8 +17,8 @@ import (
type RestConnectionProvider interface { type RestConnectionProvider interface {
// HttpClient returns the configured HTTP client with headers, timeout, and optional tracing. // HttpClient returns the configured HTTP client with headers, timeout, and optional tracing.
HttpClient() *http.Client HttpClient() *http.Client
// RestHandler returns the REST handler for making API requests. // Handler returns the REST handler for making API requests.
RestHandler() RestHandler Handler() Handler
// CurrentHost returns the current REST API endpoint URL. // CurrentHost returns the current REST API endpoint URL.
CurrentHost() string CurrentHost() string
// Hosts returns all configured REST API endpoint URLs. // Hosts returns all configured REST API endpoint URLs.
@@ -54,7 +54,7 @@ func WithTracing() RestConnectionProviderOption {
type restConnectionProvider struct { type restConnectionProvider struct {
endpoints []string endpoints []string
httpClient *http.Client httpClient *http.Client
restHandler RestHandler restHandler *handler
currentIndex atomic.Uint64 currentIndex atomic.Uint64
timeout time.Duration timeout time.Duration
headers map[string][]string headers map[string][]string
@@ -96,7 +96,7 @@ func NewRestConnectionProvider(endpoint string, opts ...RestConnectionProviderOp
} }
// Create the REST handler with the HTTP client and initial host // Create the REST handler with the HTTP client and initial host
p.restHandler = newRestHandler(*p.httpClient, endpoints[0]) p.restHandler = newHandler(*p.httpClient, endpoints[0])
log.WithFields(logrus.Fields{ log.WithFields(logrus.Fields{
"endpoints": endpoints, "endpoints": endpoints,
@@ -124,7 +124,7 @@ func (p *restConnectionProvider) HttpClient() *http.Client {
return p.httpClient return p.httpClient
} }
func (p *restConnectionProvider) RestHandler() RestHandler { func (p *restConnectionProvider) Handler() Handler {
return p.restHandler return p.restHandler
} }

View File

@@ -21,32 +21,35 @@ import (
type reqOption func(*http.Request) type reqOption func(*http.Request)
// RestHandler defines the interface for making REST API requests. // Handler defines the interface for making REST API requests.
type RestHandler interface { type Handler interface {
Get(ctx context.Context, endpoint string, resp any) error Get(ctx context.Context, endpoint string, resp any) error
GetStatusCode(ctx context.Context, endpoint string) (int, error) GetStatusCode(ctx context.Context, endpoint string) (int, error)
GetSSZ(ctx context.Context, endpoint string) ([]byte, http.Header, error) GetSSZ(ctx context.Context, endpoint string) ([]byte, http.Header, error)
Post(ctx context.Context, endpoint string, headers map[string]string, data *bytes.Buffer, resp any) error Post(ctx context.Context, endpoint string, headers map[string]string, data *bytes.Buffer, resp any) error
PostSSZ(ctx context.Context, endpoint string, headers map[string]string, data *bytes.Buffer) ([]byte, http.Header, error) PostSSZ(ctx context.Context, endpoint string, headers map[string]string, data *bytes.Buffer) ([]byte, http.Header, error)
HttpClient() *http.Client
Host() string Host() string
SwitchHost(host string)
} }
type restHandler struct { type handler struct {
client http.Client client http.Client
host string host string
reqOverrides []reqOption reqOverrides []reqOption
} }
// newRestHandler returns a RestHandler (internal use) // newHandler returns a *handler for internal use within the rest package.
func newRestHandler(client http.Client, host string) RestHandler { func newHandler(client http.Client, host string) *handler {
return NewRestHandler(client, host) rh := &handler{
client: client,
host: host,
}
rh.appendAcceptOverride()
return rh
} }
// NewRestHandler returns a RestHandler // NewHandler returns a Handler
func NewRestHandler(client http.Client, host string) RestHandler { func NewHandler(client http.Client, host string) Handler {
rh := &restHandler{ rh := &handler{
client: client, client: client,
host: host, host: host,
} }
@@ -57,7 +60,7 @@ func NewRestHandler(client http.Client, host string) RestHandler {
// appendAcceptOverride enables the Accept header to be customized at runtime via an environment variable. // appendAcceptOverride enables the Accept header to be customized at runtime via an environment variable.
// This is specified as an env var because it is a niche option that prysm may use for performance testing or debugging // This is specified as an env var because it is a niche option that prysm may use for performance testing or debugging
// bug which users are unlikely to need. Using an env var keeps the set of user-facing flags cleaner. // bug which users are unlikely to need. Using an env var keeps the set of user-facing flags cleaner.
func (c *restHandler) appendAcceptOverride() { func (c *handler) appendAcceptOverride() {
if accept := os.Getenv(params.EnvNameOverrideAccept); accept != "" { if accept := os.Getenv(params.EnvNameOverrideAccept); accept != "" {
c.reqOverrides = append(c.reqOverrides, func(req *http.Request) { c.reqOverrides = append(c.reqOverrides, func(req *http.Request) {
req.Header.Set("Accept", accept) req.Header.Set("Accept", accept)
@@ -66,18 +69,18 @@ func (c *restHandler) appendAcceptOverride() {
} }
// HttpClient returns the underlying HTTP client of the handler // HttpClient returns the underlying HTTP client of the handler
func (c *restHandler) HttpClient() *http.Client { func (c *handler) HttpClient() *http.Client {
return &c.client return &c.client
} }
// Host returns the underlying HTTP host // Host returns the underlying HTTP host
func (c *restHandler) Host() string { func (c *handler) Host() string {
return c.host return c.host
} }
// Get sends a GET request and decodes the response body as a JSON object into the passed in object. // Get sends a GET request and decodes the response body as a JSON object into the passed in object.
// If an HTTP error is returned, the body is decoded as a DefaultJsonError JSON object and returned as the first return value. // If an HTTP error is returned, the body is decoded as a DefaultJsonError JSON object and returned as the first return value.
func (c *restHandler) Get(ctx context.Context, endpoint string, resp any) error { func (c *handler) Get(ctx context.Context, endpoint string, resp any) error {
url := c.host + endpoint url := c.host + endpoint
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil { if err != nil {
@@ -100,7 +103,7 @@ func (c *restHandler) Get(ctx context.Context, endpoint string, resp any) error
// GetStatusCode sends a GET request and returns only the HTTP status code. // GetStatusCode sends a GET request and returns only the HTTP status code.
// This is useful for endpoints like /eth/v1/node/health that communicate status via HTTP codes // This is useful for endpoints like /eth/v1/node/health that communicate status via HTTP codes
// (200 = ready, 206 = syncing, 503 = unavailable) rather than response bodies. // (200 = ready, 206 = syncing, 503 = unavailable) rather than response bodies.
func (c *restHandler) GetStatusCode(ctx context.Context, endpoint string) (int, error) { func (c *handler) GetStatusCode(ctx context.Context, endpoint string) (int, error) {
url := c.host + endpoint url := c.host + endpoint
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil { if err != nil {
@@ -119,7 +122,7 @@ func (c *restHandler) GetStatusCode(ctx context.Context, endpoint string) (int,
return httpResp.StatusCode, nil return httpResp.StatusCode, nil
} }
func (c *restHandler) GetSSZ(ctx context.Context, endpoint string) ([]byte, http.Header, error) { func (c *handler) GetSSZ(ctx context.Context, endpoint string) ([]byte, http.Header, error) {
url := c.host + endpoint url := c.host + endpoint
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil) req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil { if err != nil {
@@ -174,7 +177,7 @@ func (c *restHandler) GetSSZ(ctx context.Context, endpoint string) ([]byte, http
// Post sends a POST request and decodes the response body as a JSON object into the passed in object. // Post sends a POST request and decodes the response body as a JSON object into the passed in object.
// If an HTTP error is returned, the body is decoded as a DefaultJsonError JSON object and returned as the first return value. // If an HTTP error is returned, the body is decoded as a DefaultJsonError JSON object and returned as the first return value.
func (c *restHandler) Post( func (c *handler) Post(
ctx context.Context, ctx context.Context,
apiEndpoint string, apiEndpoint string,
headers map[string]string, headers map[string]string,
@@ -210,7 +213,7 @@ func (c *restHandler) Post(
} }
// PostSSZ sends a POST request and prefers an SSZ (application/octet-stream) response body. // PostSSZ sends a POST request and prefers an SSZ (application/octet-stream) response body.
func (c *restHandler) PostSSZ( func (c *handler) PostSSZ(
ctx context.Context, ctx context.Context,
apiEndpoint string, apiEndpoint string,
headers map[string]string, headers map[string]string,
@@ -311,6 +314,6 @@ func decodeResp(httpResp *http.Response, resp any) error {
return nil return nil
} }
func (c *restHandler) SwitchHost(host string) { func (c *handler) SwitchHost(host string) {
c.host = host c.host = host
} }

View File

@@ -0,0 +1,11 @@
### Ignored
- moved finding healthy node logic to connection provider and other various cleanup on naming.
### Changed
- Improved node fallback logs.
### Fixed
- a potential race condition when switching hosts quickly and reconnecting to same host on an old connection.

View File

@@ -283,16 +283,18 @@ func (mr *MockValidatorClientMockRecorder) ProposeExit(ctx, in any) *gomock.Call
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ProposeExit", reflect.TypeOf((*MockValidatorClient)(nil).ProposeExit), ctx, in) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ProposeExit", reflect.TypeOf((*MockValidatorClient)(nil).ProposeExit), ctx, in)
} }
// SwitchHost mocks base method. // EnsureReady mocks base method.
func (m *MockValidatorClient) SwitchHost(host string) { func (m *MockValidatorClient) EnsureReady(ctx context.Context) bool {
m.ctrl.T.Helper() m.ctrl.T.Helper()
m.ctrl.Call(m, "SwitchHost", host) ret := m.ctrl.Call(m, "EnsureReady", ctx)
ret0, _ := ret[0].(bool)
return ret0
} }
// SwitchHost indicates an expected call of SwitchHost. // EnsureReady indicates an expected call of EnsureReady.
func (mr *MockValidatorClientMockRecorder) SwitchHost(host any) *gomock.Call { func (mr *MockValidatorClientMockRecorder) EnsureReady(ctx any) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SwitchHost", reflect.TypeOf((*MockValidatorClient)(nil).SwitchHost), host) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EnsureReady", reflect.TypeOf((*MockValidatorClient)(nil).EnsureReady), ctx)
} }
// StartEventStream mocks base method. // StartEventStream mocks base method.

View File

@@ -128,18 +128,18 @@ func (mr *MockValidatorMockRecorder) EventsChan() *gomock.Call {
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EventsChan", reflect.TypeOf((*MockValidator)(nil).EventsChan)) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EventsChan", reflect.TypeOf((*MockValidator)(nil).EventsChan))
} }
// FindHealthyHost mocks base method. // EnsureReady mocks base method.
func (m *MockValidator) FindHealthyHost(arg0 context.Context) bool { func (m *MockValidator) EnsureReady(arg0 context.Context) bool {
m.ctrl.T.Helper() m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "FindHealthyHost", arg0) ret := m.ctrl.Call(m, "EnsureReady", arg0)
ret0, _ := ret[0].(bool) ret0, _ := ret[0].(bool)
return ret0 return ret0
} }
// FindHealthyHost indicates an expected call of FindHealthyHost. // EnsureReady indicates an expected call of EnsureReady.
func (mr *MockValidatorMockRecorder) FindHealthyHost(arg0 any) *gomock.Call { func (mr *MockValidatorMockRecorder) EnsureReady(arg0 any) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "FindHealthyHost", reflect.TypeOf((*MockValidator)(nil).FindHealthyHost), arg0) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "EnsureReady", reflect.TypeOf((*MockValidator)(nil).EnsureReady), arg0)
} }
// GenesisTime mocks base method. // GenesisTime mocks base method.

View File

@@ -122,7 +122,6 @@ go_test(
embed = [":go_default_library"], embed = [":go_default_library"],
deps = [ deps = [
"//api/grpc:go_default_library", "//api/grpc:go_default_library",
"//api/rest:go_default_library",
"//api/server/structs:go_default_library", "//api/server/structs:go_default_library",
"//async/event:go_default_library", "//async/event:go_default_library",
"//beacon-chain/core/signing:go_default_library", "//beacon-chain/core/signing:go_default_library",

View File

@@ -42,6 +42,7 @@ go_library(
"//api:go_default_library", "//api:go_default_library",
"//api/apiutil:go_default_library", "//api/apiutil:go_default_library",
"//api/client/event:go_default_library", "//api/client/event:go_default_library",
"//api/failover:go_default_library",
"//api/rest:go_default_library", "//api/rest:go_default_library",
"//api/server/structs:go_default_library", "//api/server/structs:go_default_library",
"//beacon-chain/core/helpers:go_default_library", "//beacon-chain/core/helpers:go_default_library",

View File

@@ -26,7 +26,7 @@ func (c *beaconApiValidatorClient) attestationData(
query := apiutil.BuildURL("/eth/v1/validator/attestation_data", params) query := apiutil.BuildURL("/eth/v1/validator/attestation_data", params)
produceAttestationDataResponseJson := structs.GetAttestationDataResponse{} produceAttestationDataResponseJson := structs.GetAttestationDataResponse{}
if err := c.jsonRestHandler.Get(ctx, query, &produceAttestationDataResponseJson); err != nil { if err := c.handler.Get(ctx, query, &produceAttestationDataResponseJson); err != nil {
return nil, err return nil, err
} }

View File

@@ -28,10 +28,10 @@ func TestGetAttestationData_ValidAttestation(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
produceAttestationDataResponseJson := structs.GetAttestationDataResponse{} produceAttestationDataResponseJson := structs.GetAttestationDataResponse{}
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v1/validator/attestation_data?committee_index=%d&slot=%d", expectedCommitteeIndex, expectedSlot), fmt.Sprintf("/eth/v1/validator/attestation_data?committee_index=%d&slot=%d", expectedCommitteeIndex, expectedSlot),
&produceAttestationDataResponseJson, &produceAttestationDataResponseJson,
@@ -56,7 +56,7 @@ func TestGetAttestationData_ValidAttestation(t *testing.T) {
}, },
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
resp, err := validatorClient.attestationData(ctx, primitives.Slot(expectedSlot), primitives.CommitteeIndex(expectedCommitteeIndex)) resp, err := validatorClient.attestationData(ctx, primitives.Slot(expectedSlot), primitives.CommitteeIndex(expectedCommitteeIndex))
assert.NoError(t, err) assert.NoError(t, err)
@@ -180,8 +180,8 @@ func TestGetAttestationData_InvalidData(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
produceAttestationDataResponseJson := structs.GetAttestationDataResponse{} produceAttestationDataResponseJson := structs.GetAttestationDataResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/validator/attestation_data?committee_index=2&slot=1", "/eth/v1/validator/attestation_data?committee_index=2&slot=1",
&produceAttestationDataResponseJson, &produceAttestationDataResponseJson,
@@ -192,7 +192,7 @@ func TestGetAttestationData_InvalidData(t *testing.T) {
testCase.generateData(), testCase.generateData(),
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
_, err := validatorClient.attestationData(ctx, 1, 2) _, err := validatorClient.attestationData(ctx, 1, 2)
assert.ErrorContains(t, testCase.expectedErrorMessage, err) assert.ErrorContains(t, testCase.expectedErrorMessage, err)
}) })
@@ -208,9 +208,9 @@ func TestGetAttestationData_JsonResponseError(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
produceAttestationDataResponseJson := structs.GetAttestationDataResponse{} produceAttestationDataResponseJson := structs.GetAttestationDataResponse{}
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v1/validator/attestation_data?committee_index=%d&slot=%d", committeeIndex, slot), fmt.Sprintf("/eth/v1/validator/attestation_data?committee_index=%d&slot=%d", committeeIndex, slot),
&produceAttestationDataResponseJson, &produceAttestationDataResponseJson,
@@ -218,7 +218,7 @@ func TestGetAttestationData_JsonResponseError(t *testing.T) {
errors.New("some specific json response error"), errors.New("some specific json response error"),
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
_, err := validatorClient.attestationData(ctx, slot, committeeIndex) _, err := validatorClient.attestationData(ctx, slot, committeeIndex)
assert.ErrorContains(t, "some specific json response error", err) assert.ErrorContains(t, "some specific json response error", err)
} }

View File

@@ -18,13 +18,13 @@ import (
type beaconApiChainClient struct { type beaconApiChainClient struct {
fallbackClient iface.ChainClient fallbackClient iface.ChainClient
jsonRestHandler rest.RestHandler handler rest.Handler
stateValidatorsProvider StateValidatorsProvider stateValidatorsProvider StateValidatorsProvider
} }
func (c beaconApiChainClient) headBlockHeaders(ctx context.Context) (*structs.GetBlockHeaderResponse, error) { func (c beaconApiChainClient) headBlockHeaders(ctx context.Context) (*structs.GetBlockHeaderResponse, error) {
blockHeader := structs.GetBlockHeaderResponse{} blockHeader := structs.GetBlockHeaderResponse{}
err := c.jsonRestHandler.Get(ctx, "/eth/v1/beacon/headers/head", &blockHeader) err := c.handler.Get(ctx, "/eth/v1/beacon/headers/head", &blockHeader)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -44,7 +44,7 @@ func (c beaconApiChainClient) ChainHead(ctx context.Context, _ *empty.Empty) (*e
const endpoint = "/eth/v1/beacon/states/head/finality_checkpoints" const endpoint = "/eth/v1/beacon/states/head/finality_checkpoints"
finalityCheckpoints := structs.GetFinalityCheckpointsResponse{} finalityCheckpoints := structs.GetFinalityCheckpointsResponse{}
if err := c.jsonRestHandler.Get(ctx, endpoint, &finalityCheckpoints); err != nil { if err := c.handler.Get(ctx, endpoint, &finalityCheckpoints); err != nil {
return nil, err return nil, err
} }
@@ -328,10 +328,10 @@ func (c beaconApiChainClient) ValidatorParticipation(ctx context.Context, in *et
return nil, errors.New("beaconApiChainClient.ValidatorParticipation is not implemented. To use a fallback client, pass a fallback client as the last argument of NewBeaconApiChainClientWithFallback.") return nil, errors.New("beaconApiChainClient.ValidatorParticipation is not implemented. To use a fallback client, pass a fallback client as the last argument of NewBeaconApiChainClientWithFallback.")
} }
func NewBeaconApiChainClientWithFallback(jsonRestHandler rest.RestHandler, fallbackClient iface.ChainClient) iface.ChainClient { func NewBeaconApiChainClientWithFallback(handler rest.Handler, fallbackClient iface.ChainClient) iface.ChainClient {
return &beaconApiChainClient{ return &beaconApiChainClient{
jsonRestHandler: jsonRestHandler, handler: handler,
fallbackClient: fallbackClient, fallbackClient: fallbackClient,
stateValidatorsProvider: beaconApiStateValidatorsProvider{jsonRestHandler: jsonRestHandler}, stateValidatorsProvider: beaconApiStateValidatorsProvider{handler: handler},
} }
} }

View File

@@ -115,12 +115,12 @@ func TestListValidators(t *testing.T) {
nil, nil,
) )
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(gomock.Any(), blockHeaderEndpoint, gomock.Any()).Return(errors.New("bar error")) handler.EXPECT().Get(gomock.Any(), blockHeaderEndpoint, gomock.Any()).Return(errors.New("bar error"))
beaconChainClient := beaconApiChainClient{ beaconChainClient := beaconApiChainClient{
stateValidatorsProvider: stateValidatorsProvider, stateValidatorsProvider: stateValidatorsProvider,
jsonRestHandler: jsonRestHandler, handler: handler,
} }
_, err := beaconChainClient.Validators(ctx, &ethpb.ListValidatorsRequest{ _, err := beaconChainClient.Validators(ctx, &ethpb.ListValidatorsRequest{
QueryFilter: nil, QueryFilter: nil,
@@ -188,8 +188,8 @@ func TestListValidators(t *testing.T) {
nil, nil,
) )
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(gomock.Any(), blockHeaderEndpoint, gomock.Any()).Return( handler.EXPECT().Get(gomock.Any(), blockHeaderEndpoint, gomock.Any()).Return(
nil, nil,
).SetArg( ).SetArg(
2, 2,
@@ -198,7 +198,7 @@ func TestListValidators(t *testing.T) {
beaconChainClient := beaconApiChainClient{ beaconChainClient := beaconApiChainClient{
stateValidatorsProvider: stateValidatorsProvider, stateValidatorsProvider: stateValidatorsProvider,
jsonRestHandler: jsonRestHandler, handler: handler,
} }
_, err := beaconChainClient.Validators(ctx, &ethpb.ListValidatorsRequest{ _, err := beaconChainClient.Validators(ctx, &ethpb.ListValidatorsRequest{
QueryFilter: nil, QueryFilter: nil,
@@ -740,15 +740,15 @@ func TestGetChainHead(t *testing.T) {
ctx := t.Context() ctx := t.Context()
finalityCheckpointsResponse := structs.GetFinalityCheckpointsResponse{} finalityCheckpointsResponse := structs.GetFinalityCheckpointsResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get(gomock.Any(), finalityCheckpointsEndpoint, &finalityCheckpointsResponse).Return( handler.EXPECT().Get(gomock.Any(), finalityCheckpointsEndpoint, &finalityCheckpointsResponse).Return(
testCase.finalityCheckpointsError, testCase.finalityCheckpointsError,
).SetArg( ).SetArg(
2, 2,
testCase.generateFinalityCheckpointsResponse(), testCase.generateFinalityCheckpointsResponse(),
) )
beaconChainClient := beaconApiChainClient{jsonRestHandler: jsonRestHandler} beaconChainClient := beaconApiChainClient{handler: handler}
_, err := beaconChainClient.ChainHead(ctx, &emptypb.Empty{}) _, err := beaconChainClient.ChainHead(ctx, &emptypb.Empty{})
assert.ErrorContains(t, testCase.expectedError, err) assert.ErrorContains(t, testCase.expectedError, err)
}) })
@@ -837,10 +837,10 @@ func TestGetChainHead(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
finalityCheckpointsResponse := structs.GetFinalityCheckpointsResponse{} finalityCheckpointsResponse := structs.GetFinalityCheckpointsResponse{}
jsonRestHandler.EXPECT().Get(gomock.Any(), finalityCheckpointsEndpoint, &finalityCheckpointsResponse).Return( handler.EXPECT().Get(gomock.Any(), finalityCheckpointsEndpoint, &finalityCheckpointsResponse).Return(
nil, nil,
).SetArg( ).SetArg(
2, 2,
@@ -848,14 +848,14 @@ func TestGetChainHead(t *testing.T) {
) )
headBlockHeadersResponse := structs.GetBlockHeaderResponse{} headBlockHeadersResponse := structs.GetBlockHeaderResponse{}
jsonRestHandler.EXPECT().Get(gomock.Any(), headBlockHeadersEndpoint, &headBlockHeadersResponse).Return( handler.EXPECT().Get(gomock.Any(), headBlockHeadersEndpoint, &headBlockHeadersResponse).Return(
testCase.headBlockHeadersError, testCase.headBlockHeadersError,
).SetArg( ).SetArg(
2, 2,
testCase.generateHeadBlockHeadersResponse(), testCase.generateHeadBlockHeadersResponse(),
) )
beaconChainClient := beaconApiChainClient{jsonRestHandler: jsonRestHandler} beaconChainClient := beaconApiChainClient{handler: handler}
_, err := beaconChainClient.ChainHead(ctx, &emptypb.Empty{}) _, err := beaconChainClient.ChainHead(ctx, &emptypb.Empty{})
assert.ErrorContains(t, testCase.expectedError, err) assert.ErrorContains(t, testCase.expectedError, err)
}) })
@@ -867,10 +867,10 @@ func TestGetChainHead(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
finalityCheckpointsResponse := structs.GetFinalityCheckpointsResponse{} finalityCheckpointsResponse := structs.GetFinalityCheckpointsResponse{}
jsonRestHandler.EXPECT().Get(gomock.Any(), finalityCheckpointsEndpoint, &finalityCheckpointsResponse).Return( handler.EXPECT().Get(gomock.Any(), finalityCheckpointsEndpoint, &finalityCheckpointsResponse).Return(
nil, nil,
).SetArg( ).SetArg(
2, 2,
@@ -878,7 +878,7 @@ func TestGetChainHead(t *testing.T) {
) )
headBlockHeadersResponse := structs.GetBlockHeaderResponse{} headBlockHeadersResponse := structs.GetBlockHeaderResponse{}
jsonRestHandler.EXPECT().Get(gomock.Any(), headBlockHeadersEndpoint, &headBlockHeadersResponse).Return( handler.EXPECT().Get(gomock.Any(), headBlockHeadersEndpoint, &headBlockHeadersResponse).Return(
nil, nil,
).SetArg( ).SetArg(
2, 2,
@@ -909,7 +909,7 @@ func TestGetChainHead(t *testing.T) {
HeadEpoch: slots.ToEpoch(8), HeadEpoch: slots.ToEpoch(8),
} }
beaconChainClient := beaconApiChainClient{jsonRestHandler: jsonRestHandler} beaconChainClient := beaconApiChainClient{handler: handler}
chainHead, err := beaconChainClient.ChainHead(ctx, &emptypb.Empty{}) chainHead, err := beaconChainClient.ChainHead(ctx, &emptypb.Empty{})
require.NoError(t, err) require.NoError(t, err)
assert.DeepEqual(t, expectedChainHead, chainHead) assert.DeepEqual(t, expectedChainHead, chainHead)

View File

@@ -29,7 +29,7 @@ func (c *beaconApiValidatorClient) fork(ctx context.Context) (*structs.GetStateF
stateForkResponseJson := &structs.GetStateForkResponse{} stateForkResponseJson := &structs.GetStateForkResponse{}
if err := c.jsonRestHandler.Get(ctx, endpoint, stateForkResponseJson); err != nil { if err := c.handler.Get(ctx, endpoint, stateForkResponseJson); err != nil {
return nil, err return nil, err
} }
@@ -41,7 +41,7 @@ func (c *beaconApiValidatorClient) headers(ctx context.Context) (*structs.GetBlo
blockHeadersResponseJson := &structs.GetBlockHeadersResponse{} blockHeadersResponseJson := &structs.GetBlockHeadersResponse{}
if err := c.jsonRestHandler.Get(ctx, endpoint, blockHeadersResponseJson); err != nil { if err := c.handler.Get(ctx, endpoint, blockHeadersResponseJson); err != nil {
return nil, err return nil, err
} }
@@ -59,7 +59,7 @@ func (c *beaconApiValidatorClient) liveness(ctx context.Context, epoch primitive
return nil, errors.Wrapf(err, "failed to marshal validator indexes") return nil, errors.Wrapf(err, "failed to marshal validator indexes")
} }
if err = c.jsonRestHandler.Post(ctx, url, nil, bytes.NewBuffer(marshalledJsonValidatorIndexes), livenessResponseJson); err != nil { if err = c.handler.Post(ctx, url, nil, bytes.NewBuffer(marshalledJsonValidatorIndexes), livenessResponseJson); err != nil {
return nil, err return nil, err
} }
@@ -71,7 +71,7 @@ func (c *beaconApiValidatorClient) syncing(ctx context.Context) (*structs.SyncSt
syncingResponseJson := &structs.SyncStatusResponse{} syncingResponseJson := &structs.SyncStatusResponse{}
if err := c.jsonRestHandler.Get(ctx, endpoint, syncingResponseJson); err != nil { if err := c.handler.Get(ctx, endpoint, syncingResponseJson); err != nil {
return nil, err return nil, err
} }

View File

@@ -20,7 +20,7 @@ func TestGetFork_Nominal(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
stateForkResponseJson := structs.GetStateForkResponse{} stateForkResponseJson := structs.GetStateForkResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
expected := structs.GetStateForkResponse{ expected := structs.GetStateForkResponse{
Data: &structs.Fork{ Data: &structs.Fork{
@@ -32,7 +32,7 @@ func TestGetFork_Nominal(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
forkEndpoint, forkEndpoint,
&stateForkResponseJson, &stateForkResponseJson,
@@ -44,7 +44,7 @@ func TestGetFork_Nominal(t *testing.T) {
).Times(1) ).Times(1)
validatorClient := beaconApiValidatorClient{ validatorClient := beaconApiValidatorClient{
jsonRestHandler: jsonRestHandler, handler: handler,
} }
fork, err := validatorClient.fork(ctx) fork, err := validatorClient.fork(ctx)
@@ -56,11 +56,11 @@ func TestGetFork_Invalid(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
ctx := t.Context() ctx := t.Context()
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
forkEndpoint, forkEndpoint,
gomock.Any(), gomock.Any(),
@@ -69,7 +69,7 @@ func TestGetFork_Invalid(t *testing.T) {
).Times(1) ).Times(1)
validatorClient := beaconApiValidatorClient{ validatorClient := beaconApiValidatorClient{
jsonRestHandler: jsonRestHandler, handler: handler,
} }
_, err := validatorClient.fork(ctx) _, err := validatorClient.fork(ctx)
@@ -83,7 +83,7 @@ func TestGetHeaders_Nominal(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
blockHeadersResponseJson := structs.GetBlockHeadersResponse{} blockHeadersResponseJson := structs.GetBlockHeadersResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
expected := structs.GetBlockHeadersResponse{ expected := structs.GetBlockHeadersResponse{
Data: []*structs.SignedBeaconBlockHeaderContainer{ Data: []*structs.SignedBeaconBlockHeaderContainer{
@@ -99,7 +99,7 @@ func TestGetHeaders_Nominal(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
headersEndpoint, headersEndpoint,
&blockHeadersResponseJson, &blockHeadersResponseJson,
@@ -111,7 +111,7 @@ func TestGetHeaders_Nominal(t *testing.T) {
).Times(1) ).Times(1)
validatorClient := beaconApiValidatorClient{ validatorClient := beaconApiValidatorClient{
jsonRestHandler: jsonRestHandler, handler: handler,
} }
headers, err := validatorClient.headers(ctx) headers, err := validatorClient.headers(ctx)
@@ -123,11 +123,11 @@ func TestGetHeaders_Invalid(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
ctx := t.Context() ctx := t.Context()
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
headersEndpoint, headersEndpoint,
gomock.Any(), gomock.Any(),
@@ -136,7 +136,7 @@ func TestGetHeaders_Invalid(t *testing.T) {
).Times(1) ).Times(1)
validatorClient := beaconApiValidatorClient{ validatorClient := beaconApiValidatorClient{
jsonRestHandler: jsonRestHandler, handler: handler,
} }
_, err := validatorClient.headers(ctx) _, err := validatorClient.headers(ctx)
@@ -170,8 +170,8 @@ func TestGetLiveness_Nominal(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
livenessEndpoint, livenessEndpoint,
nil, nil,
@@ -184,7 +184,7 @@ func TestGetLiveness_Nominal(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
liveness, err := validatorClient.liveness(ctx, 42, indexes) liveness, err := validatorClient.liveness(ctx, 42, indexes)
require.NoError(t, err) require.NoError(t, err)
@@ -197,8 +197,8 @@ func TestGetLiveness_Invalid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
livenessEndpoint, livenessEndpoint,
nil, nil,
@@ -208,7 +208,7 @@ func TestGetLiveness_Invalid(t *testing.T) {
errors.New("custom error"), errors.New("custom error"),
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
_, err := validatorClient.liveness(ctx, 42, nil) _, err := validatorClient.liveness(ctx, 42, nil)
require.ErrorContains(t, "custom error", err) require.ErrorContains(t, "custom error", err)
@@ -237,7 +237,7 @@ func TestGetIsSyncing_Nominal(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
syncingResponseJson := structs.SyncStatusResponse{} syncingResponseJson := structs.SyncStatusResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
expected := structs.SyncStatusResponse{ expected := structs.SyncStatusResponse{
Data: &structs.SyncStatusResponseData{ Data: &structs.SyncStatusResponseData{
@@ -247,7 +247,7 @@ func TestGetIsSyncing_Nominal(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
syncingEndpoint, syncingEndpoint,
&syncingResponseJson, &syncingResponseJson,
@@ -259,7 +259,7 @@ func TestGetIsSyncing_Nominal(t *testing.T) {
).Times(1) ).Times(1)
validatorClient := beaconApiValidatorClient{ validatorClient := beaconApiValidatorClient{
jsonRestHandler: jsonRestHandler, handler: handler,
} }
isSyncing, err := validatorClient.isSyncing(ctx) isSyncing, err := validatorClient.isSyncing(ctx)
@@ -274,11 +274,11 @@ func TestGetIsSyncing_Invalid(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
syncingResponseJson := structs.SyncStatusResponse{} syncingResponseJson := structs.SyncStatusResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
ctx := t.Context() ctx := t.Context()
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
syncingEndpoint, syncingEndpoint,
&syncingResponseJson, &syncingResponseJson,
@@ -287,7 +287,7 @@ func TestGetIsSyncing_Invalid(t *testing.T) {
).Times(1) ).Times(1)
validatorClient := beaconApiValidatorClient{ validatorClient := beaconApiValidatorClient{
jsonRestHandler: jsonRestHandler, handler: handler,
} }
isSyncing, err := validatorClient.isSyncing(ctx) isSyncing, err := validatorClient.isSyncing(ctx)

View File

@@ -21,13 +21,13 @@ var (
type beaconApiNodeClient struct { type beaconApiNodeClient struct {
fallbackClient iface.NodeClient fallbackClient iface.NodeClient
jsonRestHandler rest.RestHandler handler rest.Handler
genesisProvider GenesisProvider genesisProvider GenesisProvider
} }
func (c *beaconApiNodeClient) SyncStatus(ctx context.Context, _ *empty.Empty) (*ethpb.SyncStatus, error) { func (c *beaconApiNodeClient) SyncStatus(ctx context.Context, _ *empty.Empty) (*ethpb.SyncStatus, error) {
syncingResponse := structs.SyncStatusResponse{} syncingResponse := structs.SyncStatusResponse{}
if err := c.jsonRestHandler.Get(ctx, "/eth/v1/node/syncing", &syncingResponse); err != nil { if err := c.handler.Get(ctx, "/eth/v1/node/syncing", &syncingResponse); err != nil {
return nil, err return nil, err
} }
@@ -57,7 +57,7 @@ func (c *beaconApiNodeClient) Genesis(ctx context.Context, _ *empty.Empty) (*eth
} }
depositContractJson := structs.GetDepositContractResponse{} depositContractJson := structs.GetDepositContractResponse{}
if err = c.jsonRestHandler.Get(ctx, "/eth/v1/config/deposit_contract", &depositContractJson); err != nil { if err = c.handler.Get(ctx, "/eth/v1/config/deposit_contract", &depositContractJson); err != nil {
return nil, err return nil, err
} }
@@ -81,7 +81,7 @@ func (c *beaconApiNodeClient) Genesis(ctx context.Context, _ *empty.Empty) (*eth
func (c *beaconApiNodeClient) Version(ctx context.Context, _ *empty.Empty) (*ethpb.Version, error) { func (c *beaconApiNodeClient) Version(ctx context.Context, _ *empty.Empty) (*ethpb.Version, error) {
var versionResponse structs.GetVersionResponse var versionResponse structs.GetVersionResponse
if err := c.jsonRestHandler.Get(ctx, "/eth/v1/node/version", &versionResponse); err != nil { if err := c.handler.Get(ctx, "/eth/v1/node/version", &versionResponse); err != nil {
return nil, err return nil, err
} }
@@ -106,9 +106,9 @@ func (c *beaconApiNodeClient) Peers(ctx context.Context, in *empty.Empty) (*ethp
// IsReady returns true only if the node is fully synced (200 OK). // IsReady returns true only if the node is fully synced (200 OK).
// A 206 Partial Content response indicates the node is syncing and not ready. // A 206 Partial Content response indicates the node is syncing and not ready.
func (c *beaconApiNodeClient) IsReady(ctx context.Context) bool { func (c *beaconApiNodeClient) IsReady(ctx context.Context) bool {
statusCode, err := c.jsonRestHandler.GetStatusCode(ctx, "/eth/v1/node/health") statusCode, err := c.handler.GetStatusCode(ctx, "/eth/v1/node/health")
if err != nil { if err != nil {
log.WithError(err).Error("failed to get health of node") log.WithError(err).WithField("beaconNodeUrl", c.handler.Host()).Error("failed to get health of node")
return false return false
} }
// Only 200 OK means the node is fully synced and ready. // Only 200 OK means the node is fully synced and ready.
@@ -116,11 +116,11 @@ func (c *beaconApiNodeClient) IsReady(ctx context.Context) bool {
return statusCode == http.StatusOK return statusCode == http.StatusOK
} }
func NewNodeClientWithFallback(jsonRestHandler rest.RestHandler, fallbackClient iface.NodeClient) iface.NodeClient { func NewNodeClientWithFallback(handler rest.Handler, fallbackClient iface.NodeClient) iface.NodeClient {
b := &beaconApiNodeClient{ b := &beaconApiNodeClient{
jsonRestHandler: jsonRestHandler, handler: handler,
fallbackClient: fallbackClient, fallbackClient: fallbackClient,
genesisProvider: &beaconApiGenesisProvider{jsonRestHandler: jsonRestHandler}, genesisProvider: &beaconApiGenesisProvider{handler: handler},
} }
return b return b
} }

View File

@@ -120,10 +120,10 @@ func TestGetGenesis(t *testing.T) {
) )
depositContractJson := structs.GetDepositContractResponse{} depositContractJson := structs.GetDepositContractResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
if testCase.queriesDepositContract { if testCase.queriesDepositContract {
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/config/deposit_contract", "/eth/v1/config/deposit_contract",
&depositContractJson, &depositContractJson,
@@ -137,7 +137,7 @@ func TestGetGenesis(t *testing.T) {
nodeClient := &beaconApiNodeClient{ nodeClient := &beaconApiNodeClient{
genesisProvider: genesisProvider, genesisProvider: genesisProvider,
jsonRestHandler: jsonRestHandler, handler: handler,
} }
response, err := nodeClient.Genesis(ctx, &emptypb.Empty{}) response, err := nodeClient.Genesis(ctx, &emptypb.Empty{})
@@ -201,8 +201,8 @@ func TestGetSyncStatus(t *testing.T) {
ctx := t.Context() ctx := t.Context()
syncingResponse := structs.SyncStatusResponse{} syncingResponse := structs.SyncStatusResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
syncingEndpoint, syncingEndpoint,
&syncingResponse, &syncingResponse,
@@ -213,7 +213,7 @@ func TestGetSyncStatus(t *testing.T) {
testCase.restEndpointResponse, testCase.restEndpointResponse,
) )
nodeClient := &beaconApiNodeClient{jsonRestHandler: jsonRestHandler} nodeClient := &beaconApiNodeClient{handler: handler}
syncStatus, err := nodeClient.SyncStatus(ctx, &emptypb.Empty{}) syncStatus, err := nodeClient.SyncStatus(ctx, &emptypb.Empty{})
if testCase.expectedResponse == nil { if testCase.expectedResponse == nil {
@@ -265,8 +265,8 @@ func TestGetVersion(t *testing.T) {
ctx := t.Context() ctx := t.Context()
var versionResponse structs.GetVersionResponse var versionResponse structs.GetVersionResponse
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
versionEndpoint, versionEndpoint,
&versionResponse, &versionResponse,
@@ -277,7 +277,7 @@ func TestGetVersion(t *testing.T) {
testCase.restEndpointResponse, testCase.restEndpointResponse,
) )
nodeClient := &beaconApiNodeClient{jsonRestHandler: jsonRestHandler} nodeClient := &beaconApiNodeClient{handler: handler}
version, err := nodeClient.Version(ctx, &emptypb.Empty{}) version, err := nodeClient.Version(ctx, &emptypb.Empty{})
if testCase.expectedResponse == nil { if testCase.expectedResponse == nil {
@@ -331,13 +331,14 @@ func TestIsReady(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetStatusCode( handler.EXPECT().GetStatusCode(
gomock.Any(), gomock.Any(),
healthEndpoint, healthEndpoint,
).Return(tc.statusCode, tc.err) ).Return(tc.statusCode, tc.err)
handler.EXPECT().Host().Return("http://localhost:3500").AnyTimes()
nodeClient := &beaconApiNodeClient{jsonRestHandler: jsonRestHandler} nodeClient := &beaconApiNodeClient{handler: handler}
result := nodeClient.IsReady(ctx) result := nodeClient.IsReady(ctx)
assert.Equal(t, tc.expectedResult, result) assert.Equal(t, tc.expectedResult, result)

View File

@@ -6,6 +6,7 @@ import (
"time" "time"
"github.com/OffchainLabs/prysm/v7/api/client/event" "github.com/OffchainLabs/prysm/v7/api/client/event"
"github.com/OffchainLabs/prysm/v7/api/failover"
"github.com/OffchainLabs/prysm/v7/api/rest" "github.com/OffchainLabs/prysm/v7/api/rest"
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives" "github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
"github.com/OffchainLabs/prysm/v7/encoding/bytesutil" "github.com/OffchainLabs/prysm/v7/encoding/bytesutil"
@@ -23,22 +24,28 @@ type beaconApiValidatorClient struct {
genesisProvider GenesisProvider genesisProvider GenesisProvider
dutiesProvider dutiesProvider dutiesProvider dutiesProvider
stateValidatorsProvider StateValidatorsProvider stateValidatorsProvider StateValidatorsProvider
jsonRestHandler rest.RestHandler restProvider rest.RestConnectionProvider
handler rest.Handler
nodeClient *beaconApiNodeClient
beaconBlockConverter BeaconBlockConverter beaconBlockConverter BeaconBlockConverter
prysmChainClient iface.PrysmChainClient prysmChainClient iface.PrysmChainClient
isEventStreamRunning bool isEventStreamRunning bool
} }
func NewBeaconApiValidatorClient(jsonRestHandler rest.RestHandler, opts ...ValidatorClientOpt) iface.ValidatorClient { func NewBeaconApiValidatorClient(provider rest.RestConnectionProvider, opts ...ValidatorClientOpt) iface.ValidatorClient {
handler := provider.Handler()
nc := &beaconApiNodeClient{handler: handler}
c := &beaconApiValidatorClient{ c := &beaconApiValidatorClient{
genesisProvider: &beaconApiGenesisProvider{jsonRestHandler: jsonRestHandler}, genesisProvider: &beaconApiGenesisProvider{handler: handler},
dutiesProvider: beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler}, dutiesProvider: beaconApiDutiesProvider{handler: handler},
stateValidatorsProvider: beaconApiStateValidatorsProvider{jsonRestHandler: jsonRestHandler}, stateValidatorsProvider: beaconApiStateValidatorsProvider{handler: handler},
jsonRestHandler: jsonRestHandler, restProvider: provider,
handler: handler,
nodeClient: nc,
beaconBlockConverter: beaconApiBeaconBlockConverter{}, beaconBlockConverter: beaconApiBeaconBlockConverter{},
prysmChainClient: prysmChainClient{ prysmChainClient: prysmChainClient{
nodeClient: &beaconApiNodeClient{jsonRestHandler: jsonRestHandler}, nodeClient: nc,
jsonRestHandler: jsonRestHandler, handler: handler,
}, },
isEventStreamRunning: false, isEventStreamRunning: false,
} }
@@ -280,8 +287,8 @@ func (c *beaconApiValidatorClient) WaitForChainStart(ctx context.Context, _ *emp
} }
func (c *beaconApiValidatorClient) StartEventStream(ctx context.Context, topics []string, eventsChannel chan<- *event.Event) { func (c *beaconApiValidatorClient) StartEventStream(ctx context.Context, topics []string, eventsChannel chan<- *event.Event) {
client := &http.Client{} // event stream should not be subject to the same settings as other api calls, so we won't use c.jsonRestHandler.HttpClient() client := &http.Client{} // event stream should not be subject to the same settings as other api calls
eventStream, err := event.NewEventStream(ctx, client, c.jsonRestHandler.Host(), topics) eventStream, err := event.NewEventStream(ctx, client, c.handler.Host(), topics)
if err != nil { if err != nil {
eventsChannel <- &event.Event{ eventsChannel <- &event.Event{
EventType: event.EventError, EventType: event.EventError,
@@ -329,9 +336,9 @@ func wrapInMetrics[Resp any](action string, f func() (Resp, error)) (Resp, error
} }
func (c *beaconApiValidatorClient) Host() string { func (c *beaconApiValidatorClient) Host() string {
return c.jsonRestHandler.Host() return c.handler.Host()
} }
func (c *beaconApiValidatorClient) SwitchHost(host string) { func (c *beaconApiValidatorClient) EnsureReady(ctx context.Context) bool {
c.jsonRestHandler.SwitchHost(host) return failover.EnsureReady(ctx, c.restProvider, c.nodeClient)
} }

View File

@@ -31,9 +31,9 @@ func TestBeaconApiValidatorClient_GetAttestationDataValid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
produceAttestationDataResponseJson := structs.GetAttestationDataResponse{} produceAttestationDataResponseJson := structs.GetAttestationDataResponse{}
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v1/validator/attestation_data?committee_index=%d&slot=%d", committeeIndex, slot), fmt.Sprintf("/eth/v1/validator/attestation_data?committee_index=%d&slot=%d", committeeIndex, slot),
&produceAttestationDataResponseJson, &produceAttestationDataResponseJson,
@@ -44,7 +44,7 @@ func TestBeaconApiValidatorClient_GetAttestationDataValid(t *testing.T) {
generateValidAttestation(uint64(slot), uint64(committeeIndex)), generateValidAttestation(uint64(slot), uint64(committeeIndex)),
).Times(2) ).Times(2)
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := beaconApiValidatorClient{handler: handler}
expectedResp, expectedErr := validatorClient.attestationData(ctx, slot, committeeIndex) expectedResp, expectedErr := validatorClient.attestationData(ctx, slot, committeeIndex)
resp, err := validatorClient.AttestationData( resp, err := validatorClient.AttestationData(
@@ -65,9 +65,9 @@ func TestBeaconApiValidatorClient_GetAttestationDataError(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
produceAttestationDataResponseJson := structs.GetAttestationDataResponse{} produceAttestationDataResponseJson := structs.GetAttestationDataResponse{}
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v1/validator/attestation_data?committee_index=%d&slot=%d", committeeIndex, slot), fmt.Sprintf("/eth/v1/validator/attestation_data?committee_index=%d&slot=%d", committeeIndex, slot),
&produceAttestationDataResponseJson, &produceAttestationDataResponseJson,
@@ -78,7 +78,7 @@ func TestBeaconApiValidatorClient_GetAttestationDataError(t *testing.T) {
generateValidAttestation(uint64(slot), uint64(committeeIndex)), generateValidAttestation(uint64(slot), uint64(committeeIndex)),
).Times(2) ).Times(2)
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := beaconApiValidatorClient{handler: handler}
expectedResp, expectedErr := validatorClient.attestationData(ctx, slot, committeeIndex) expectedResp, expectedErr := validatorClient.attestationData(ctx, slot, committeeIndex)
resp, err := validatorClient.AttestationData( resp, err := validatorClient.AttestationData(
@@ -139,8 +139,8 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockValid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().PostSSZ( handler.EXPECT().PostSSZ(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks", "/eth/v2/beacon/blocks",
gomock.Any(), gomock.Any(),
@@ -149,7 +149,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockValid(t *testing.T) {
nil, nil, nil, nil, nil, nil,
).Times(1) ).Times(1)
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := beaconApiValidatorClient{handler: handler}
expectedResp, expectedErr := validatorClient.proposeBeaconBlock( expectedResp, expectedErr := validatorClient.proposeBeaconBlock(
ctx, ctx,
&ethpb.GenericSignedBeaconBlock{ &ethpb.GenericSignedBeaconBlock{
@@ -166,8 +166,8 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockError_ThenPass(t *testing.T)
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().PostSSZ( handler.EXPECT().PostSSZ(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks", "/eth/v2/beacon/blocks",
gomock.Any(), gomock.Any(),
@@ -179,7 +179,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockError_ThenPass(t *testing.T)
}, },
).Times(1) ).Times(1)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks", "/eth/v2/beacon/blocks",
gomock.Any(), gomock.Any(),
@@ -189,7 +189,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockError_ThenPass(t *testing.T)
nil, nil,
).Times(1) ).Times(1)
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := beaconApiValidatorClient{handler: handler}
expectedResp, expectedErr := validatorClient.proposeBeaconBlock( expectedResp, expectedErr := validatorClient.proposeBeaconBlock(
ctx, ctx,
&ethpb.GenericSignedBeaconBlock{ &ethpb.GenericSignedBeaconBlock{
@@ -308,10 +308,10 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockAllTypes(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
if !tt.wantErr { if !tt.wantErr {
jsonRestHandler.EXPECT().PostSSZ( handler.EXPECT().PostSSZ(
gomock.Any(), gomock.Any(),
tt.expectedPath, tt.expectedPath,
gomock.Any(), gomock.Any(),
@@ -319,7 +319,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockAllTypes(t *testing.T) {
).Return(nil, nil, nil).Times(1) ).Return(nil, nil, nil).Times(1)
} }
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := beaconApiValidatorClient{handler: handler}
resp, err := validatorClient.proposeBeaconBlock(ctx, tt.block) resp, err := validatorClient.proposeBeaconBlock(ctx, tt.block)
if tt.wantErr { if tt.wantErr {
@@ -366,9 +366,9 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockHTTPErrors(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().PostSSZ( handler.EXPECT().PostSSZ(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks", "/eth/v2/beacon/blocks",
gomock.Any(), gomock.Any(),
@@ -377,7 +377,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockHTTPErrors(t *testing.T) {
if tt.expectJSON { if tt.expectJSON {
// When SSZ fails, it falls back to JSON // When SSZ fails, it falls back to JSON
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks", "/eth/v2/beacon/blocks",
gomock.Any(), gomock.Any(),
@@ -386,7 +386,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockHTTPErrors(t *testing.T) {
).Return(tt.sszError).Times(1) ).Return(tt.sszError).Times(1)
} }
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := beaconApiValidatorClient{handler: handler}
_, err := validatorClient.proposeBeaconBlock( _, err := validatorClient.proposeBeaconBlock(
ctx, ctx,
&ethpb.GenericSignedBeaconBlock{ &ethpb.GenericSignedBeaconBlock{
@@ -507,10 +507,10 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockJSONFallback(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
// SSZ call fails with 406 to trigger JSON fallback // SSZ call fails with 406 to trigger JSON fallback
jsonRestHandler.EXPECT().PostSSZ( handler.EXPECT().PostSSZ(
gomock.Any(), gomock.Any(),
tt.expectedPath, tt.expectedPath,
gomock.Any(), gomock.Any(),
@@ -521,7 +521,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockJSONFallback(t *testing.T) {
}).Times(1) }).Times(1)
// JSON fallback // JSON fallback
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
tt.expectedPath, tt.expectedPath,
gomock.Any(), gomock.Any(),
@@ -529,7 +529,7 @@ func TestBeaconApiValidatorClient_ProposeBeaconBlockJSONFallback(t *testing.T) {
gomock.Any(), gomock.Any(),
).Return(tt.jsonError).Times(1) ).Return(tt.jsonError).Times(1)
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := beaconApiValidatorClient{handler: handler}
resp, err := validatorClient.proposeBeaconBlock(ctx, tt.block) resp, err := validatorClient.proposeBeaconBlock(ctx, tt.block)
if tt.wantErr { if tt.wantErr {
@@ -547,29 +547,12 @@ func TestBeaconApiValidatorClient_Host(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
hosts := []string{"http://localhost:8080", "http://localhost:8081"} handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler.EXPECT().Host().Return("http://localhost:8080").Times(1)
jsonRestHandler.EXPECT().SwitchHost(
hosts[0],
).Times(1)
jsonRestHandler.EXPECT().Host().Return(
hosts[0],
).Times(1)
validatorClient := beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := beaconApiValidatorClient{handler: handler}
validatorClient.SwitchHost(hosts[0])
host := validatorClient.Host() host := validatorClient.Host()
require.Equal(t, hosts[0], host) require.Equal(t, "http://localhost:8080", host)
jsonRestHandler.EXPECT().SwitchHost(
hosts[1],
).Times(1)
jsonRestHandler.EXPECT().Host().Return(
hosts[1],
).Times(1)
validatorClient.SwitchHost(hosts[1])
host = validatorClient.Host()
require.Equal(t, hosts[1], host)
} }
// Helper functions for generating test blocks for newer consensus versions // Helper functions for generating test blocks for newer consensus versions

View File

@@ -20,7 +20,7 @@ func (c *beaconApiValidatorClient) aggregatedSelection(ctx context.Context, sele
} }
var resp aggregatedSelectionResponse var resp aggregatedSelectionResponse
err = c.jsonRestHandler.Post(ctx, "/eth/v1/validator/beacon_committee_selections", nil, bytes.NewBuffer(body), &resp) err = c.handler.Post(ctx, "/eth/v1/validator/beacon_committee_selections", nil, bytes.NewBuffer(body), &resp)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "error calling post endpoint") return nil, errors.Wrap(err, "error calling post endpoint")
} }

View File

@@ -89,13 +89,13 @@ func TestGetAggregatedSelections(t *testing.T) {
for _, test := range testcases { for _, test := range testcases {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
reqBody, err := json.Marshal(test.req) reqBody, err := json.Marshal(test.req)
require.NoError(t, err) require.NoError(t, err)
ctx := t.Context() ctx := t.Context()
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v1/validator/beacon_committee_selections", "/eth/v1/validator/beacon_committee_selections",
nil, nil,
@@ -108,7 +108,7 @@ func TestGetAggregatedSelections(t *testing.T) {
test.endpointError, test.endpointError,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
res, err := validatorClient.AggregatedSelections(ctx, test.req) res, err := validatorClient.AggregatedSelections(ctx, test.req)
if test.expectedErrorMessage != "" { if test.expectedErrorMessage != "" {
require.ErrorContains(t, test.expectedErrorMessage, err) require.ErrorContains(t, test.expectedErrorMessage, err)

View File

@@ -288,12 +288,12 @@ func TestCheckDoppelGanger_Nominal(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
if testCase.getSyncingOutput != nil { if testCase.getSyncingOutput != nil {
syncingResponseJson := structs.SyncStatusResponse{} syncingResponseJson := structs.SyncStatusResponse{}
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
syncingEndpoint, syncingEndpoint,
&syncingResponseJson, &syncingResponseJson,
@@ -308,7 +308,7 @@ func TestCheckDoppelGanger_Nominal(t *testing.T) {
if testCase.getForkOutput != nil { if testCase.getForkOutput != nil {
stateForkResponseJson := structs.GetStateForkResponse{} stateForkResponseJson := structs.GetStateForkResponse{}
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
forkEndpoint, forkEndpoint,
&stateForkResponseJson, &stateForkResponseJson,
@@ -323,7 +323,7 @@ func TestCheckDoppelGanger_Nominal(t *testing.T) {
if testCase.getHeadersOutput != nil { if testCase.getHeadersOutput != nil {
blockHeadersResponseJson := structs.GetBlockHeadersResponse{} blockHeadersResponseJson := structs.GetBlockHeadersResponse{}
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
headersEndpoint, headersEndpoint,
&blockHeadersResponseJson, &blockHeadersResponseJson,
@@ -342,7 +342,7 @@ func TestCheckDoppelGanger_Nominal(t *testing.T) {
marshalledIndexes, err := json.Marshal(iface.inputStringIndexes) marshalledIndexes, err := json.Marshal(iface.inputStringIndexes)
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
iface.inputUrl, iface.inputUrl,
nil, nil,
@@ -372,7 +372,7 @@ func TestCheckDoppelGanger_Nominal(t *testing.T) {
} }
validatorClient := beaconApiValidatorClient{ validatorClient := beaconApiValidatorClient{
jsonRestHandler: jsonRestHandler, handler: handler,
stateValidatorsProvider: stateValidatorsProvider, stateValidatorsProvider: stateValidatorsProvider,
} }
@@ -722,12 +722,12 @@ func TestCheckDoppelGanger_Errors(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
if testCase.getSyncingOutput != nil { if testCase.getSyncingOutput != nil {
syncingResponseJson := structs.SyncStatusResponse{} syncingResponseJson := structs.SyncStatusResponse{}
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
syncingEndpoint, syncingEndpoint,
&syncingResponseJson, &syncingResponseJson,
@@ -742,7 +742,7 @@ func TestCheckDoppelGanger_Errors(t *testing.T) {
if testCase.getForkOutput != nil { if testCase.getForkOutput != nil {
stateForkResponseJson := structs.GetStateForkResponse{} stateForkResponseJson := structs.GetStateForkResponse{}
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
forkEndpoint, forkEndpoint,
&stateForkResponseJson, &stateForkResponseJson,
@@ -757,7 +757,7 @@ func TestCheckDoppelGanger_Errors(t *testing.T) {
if testCase.getHeadersOutput != nil { if testCase.getHeadersOutput != nil {
blockHeadersResponseJson := structs.GetBlockHeadersResponse{} blockHeadersResponseJson := structs.GetBlockHeadersResponse{}
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
headersEndpoint, headersEndpoint,
&blockHeadersResponseJson, &blockHeadersResponseJson,
@@ -790,7 +790,7 @@ func TestCheckDoppelGanger_Errors(t *testing.T) {
marshalledIndexes, err := json.Marshal(iface.inputStringIndexes) marshalledIndexes, err := json.Marshal(iface.inputStringIndexes)
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
iface.inputUrl, iface.inputUrl,
nil, nil,
@@ -806,7 +806,7 @@ func TestCheckDoppelGanger_Errors(t *testing.T) {
} }
validatorClient := beaconApiValidatorClient{ validatorClient := beaconApiValidatorClient{
jsonRestHandler: jsonRestHandler, handler: handler,
stateValidatorsProvider: stateValidatorsProvider, stateValidatorsProvider: stateValidatorsProvider,
} }

View File

@@ -28,7 +28,7 @@ type dutiesProvider interface {
} }
type beaconApiDutiesProvider struct { type beaconApiDutiesProvider struct {
jsonRestHandler rest.RestHandler handler rest.Handler
} }
type attesterDuty struct { type attesterDuty struct {
@@ -279,7 +279,7 @@ func (c beaconApiDutiesProvider) Committees(ctx context.Context, epoch primitive
committeesRequest := apiutil.BuildURL("/eth/v1/beacon/states/head/committees", committeeParams) committeesRequest := apiutil.BuildURL("/eth/v1/beacon/states/head/committees", committeeParams)
var stateCommittees structs.GetCommitteesResponse var stateCommittees structs.GetCommitteesResponse
if err := c.jsonRestHandler.Get(ctx, committeesRequest, &stateCommittees); err != nil { if err := c.handler.Get(ctx, committeesRequest, &stateCommittees); err != nil {
return nil, err return nil, err
} }
@@ -309,7 +309,7 @@ func (c beaconApiDutiesProvider) AttesterDuties(ctx context.Context, epoch primi
} }
attesterDuties := &structs.GetAttesterDutiesResponse{} attesterDuties := &structs.GetAttesterDutiesResponse{}
if err = c.jsonRestHandler.Post( if err = c.handler.Post(
ctx, ctx,
fmt.Sprintf("/eth/v1/validator/duties/attester/%d", epoch), fmt.Sprintf("/eth/v1/validator/duties/attester/%d", epoch),
nil, nil,
@@ -331,7 +331,7 @@ func (c beaconApiDutiesProvider) AttesterDuties(ctx context.Context, epoch primi
// ProposerDuties retrieves the proposer duties for the given epoch // ProposerDuties retrieves the proposer duties for the given epoch
func (c beaconApiDutiesProvider) ProposerDuties(ctx context.Context, epoch primitives.Epoch) (*structs.GetProposerDutiesResponse, error) { func (c beaconApiDutiesProvider) ProposerDuties(ctx context.Context, epoch primitives.Epoch) (*structs.GetProposerDutiesResponse, error) {
proposerDuties := &structs.GetProposerDutiesResponse{} proposerDuties := &structs.GetProposerDutiesResponse{}
if err := c.jsonRestHandler.Get(ctx, fmt.Sprintf("/eth/v1/validator/duties/proposer/%d", epoch), proposerDuties); err != nil { if err := c.handler.Get(ctx, fmt.Sprintf("/eth/v1/validator/duties/proposer/%d", epoch), proposerDuties); err != nil {
return nil, err return nil, err
} }
@@ -361,7 +361,7 @@ func (c beaconApiDutiesProvider) SyncDuties(ctx context.Context, epoch primitive
} }
syncDuties := structs.GetSyncCommitteeDutiesResponse{} syncDuties := structs.GetSyncCommitteeDutiesResponse{}
if err = c.jsonRestHandler.Post( if err = c.handler.Post(
ctx, ctx,
fmt.Sprintf("/eth/v1/validator/duties/sync/%d", epoch), fmt.Sprintf("/eth/v1/validator/duties/sync/%d", epoch),
nil, nil,

View File

@@ -60,8 +60,8 @@ func TestGetAttesterDuties_Valid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
validatorIndices := []primitives.ValidatorIndex{2, 9} validatorIndices := []primitives.ValidatorIndex{2, 9}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
fmt.Sprintf("%s/%d", getAttesterDutiesTestEndpoint, epoch), fmt.Sprintf("%s/%d", getAttesterDutiesTestEndpoint, epoch),
nil, nil,
@@ -74,7 +74,7 @@ func TestGetAttesterDuties_Valid(t *testing.T) {
expectedAttesterDuties, expectedAttesterDuties,
).Times(1) ).Times(1)
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler} dutiesProvider := &beaconApiDutiesProvider{handler: handler}
attesterDuties, err := dutiesProvider.AttesterDuties(ctx, epoch, validatorIndices) attesterDuties, err := dutiesProvider.AttesterDuties(ctx, epoch, validatorIndices)
require.NoError(t, err) require.NoError(t, err)
assert.DeepEqual(t, expectedAttesterDuties.Data, attesterDuties.Data) assert.DeepEqual(t, expectedAttesterDuties.Data, attesterDuties.Data)
@@ -88,8 +88,8 @@ func TestGetAttesterDuties_HttpError(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
fmt.Sprintf("%s/%d", getAttesterDutiesTestEndpoint, epoch), fmt.Sprintf("%s/%d", getAttesterDutiesTestEndpoint, epoch),
gomock.Any(), gomock.Any(),
@@ -99,7 +99,7 @@ func TestGetAttesterDuties_HttpError(t *testing.T) {
errors.New("foo error"), errors.New("foo error"),
).Times(1) ).Times(1)
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler} dutiesProvider := &beaconApiDutiesProvider{handler: handler}
_, err := dutiesProvider.AttesterDuties(ctx, epoch, nil) _, err := dutiesProvider.AttesterDuties(ctx, epoch, nil)
assert.ErrorContains(t, "foo error", err) assert.ErrorContains(t, "foo error", err)
} }
@@ -112,8 +112,8 @@ func TestGetAttesterDuties_NilAttesterDuty(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
fmt.Sprintf("%s/%d", getAttesterDutiesTestEndpoint, epoch), fmt.Sprintf("%s/%d", getAttesterDutiesTestEndpoint, epoch),
gomock.Any(), gomock.Any(),
@@ -128,7 +128,7 @@ func TestGetAttesterDuties_NilAttesterDuty(t *testing.T) {
}, },
).Times(1) ).Times(1)
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler} dutiesProvider := &beaconApiDutiesProvider{handler: handler}
_, err := dutiesProvider.AttesterDuties(ctx, epoch, nil) _, err := dutiesProvider.AttesterDuties(ctx, epoch, nil)
assert.ErrorContains(t, "attester duty at index `0` is nil", err) assert.ErrorContains(t, "attester duty at index `0` is nil", err)
} }
@@ -156,8 +156,8 @@ func TestGetProposerDuties_Valid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
fmt.Sprintf("%s/%d", getProposerDutiesTestEndpoint, epoch), fmt.Sprintf("%s/%d", getProposerDutiesTestEndpoint, epoch),
&structs.GetProposerDutiesResponse{}, &structs.GetProposerDutiesResponse{},
@@ -168,7 +168,7 @@ func TestGetProposerDuties_Valid(t *testing.T) {
expectedProposerDuties, expectedProposerDuties,
).Times(1) ).Times(1)
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler} dutiesProvider := &beaconApiDutiesProvider{handler: handler}
proposerDuties, err := dutiesProvider.ProposerDuties(ctx, epoch) proposerDuties, err := dutiesProvider.ProposerDuties(ctx, epoch)
require.NoError(t, err) require.NoError(t, err)
assert.DeepEqual(t, expectedProposerDuties.Data, proposerDuties.Data) assert.DeepEqual(t, expectedProposerDuties.Data, proposerDuties.Data)
@@ -182,8 +182,8 @@ func TestGetProposerDuties_HttpError(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
fmt.Sprintf("%s/%d", getProposerDutiesTestEndpoint, epoch), fmt.Sprintf("%s/%d", getProposerDutiesTestEndpoint, epoch),
gomock.Any(), gomock.Any(),
@@ -191,7 +191,7 @@ func TestGetProposerDuties_HttpError(t *testing.T) {
errors.New("foo error"), errors.New("foo error"),
).Times(1) ).Times(1)
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler} dutiesProvider := &beaconApiDutiesProvider{handler: handler}
_, err := dutiesProvider.ProposerDuties(ctx, epoch) _, err := dutiesProvider.ProposerDuties(ctx, epoch)
assert.ErrorContains(t, "foo error", err) assert.ErrorContains(t, "foo error", err)
} }
@@ -204,8 +204,8 @@ func TestGetProposerDuties_NilData(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
fmt.Sprintf("%s/%d", getProposerDutiesTestEndpoint, epoch), fmt.Sprintf("%s/%d", getProposerDutiesTestEndpoint, epoch),
gomock.Any(), gomock.Any(),
@@ -218,7 +218,7 @@ func TestGetProposerDuties_NilData(t *testing.T) {
}, },
).Times(1) ).Times(1)
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler} dutiesProvider := &beaconApiDutiesProvider{handler: handler}
_, err := dutiesProvider.ProposerDuties(ctx, epoch) _, err := dutiesProvider.ProposerDuties(ctx, epoch)
assert.ErrorContains(t, "proposer duties data is nil", err) assert.ErrorContains(t, "proposer duties data is nil", err)
} }
@@ -231,8 +231,8 @@ func TestGetProposerDuties_NilProposerDuty(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
fmt.Sprintf("%s/%d", getProposerDutiesTestEndpoint, epoch), fmt.Sprintf("%s/%d", getProposerDutiesTestEndpoint, epoch),
gomock.Any(), gomock.Any(),
@@ -245,7 +245,7 @@ func TestGetProposerDuties_NilProposerDuty(t *testing.T) {
}, },
).Times(1) ).Times(1)
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler} dutiesProvider := &beaconApiDutiesProvider{handler: handler}
_, err := dutiesProvider.ProposerDuties(ctx, epoch) _, err := dutiesProvider.ProposerDuties(ctx, epoch)
assert.ErrorContains(t, "proposer duty at index `0` is nil", err) assert.ErrorContains(t, "proposer duty at index `0` is nil", err)
} }
@@ -284,8 +284,8 @@ func TestGetSyncDuties_Valid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
validatorIndices := []primitives.ValidatorIndex{2, 6} validatorIndices := []primitives.ValidatorIndex{2, 6}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
fmt.Sprintf("%s/%d", getSyncDutiesTestEndpoint, epoch), fmt.Sprintf("%s/%d", getSyncDutiesTestEndpoint, epoch),
nil, nil,
@@ -298,7 +298,7 @@ func TestGetSyncDuties_Valid(t *testing.T) {
expectedSyncDuties, expectedSyncDuties,
).Times(1) ).Times(1)
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler} dutiesProvider := &beaconApiDutiesProvider{handler: handler}
syncDuties, err := dutiesProvider.SyncDuties(ctx, epoch, validatorIndices) syncDuties, err := dutiesProvider.SyncDuties(ctx, epoch, validatorIndices)
require.NoError(t, err) require.NoError(t, err)
assert.DeepEqual(t, expectedSyncDuties.Data, syncDuties) assert.DeepEqual(t, expectedSyncDuties.Data, syncDuties)
@@ -312,8 +312,8 @@ func TestGetSyncDuties_HttpError(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
fmt.Sprintf("%s/%d", getSyncDutiesTestEndpoint, epoch), fmt.Sprintf("%s/%d", getSyncDutiesTestEndpoint, epoch),
gomock.Any(), gomock.Any(),
@@ -323,7 +323,7 @@ func TestGetSyncDuties_HttpError(t *testing.T) {
errors.New("foo error"), errors.New("foo error"),
).Times(1) ).Times(1)
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler} dutiesProvider := &beaconApiDutiesProvider{handler: handler}
_, err := dutiesProvider.SyncDuties(ctx, epoch, nil) _, err := dutiesProvider.SyncDuties(ctx, epoch, nil)
assert.ErrorContains(t, "foo error", err) assert.ErrorContains(t, "foo error", err)
} }
@@ -336,8 +336,8 @@ func TestGetSyncDuties_NilData(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
fmt.Sprintf("%s/%d", getSyncDutiesTestEndpoint, epoch), fmt.Sprintf("%s/%d", getSyncDutiesTestEndpoint, epoch),
gomock.Any(), gomock.Any(),
@@ -352,7 +352,7 @@ func TestGetSyncDuties_NilData(t *testing.T) {
}, },
).Times(1) ).Times(1)
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler} dutiesProvider := &beaconApiDutiesProvider{handler: handler}
_, err := dutiesProvider.SyncDuties(ctx, epoch, nil) _, err := dutiesProvider.SyncDuties(ctx, epoch, nil)
assert.ErrorContains(t, "sync duties data is nil", err) assert.ErrorContains(t, "sync duties data is nil", err)
} }
@@ -365,8 +365,8 @@ func TestGetSyncDuties_NilSyncDuty(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
fmt.Sprintf("%s/%d", getSyncDutiesTestEndpoint, epoch), fmt.Sprintf("%s/%d", getSyncDutiesTestEndpoint, epoch),
gomock.Any(), gomock.Any(),
@@ -381,7 +381,7 @@ func TestGetSyncDuties_NilSyncDuty(t *testing.T) {
}, },
).Times(1) ).Times(1)
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler} dutiesProvider := &beaconApiDutiesProvider{handler: handler}
_, err := dutiesProvider.SyncDuties(ctx, epoch, nil) _, err := dutiesProvider.SyncDuties(ctx, epoch, nil)
assert.ErrorContains(t, "sync duty at index `0` is nil", err) assert.ErrorContains(t, "sync duty at index `0` is nil", err)
} }
@@ -415,8 +415,8 @@ func TestGetCommittees_Valid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
fmt.Sprintf("%s?epoch=%d", getCommitteesTestEndpoint, epoch), fmt.Sprintf("%s?epoch=%d", getCommitteesTestEndpoint, epoch),
&structs.GetCommitteesResponse{}, &structs.GetCommitteesResponse{},
@@ -427,7 +427,7 @@ func TestGetCommittees_Valid(t *testing.T) {
expectedCommittees, expectedCommittees,
).Times(1) ).Times(1)
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler} dutiesProvider := &beaconApiDutiesProvider{handler: handler}
committees, err := dutiesProvider.Committees(ctx, epoch) committees, err := dutiesProvider.Committees(ctx, epoch)
require.NoError(t, err) require.NoError(t, err)
assert.DeepEqual(t, expectedCommittees.Data, committees) assert.DeepEqual(t, expectedCommittees.Data, committees)
@@ -441,8 +441,8 @@ func TestGetCommittees_HttpError(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
fmt.Sprintf("%s?epoch=%d", getCommitteesTestEndpoint, epoch), fmt.Sprintf("%s?epoch=%d", getCommitteesTestEndpoint, epoch),
gomock.Any(), gomock.Any(),
@@ -450,7 +450,7 @@ func TestGetCommittees_HttpError(t *testing.T) {
errors.New("foo error"), errors.New("foo error"),
).Times(1) ).Times(1)
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler} dutiesProvider := &beaconApiDutiesProvider{handler: handler}
_, err := dutiesProvider.Committees(ctx, epoch) _, err := dutiesProvider.Committees(ctx, epoch)
assert.ErrorContains(t, "foo error", err) assert.ErrorContains(t, "foo error", err)
} }
@@ -463,8 +463,8 @@ func TestGetCommittees_NilData(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
fmt.Sprintf("%s?epoch=%d", getCommitteesTestEndpoint, epoch), fmt.Sprintf("%s?epoch=%d", getCommitteesTestEndpoint, epoch),
gomock.Any(), gomock.Any(),
@@ -477,7 +477,7 @@ func TestGetCommittees_NilData(t *testing.T) {
}, },
).Times(1) ).Times(1)
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler} dutiesProvider := &beaconApiDutiesProvider{handler: handler}
_, err := dutiesProvider.Committees(ctx, epoch) _, err := dutiesProvider.Committees(ctx, epoch)
assert.ErrorContains(t, "state committees data is nil", err) assert.ErrorContains(t, "state committees data is nil", err)
} }
@@ -490,8 +490,8 @@ func TestGetCommittees_NilCommittee(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
fmt.Sprintf("%s?epoch=%d", getCommitteesTestEndpoint, epoch), fmt.Sprintf("%s?epoch=%d", getCommitteesTestEndpoint, epoch),
gomock.Any(), gomock.Any(),
@@ -504,7 +504,7 @@ func TestGetCommittees_NilCommittee(t *testing.T) {
}, },
).Times(1) ).Times(1)
dutiesProvider := &beaconApiDutiesProvider{jsonRestHandler: jsonRestHandler} dutiesProvider := &beaconApiDutiesProvider{handler: handler}
_, err := dutiesProvider.Committees(ctx, epoch) _, err := dutiesProvider.Committees(ctx, epoch)
assert.ErrorContains(t, "committee at index `0` is nil", err) assert.ErrorContains(t, "committee at index `0` is nil", err)
} }

View File

@@ -21,9 +21,9 @@ type GenesisProvider interface {
} }
type beaconApiGenesisProvider struct { type beaconApiGenesisProvider struct {
jsonRestHandler rest.RestHandler handler rest.Handler
genesis *structs.Genesis genesis *structs.Genesis
once sync.Once once sync.Once
} }
func (c *beaconApiValidatorClient) waitForChainStart(ctx context.Context) (*ethpb.ChainStartResponse, error) { func (c *beaconApiValidatorClient) waitForChainStart(ctx context.Context) (*ethpb.ChainStartResponse, error) {
@@ -69,7 +69,7 @@ func (c *beaconApiGenesisProvider) Genesis(ctx context.Context) (*structs.Genesi
genesisJson := &structs.GetGenesisResponse{} genesisJson := &structs.GetGenesisResponse{}
var doErr error var doErr error
c.once.Do(func() { c.once.Do(func() {
if err := c.jsonRestHandler.Get(ctx, "/eth/v1/beacon/genesis", genesisJson); err != nil { if err := c.handler.Get(ctx, "/eth/v1/beacon/genesis", genesisJson); err != nil {
doErr = err doErr = err
return return
} }

View File

@@ -18,8 +18,8 @@ func TestGetGenesis_ValidGenesis(t *testing.T) {
ctx := t.Context() ctx := t.Context()
genesisResponseJson := structs.GetGenesisResponse{} genesisResponseJson := structs.GetGenesisResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/genesis", "/eth/v1/beacon/genesis",
&genesisResponseJson, &genesisResponseJson,
@@ -35,7 +35,7 @@ func TestGetGenesis_ValidGenesis(t *testing.T) {
}, },
).Times(1) ).Times(1)
genesisProvider := &beaconApiGenesisProvider{jsonRestHandler: jsonRestHandler} genesisProvider := &beaconApiGenesisProvider{handler: handler}
resp, err := genesisProvider.Genesis(ctx) resp, err := genesisProvider.Genesis(ctx)
assert.NoError(t, err) assert.NoError(t, err)
require.NotNil(t, resp) require.NotNil(t, resp)
@@ -50,8 +50,8 @@ func TestGetGenesis_NilData(t *testing.T) {
ctx := t.Context() ctx := t.Context()
genesisResponseJson := structs.GetGenesisResponse{} genesisResponseJson := structs.GetGenesisResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/genesis", "/eth/v1/beacon/genesis",
&genesisResponseJson, &genesisResponseJson,
@@ -62,7 +62,7 @@ func TestGetGenesis_NilData(t *testing.T) {
structs.GetGenesisResponse{Data: nil}, structs.GetGenesisResponse{Data: nil},
).Times(1) ).Times(1)
genesisProvider := &beaconApiGenesisProvider{jsonRestHandler: jsonRestHandler} genesisProvider := &beaconApiGenesisProvider{handler: handler}
_, err := genesisProvider.Genesis(ctx) _, err := genesisProvider.Genesis(ctx)
assert.ErrorContains(t, "genesis data is nil", err) assert.ErrorContains(t, "genesis data is nil", err)
} }
@@ -74,8 +74,8 @@ func TestGetGenesis_EndpointCalledOnlyOnce(t *testing.T) {
ctx := t.Context() ctx := t.Context()
genesisResponseJson := structs.GetGenesisResponse{} genesisResponseJson := structs.GetGenesisResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/genesis", "/eth/v1/beacon/genesis",
&genesisResponseJson, &genesisResponseJson,
@@ -91,7 +91,7 @@ func TestGetGenesis_EndpointCalledOnlyOnce(t *testing.T) {
}, },
).Times(1) ).Times(1)
genesisProvider := &beaconApiGenesisProvider{jsonRestHandler: jsonRestHandler} genesisProvider := &beaconApiGenesisProvider{handler: handler}
_, err := genesisProvider.Genesis(ctx) _, err := genesisProvider.Genesis(ctx)
assert.NoError(t, err) assert.NoError(t, err)
resp, err := genesisProvider.Genesis(ctx) resp, err := genesisProvider.Genesis(ctx)
@@ -108,15 +108,15 @@ func TestGetGenesis_EndpointCanBeCalledAgainAfterError(t *testing.T) {
ctx := t.Context() ctx := t.Context()
genesisResponseJson := structs.GetGenesisResponse{} genesisResponseJson := structs.GetGenesisResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/genesis", "/eth/v1/beacon/genesis",
&genesisResponseJson, &genesisResponseJson,
).Return( ).Return(
errors.New("foo"), errors.New("foo"),
).Times(1) ).Times(1)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/genesis", "/eth/v1/beacon/genesis",
&genesisResponseJson, &genesisResponseJson,
@@ -132,7 +132,7 @@ func TestGetGenesis_EndpointCanBeCalledAgainAfterError(t *testing.T) {
}, },
).Times(1) ).Times(1)
genesisProvider := &beaconApiGenesisProvider{jsonRestHandler: jsonRestHandler} genesisProvider := &beaconApiGenesisProvider{handler: handler}
_, err := genesisProvider.Genesis(ctx) _, err := genesisProvider.Genesis(ctx)
require.ErrorContains(t, "foo", err) require.ErrorContains(t, "foo", err)
resp, err := genesisProvider.Genesis(ctx) resp, err := genesisProvider.Genesis(ctx)

View File

@@ -26,7 +26,7 @@ func (c *beaconApiValidatorClient) beaconBlock(ctx context.Context, slot primiti
queryParams.Add("graffiti", hexutil.Encode(graffiti)) queryParams.Add("graffiti", hexutil.Encode(graffiti))
} }
queryUrl := apiutil.BuildURL(fmt.Sprintf("/eth/v3/validator/blocks/%d", slot), queryParams) queryUrl := apiutil.BuildURL(fmt.Sprintf("/eth/v3/validator/blocks/%d", slot), queryParams)
data, header, err := c.jsonRestHandler.GetSSZ(ctx, queryUrl) data, header, err := c.handler.GetSSZ(ctx, queryUrl)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@@ -25,8 +25,8 @@ func TestGetBeaconBlock_RequestFailed(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
gomock.Any(), gomock.Any(),
).Return( ).Return(
@@ -35,7 +35,7 @@ func TestGetBeaconBlock_RequestFailed(t *testing.T) {
errors.New("foo error"), errors.New("foo error"),
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
_, err := validatorClient.beaconBlock(ctx, 1, []byte{1}, []byte{2}) _, err := validatorClient.beaconBlock(ctx, 1, []byte{1}, []byte{2})
assert.ErrorContains(t, "foo error", err) assert.ErrorContains(t, "foo error", err)
} }
@@ -149,8 +149,8 @@ func TestGetBeaconBlock_Error(t *testing.T) {
b, err := json.Marshal(resp) b, err := json.Marshal(resp)
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
gomock.Any(), gomock.Any(),
).Return( ).Return(
@@ -159,7 +159,7 @@ func TestGetBeaconBlock_Error(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
_, err = validatorClient.beaconBlock(ctx, 1, []byte{1}, []byte{2}) _, err = validatorClient.beaconBlock(ctx, 1, []byte{1}, []byte{2})
assert.ErrorContains(t, testCase.expectedErrorMessage, err) assert.ErrorContains(t, testCase.expectedErrorMessage, err)
}) })
@@ -185,8 +185,8 @@ func TestGetBeaconBlock_Phase0Valid(t *testing.T) {
Data: bytes, Data: bytes,
}) })
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -195,7 +195,7 @@ func TestGetBeaconBlock_Phase0Valid(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err) require.NoError(t, err)
@@ -224,8 +224,8 @@ func TestGetBeaconBlock_SSZ_BellatrixValid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -238,7 +238,7 @@ func TestGetBeaconBlock_SSZ_BellatrixValid(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err) require.NoError(t, err)
@@ -266,8 +266,8 @@ func TestGetBeaconBlock_SSZ_BlindedBellatrixValid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -280,7 +280,7 @@ func TestGetBeaconBlock_SSZ_BlindedBellatrixValid(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err) require.NoError(t, err)
@@ -308,8 +308,8 @@ func TestGetBeaconBlock_SSZ_CapellaValid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -322,7 +322,7 @@ func TestGetBeaconBlock_SSZ_CapellaValid(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err) require.NoError(t, err)
@@ -350,8 +350,8 @@ func TestGetBeaconBlock_SSZ_BlindedCapellaValid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -364,7 +364,7 @@ func TestGetBeaconBlock_SSZ_BlindedCapellaValid(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err) require.NoError(t, err)
@@ -392,8 +392,8 @@ func TestGetBeaconBlock_SSZ_DenebValid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -406,7 +406,7 @@ func TestGetBeaconBlock_SSZ_DenebValid(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err) require.NoError(t, err)
@@ -434,8 +434,8 @@ func TestGetBeaconBlock_SSZ_BlindedDenebValid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -448,7 +448,7 @@ func TestGetBeaconBlock_SSZ_BlindedDenebValid(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err) require.NoError(t, err)
@@ -476,8 +476,8 @@ func TestGetBeaconBlock_SSZ_ElectraValid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -490,7 +490,7 @@ func TestGetBeaconBlock_SSZ_ElectraValid(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err) require.NoError(t, err)
@@ -518,8 +518,8 @@ func TestGetBeaconBlock_SSZ_BlindedElectraValid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -532,7 +532,7 @@ func TestGetBeaconBlock_SSZ_BlindedElectraValid(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err) require.NoError(t, err)
@@ -556,8 +556,8 @@ func TestGetBeaconBlock_SSZ_UnsupportedVersion(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -570,7 +570,7 @@ func TestGetBeaconBlock_SSZ_UnsupportedVersion(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
_, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) _, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
assert.ErrorContains(t, "version name doesn't map to a known value in the enum", err) assert.ErrorContains(t, "version name doesn't map to a known value in the enum", err)
} }
@@ -589,8 +589,8 @@ func TestGetBeaconBlock_SSZ_InvalidBlindedHeader(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -603,7 +603,7 @@ func TestGetBeaconBlock_SSZ_InvalidBlindedHeader(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
_, err = validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) _, err = validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
assert.ErrorContains(t, "strconv.ParseBool: parsing \"invalid\": invalid syntax", err) assert.ErrorContains(t, "strconv.ParseBool: parsing \"invalid\": invalid syntax", err)
} }
@@ -622,8 +622,8 @@ func TestGetBeaconBlock_SSZ_InvalidVersionHeader(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -636,7 +636,7 @@ func TestGetBeaconBlock_SSZ_InvalidVersionHeader(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
_, err = validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) _, err = validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
assert.ErrorContains(t, "unsupported header version invalid", err) assert.ErrorContains(t, "unsupported header version invalid", err)
} }
@@ -651,8 +651,8 @@ func TestGetBeaconBlock_SSZ_GetSSZError(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -661,7 +661,7 @@ func TestGetBeaconBlock_SSZ_GetSSZError(t *testing.T) {
errors.New("get ssz error"), errors.New("get ssz error"),
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
_, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) _, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
assert.ErrorContains(t, "get ssz error", err) assert.ErrorContains(t, "get ssz error", err)
} }
@@ -680,8 +680,8 @@ func TestGetBeaconBlock_SSZ_Phase0Valid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -694,7 +694,7 @@ func TestGetBeaconBlock_SSZ_Phase0Valid(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err) require.NoError(t, err)
@@ -722,8 +722,8 @@ func TestGetBeaconBlock_SSZ_AltairValid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -736,7 +736,7 @@ func TestGetBeaconBlock_SSZ_AltairValid(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err) require.NoError(t, err)
@@ -770,8 +770,8 @@ func TestGetBeaconBlock_AltairValid(t *testing.T) {
Data: bytes, Data: bytes,
}) })
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -780,7 +780,7 @@ func TestGetBeaconBlock_AltairValid(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err) require.NoError(t, err)
@@ -814,8 +814,8 @@ func TestGetBeaconBlock_BellatrixValid(t *testing.T) {
Data: bytes, Data: bytes,
}) })
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -824,7 +824,7 @@ func TestGetBeaconBlock_BellatrixValid(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err) require.NoError(t, err)
@@ -859,8 +859,8 @@ func TestGetBeaconBlock_BlindedBellatrixValid(t *testing.T) {
Data: bytes, Data: bytes,
}) })
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -869,7 +869,7 @@ func TestGetBeaconBlock_BlindedBellatrixValid(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err) require.NoError(t, err)
@@ -904,8 +904,8 @@ func TestGetBeaconBlock_CapellaValid(t *testing.T) {
Data: bytes, Data: bytes,
}) })
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -914,7 +914,7 @@ func TestGetBeaconBlock_CapellaValid(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err) require.NoError(t, err)
@@ -949,8 +949,8 @@ func TestGetBeaconBlock_BlindedCapellaValid(t *testing.T) {
Data: bytes, Data: bytes,
}) })
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -959,7 +959,7 @@ func TestGetBeaconBlock_BlindedCapellaValid(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err) require.NoError(t, err)
@@ -994,8 +994,8 @@ func TestGetBeaconBlock_DenebValid(t *testing.T) {
Data: bytes, Data: bytes,
}) })
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -1004,7 +1004,7 @@ func TestGetBeaconBlock_DenebValid(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err) require.NoError(t, err)
@@ -1039,8 +1039,8 @@ func TestGetBeaconBlock_BlindedDenebValid(t *testing.T) {
Data: bytes, Data: bytes,
}) })
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -1049,7 +1049,7 @@ func TestGetBeaconBlock_BlindedDenebValid(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err) require.NoError(t, err)
@@ -1084,8 +1084,8 @@ func TestGetBeaconBlock_ElectraValid(t *testing.T) {
Data: bytes, Data: bytes,
}) })
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -1094,7 +1094,7 @@ func TestGetBeaconBlock_ElectraValid(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err) require.NoError(t, err)
@@ -1129,8 +1129,8 @@ func TestGetBeaconBlock_BlindedElectraValid(t *testing.T) {
Data: bytes, Data: bytes,
}) })
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().GetSSZ( handler.EXPECT().GetSSZ(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)), fmt.Sprintf("/eth/v3/validator/blocks/%d?graffiti=%s&randao_reveal=%s", slot, hexutil.Encode(graffiti), hexutil.Encode(randaoReveal)),
).Return( ).Return(
@@ -1139,7 +1139,7 @@ func TestGetBeaconBlock_BlindedElectraValid(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti) beaconBlock, err := validatorClient.beaconBlock(ctx, slot, randaoReveal, graffiti)
require.NoError(t, err) require.NoError(t, err)

View File

@@ -41,9 +41,9 @@ func TestIndex_Nominal(t *testing.T) {
ctx := t.Context() ctx := t.Context()
stateValidatorsResponseJson := structs.GetValidatorsResponse{} stateValidatorsResponseJson := structs.GetValidatorsResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/states/head/validators", "/eth/v1/beacon/states/head/validators",
nil, nil,
@@ -68,7 +68,7 @@ func TestIndex_Nominal(t *testing.T) {
validatorClient := beaconApiValidatorClient{ validatorClient := beaconApiValidatorClient{
stateValidatorsProvider: beaconApiStateValidatorsProvider{ stateValidatorsProvider: beaconApiStateValidatorsProvider{
jsonRestHandler: jsonRestHandler, handler: handler,
}, },
} }
@@ -91,9 +91,9 @@ func TestIndex_UnexistingValidator(t *testing.T) {
ctx := t.Context() ctx := t.Context()
stateValidatorsResponseJson := structs.GetValidatorsResponse{} stateValidatorsResponseJson := structs.GetValidatorsResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/states/head/validators", "/eth/v1/beacon/states/head/validators",
nil, nil,
@@ -110,7 +110,7 @@ func TestIndex_UnexistingValidator(t *testing.T) {
validatorClient := beaconApiValidatorClient{ validatorClient := beaconApiValidatorClient{
stateValidatorsProvider: beaconApiStateValidatorsProvider{ stateValidatorsProvider: beaconApiStateValidatorsProvider{
jsonRestHandler: jsonRestHandler, handler: handler,
}, },
} }
@@ -133,9 +133,9 @@ func TestIndex_BadIndexError(t *testing.T) {
ctx := t.Context() ctx := t.Context()
stateValidatorsResponseJson := structs.GetValidatorsResponse{} stateValidatorsResponseJson := structs.GetValidatorsResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/states/head/validators", "/eth/v1/beacon/states/head/validators",
nil, nil,
@@ -160,7 +160,7 @@ func TestIndex_BadIndexError(t *testing.T) {
validatorClient := beaconApiValidatorClient{ validatorClient := beaconApiValidatorClient{
stateValidatorsProvider: beaconApiStateValidatorsProvider{ stateValidatorsProvider: beaconApiStateValidatorsProvider{
jsonRestHandler: jsonRestHandler, handler: handler,
}, },
} }
@@ -182,9 +182,9 @@ func TestIndex_JsonResponseError(t *testing.T) {
ctx := t.Context() ctx := t.Context()
stateValidatorsResponseJson := structs.GetValidatorsResponse{} stateValidatorsResponseJson := structs.GetValidatorsResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/states/head/validators", "/eth/v1/beacon/states/head/validators",
nil, nil,
@@ -207,7 +207,7 @@ func TestIndex_JsonResponseError(t *testing.T) {
queryParams.Add("status", st) queryParams.Add("status", st)
} }
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
apiutil.BuildURL("/eth/v1/beacon/states/head/validators", queryParams), apiutil.BuildURL("/eth/v1/beacon/states/head/validators", queryParams),
&stateValidatorsResponseJson, &stateValidatorsResponseJson,
@@ -217,7 +217,7 @@ func TestIndex_JsonResponseError(t *testing.T) {
validatorClient := beaconApiValidatorClient{ validatorClient := beaconApiValidatorClient{
stateValidatorsProvider: beaconApiStateValidatorsProvider{ stateValidatorsProvider: beaconApiStateValidatorsProvider{
jsonRestHandler: jsonRestHandler, handler: handler,
}, },
} }

View File

@@ -1,9 +1,9 @@
// Code generated by MockGen. DO NOT EDIT. // Code generated by MockGen. DO NOT EDIT.
// Source: validator/client/beacon-api/rest_handler_client.go // Source: api/rest/rest_handler.go
// //
// Generated by this command: // Generated by this command:
// //
// mockgen -package=mock -source=validator/client/beacon-api/rest_handler_client.go -destination=validator/client/beacon-api/mock/json_rest_handler_mock.go RestHandler // mockgen -package=mock -source=api/rest/rest_handler.go -destination=validator/client/beacon-api/mock/json_rest_handler_mock.go Handler
// //
// Package mock is a generated GoMock package. // Package mock is a generated GoMock package.
@@ -19,36 +19,39 @@ import (
) )
// Backward compatibility aliases for the renamed mock type. // Backward compatibility aliases for the renamed mock type.
type MockJsonRestHandler = MockRestHandler type MockJsonRestHandler = MockHandler
type MockJsonRestHandlerMockRecorder = MockRestHandlerMockRecorder type MockJsonRestHandlerMockRecorder = MockHandlerMockRecorder
type MockRestHandler = MockHandler
type MockRestHandlerMockRecorder = MockHandlerMockRecorder
var NewMockJsonRestHandler = NewMockRestHandler var NewMockJsonRestHandler = NewMockHandler
var NewMockRestHandler = NewMockHandler
// MockRestHandler is a mock of RestHandler interface. // MockHandler is a mock of Handler interface.
type MockRestHandler struct { type MockHandler struct {
ctrl *gomock.Controller ctrl *gomock.Controller
recorder *MockRestHandlerMockRecorder recorder *MockHandlerMockRecorder
} }
// MockRestHandlerMockRecorder is the mock recorder for MockRestHandler. // MockHandlerMockRecorder is the mock recorder for MockHandler.
type MockRestHandlerMockRecorder struct { type MockHandlerMockRecorder struct {
mock *MockRestHandler mock *MockHandler
} }
// NewMockRestHandler creates a new mock instance. // NewMockHandler creates a new mock instance.
func NewMockRestHandler(ctrl *gomock.Controller) *MockRestHandler { func NewMockHandler(ctrl *gomock.Controller) *MockHandler {
mock := &MockRestHandler{ctrl: ctrl} mock := &MockHandler{ctrl: ctrl}
mock.recorder = &MockRestHandlerMockRecorder{mock} mock.recorder = &MockHandlerMockRecorder{mock}
return mock return mock
} }
// EXPECT returns an object that allows the caller to indicate expected use. // EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockRestHandler) EXPECT() *MockRestHandlerMockRecorder { func (m *MockHandler) EXPECT() *MockHandlerMockRecorder {
return m.recorder return m.recorder
} }
// Get mocks base method. // Get mocks base method.
func (m *MockRestHandler) Get(ctx context.Context, endpoint string, resp any) error { func (m *MockHandler) Get(ctx context.Context, endpoint string, resp any) error {
m.ctrl.T.Helper() m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Get", ctx, endpoint, resp) ret := m.ctrl.Call(m, "Get", ctx, endpoint, resp)
ret0, _ := ret[0].(error) ret0, _ := ret[0].(error)
@@ -56,13 +59,13 @@ func (m *MockRestHandler) Get(ctx context.Context, endpoint string, resp any) er
} }
// Get indicates an expected call of Get. // Get indicates an expected call of Get.
func (mr *MockRestHandlerMockRecorder) Get(ctx, endpoint, resp any) *gomock.Call { func (mr *MockHandlerMockRecorder) Get(ctx, endpoint, resp any) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockRestHandler)(nil).Get), ctx, endpoint, resp) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Get", reflect.TypeOf((*MockHandler)(nil).Get), ctx, endpoint, resp)
} }
// GetSSZ mocks base method. // GetSSZ mocks base method.
func (m *MockRestHandler) GetSSZ(ctx context.Context, endpoint string) ([]byte, http.Header, error) { func (m *MockHandler) GetSSZ(ctx context.Context, endpoint string) ([]byte, http.Header, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetSSZ", ctx, endpoint) ret := m.ctrl.Call(m, "GetSSZ", ctx, endpoint)
ret0, _ := ret[0].([]byte) ret0, _ := ret[0].([]byte)
@@ -72,13 +75,13 @@ func (m *MockRestHandler) GetSSZ(ctx context.Context, endpoint string) ([]byte,
} }
// GetSSZ indicates an expected call of GetSSZ. // GetSSZ indicates an expected call of GetSSZ.
func (mr *MockRestHandlerMockRecorder) GetSSZ(ctx, endpoint any) *gomock.Call { func (mr *MockHandlerMockRecorder) GetSSZ(ctx, endpoint any) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSSZ", reflect.TypeOf((*MockRestHandler)(nil).GetSSZ), ctx, endpoint) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetSSZ", reflect.TypeOf((*MockHandler)(nil).GetSSZ), ctx, endpoint)
} }
// GetStatusCode mocks base method. // GetStatusCode mocks base method.
func (m *MockRestHandler) GetStatusCode(ctx context.Context, endpoint string) (int, error) { func (m *MockHandler) GetStatusCode(ctx context.Context, endpoint string) (int, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "GetStatusCode", ctx, endpoint) ret := m.ctrl.Call(m, "GetStatusCode", ctx, endpoint)
ret0, _ := ret[0].(int) ret0, _ := ret[0].(int)
@@ -87,13 +90,13 @@ func (m *MockRestHandler) GetStatusCode(ctx context.Context, endpoint string) (i
} }
// GetStatusCode indicates an expected call of GetStatusCode. // GetStatusCode indicates an expected call of GetStatusCode.
func (mr *MockRestHandlerMockRecorder) GetStatusCode(ctx, endpoint any) *gomock.Call { func (mr *MockHandlerMockRecorder) GetStatusCode(ctx, endpoint any) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStatusCode", reflect.TypeOf((*MockRestHandler)(nil).GetStatusCode), ctx, endpoint) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetStatusCode", reflect.TypeOf((*MockHandler)(nil).GetStatusCode), ctx, endpoint)
} }
// Host mocks base method. // Host mocks base method.
func (m *MockRestHandler) Host() string { func (m *MockHandler) Host() string {
m.ctrl.T.Helper() m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Host") ret := m.ctrl.Call(m, "Host")
ret0, _ := ret[0].(string) ret0, _ := ret[0].(string)
@@ -101,27 +104,13 @@ func (m *MockRestHandler) Host() string {
} }
// Host indicates an expected call of Host. // Host indicates an expected call of Host.
func (mr *MockRestHandlerMockRecorder) Host() *gomock.Call { func (mr *MockHandlerMockRecorder) Host() *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Host", reflect.TypeOf((*MockRestHandler)(nil).Host)) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Host", reflect.TypeOf((*MockHandler)(nil).Host))
}
// HttpClient mocks base method.
func (m *MockRestHandler) HttpClient() *http.Client {
m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "HttpClient")
ret0, _ := ret[0].(*http.Client)
return ret0
}
// HttpClient indicates an expected call of HttpClient.
func (mr *MockRestHandlerMockRecorder) HttpClient() *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "HttpClient", reflect.TypeOf((*MockRestHandler)(nil).HttpClient))
} }
// Post mocks base method. // Post mocks base method.
func (m *MockRestHandler) Post(ctx context.Context, endpoint string, headers map[string]string, data *bytes.Buffer, resp any) error { func (m *MockHandler) Post(ctx context.Context, endpoint string, headers map[string]string, data *bytes.Buffer, resp any) error {
m.ctrl.T.Helper() m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "Post", ctx, endpoint, headers, data, resp) ret := m.ctrl.Call(m, "Post", ctx, endpoint, headers, data, resp)
ret0, _ := ret[0].(error) ret0, _ := ret[0].(error)
@@ -129,13 +118,13 @@ func (m *MockRestHandler) Post(ctx context.Context, endpoint string, headers map
} }
// Post indicates an expected call of Post. // Post indicates an expected call of Post.
func (mr *MockRestHandlerMockRecorder) Post(ctx, endpoint, headers, data, resp any) *gomock.Call { func (mr *MockHandlerMockRecorder) Post(ctx, endpoint, headers, data, resp any) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Post", reflect.TypeOf((*MockRestHandler)(nil).Post), ctx, endpoint, headers, data, resp) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Post", reflect.TypeOf((*MockHandler)(nil).Post), ctx, endpoint, headers, data, resp)
} }
// PostSSZ mocks base method. // PostSSZ mocks base method.
func (m *MockRestHandler) PostSSZ(ctx context.Context, endpoint string, headers map[string]string, data *bytes.Buffer) ([]byte, http.Header, error) { func (m *MockHandler) PostSSZ(ctx context.Context, endpoint string, headers map[string]string, data *bytes.Buffer) ([]byte, http.Header, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()
ret := m.ctrl.Call(m, "PostSSZ", ctx, endpoint, headers, data) ret := m.ctrl.Call(m, "PostSSZ", ctx, endpoint, headers, data)
ret0, _ := ret[0].([]byte) ret0, _ := ret[0].([]byte)
@@ -145,19 +134,7 @@ func (m *MockRestHandler) PostSSZ(ctx context.Context, endpoint string, headers
} }
// PostSSZ indicates an expected call of PostSSZ. // PostSSZ indicates an expected call of PostSSZ.
func (mr *MockRestHandlerMockRecorder) PostSSZ(ctx, endpoint, headers, data any) *gomock.Call { func (mr *MockHandlerMockRecorder) PostSSZ(ctx, endpoint, headers, data any) *gomock.Call {
mr.mock.ctrl.T.Helper() mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PostSSZ", reflect.TypeOf((*MockRestHandler)(nil).PostSSZ), ctx, endpoint, headers, data) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PostSSZ", reflect.TypeOf((*MockHandler)(nil).PostSSZ), ctx, endpoint, headers, data)
}
// SwitchHost mocks base method.
func (m *MockRestHandler) SwitchHost(host string) {
m.ctrl.T.Helper()
m.ctrl.Call(m, "SwitchHost", host)
}
// SwitchHost indicates an expected call of SwitchHost.
func (mr *MockRestHandlerMockRecorder) SwitchHost(host any) *gomock.Call {
mr.mock.ctrl.T.Helper()
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SwitchHost", reflect.TypeOf((*MockRestHandler)(nil).SwitchHost), host)
} }

View File

@@ -26,5 +26,5 @@ func (c *beaconApiValidatorClient) prepareBeaconProposer(ctx context.Context, re
return errors.Wrap(err, "failed to marshal recipients") return errors.Wrap(err, "failed to marshal recipients")
} }
return c.jsonRestHandler.Post(ctx, "/eth/v1/validator/prepare_beacon_proposer", nil, bytes.NewBuffer(marshalledJsonRecipients), nil) return c.handler.Post(ctx, "/eth/v1/validator/prepare_beacon_proposer", nil, bytes.NewBuffer(marshalledJsonRecipients), nil)
} }

View File

@@ -45,8 +45,8 @@ func TestPrepareBeaconProposer_Valid(t *testing.T) {
marshalledJsonRecipients, err := json.Marshal(jsonRecipients) marshalledJsonRecipients, err := json.Marshal(jsonRecipients)
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
prepareBeaconProposerTestEndpoint, prepareBeaconProposerTestEndpoint,
nil, nil,
@@ -78,7 +78,7 @@ func TestPrepareBeaconProposer_Valid(t *testing.T) {
}, },
} }
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
err = validatorClient.prepareBeaconProposer(ctx, protoRecipients) err = validatorClient.prepareBeaconProposer(ctx, protoRecipients)
require.NoError(t, err) require.NoError(t, err)
} }
@@ -89,8 +89,8 @@ func TestPrepareBeaconProposer_BadRequest(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
prepareBeaconProposerTestEndpoint, prepareBeaconProposerTestEndpoint,
nil, nil,
@@ -100,7 +100,7 @@ func TestPrepareBeaconProposer_BadRequest(t *testing.T) {
errors.New("foo error"), errors.New("foo error"),
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
err := validatorClient.prepareBeaconProposer(ctx, nil) err := validatorClient.prepareBeaconProposer(ctx, nil)
assert.ErrorContains(t, "foo error", err) assert.ErrorContains(t, "foo error", err)
} }

View File

@@ -22,7 +22,7 @@ func (c *beaconApiValidatorClient) proposeAttestation(ctx context.Context, attes
} }
headers := map[string]string{"Eth-Consensus-Version": version.String(attestation.Version())} headers := map[string]string{"Eth-Consensus-Version": version.String(attestation.Version())}
err = c.jsonRestHandler.Post( err = c.handler.Post(
ctx, ctx,
"/eth/v2/beacon/pool/attestations", "/eth/v2/beacon/pool/attestations",
headers, headers,
@@ -51,7 +51,7 @@ func (c *beaconApiValidatorClient) proposeAttestationElectra(ctx context.Context
} }
consensusVersion := version.String(slots.ToForkVersion(attestation.Data.Slot)) consensusVersion := version.String(slots.ToForkVersion(attestation.Data.Slot))
headers := map[string]string{"Eth-Consensus-Version": consensusVersion} headers := map[string]string{"Eth-Consensus-Version": consensusVersion}
if err = c.jsonRestHandler.Post( if err = c.handler.Post(
ctx, ctx,
"/eth/v2/beacon/pool/attestations", "/eth/v2/beacon/pool/attestations",
headers, headers,

View File

@@ -107,7 +107,7 @@ func TestProposeAttestation(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
var marshalledAttestations []byte var marshalledAttestations []byte
if helpers.ValidateNilAttestation(test.attestation) == nil { if helpers.ValidateNilAttestation(test.attestation) == nil {
@@ -119,7 +119,7 @@ func TestProposeAttestation(t *testing.T) {
ctx := t.Context() ctx := t.Context()
headers := map[string]string{"Eth-Consensus-Version": version.String(test.attestation.Version())} headers := map[string]string{"Eth-Consensus-Version": version.String(test.attestation.Version())}
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/pool/attestations", "/eth/v2/beacon/pool/attestations",
headers, headers,
@@ -129,7 +129,7 @@ func TestProposeAttestation(t *testing.T) {
test.endpointError, test.endpointError,
).Times(test.endpointCall) ).Times(test.endpointCall)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
proposeResponse, err := validatorClient.proposeAttestation(ctx, test.attestation) proposeResponse, err := validatorClient.proposeAttestation(ctx, test.attestation)
if test.expectedErrorMessage != "" { if test.expectedErrorMessage != "" {
require.ErrorContains(t, test.expectedErrorMessage, err) require.ErrorContains(t, test.expectedErrorMessage, err)
@@ -254,7 +254,7 @@ func TestProposeAttestationElectra(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
var marshalledAttestations []byte var marshalledAttestations []byte
if helpers.ValidateNilAttestation(test.attestation) == nil { if helpers.ValidateNilAttestation(test.attestation) == nil {
@@ -268,7 +268,7 @@ func TestProposeAttestationElectra(t *testing.T) {
if test.expectedConsensusVersion != "" { if test.expectedConsensusVersion != "" {
headerMatcher = gomock.Eq(map[string]string{"Eth-Consensus-Version": test.expectedConsensusVersion}) headerMatcher = gomock.Eq(map[string]string{"Eth-Consensus-Version": test.expectedConsensusVersion})
} }
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/pool/attestations", "/eth/v2/beacon/pool/attestations",
headerMatcher, headerMatcher,
@@ -278,7 +278,7 @@ func TestProposeAttestationElectra(t *testing.T) {
test.endpointError, test.endpointError,
).Times(test.endpointCall) ).Times(test.endpointCall)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
proposeResponse, err := validatorClient.proposeAttestationElectra(ctx, test.attestation) proposeResponse, err := validatorClient.proposeAttestationElectra(ctx, test.attestation)
if test.expectedErrorMessage != "" { if test.expectedErrorMessage != "" {
require.ErrorContains(t, test.expectedErrorMessage, err) require.ErrorContains(t, test.expectedErrorMessage, err)

View File

@@ -67,7 +67,7 @@ func (c *beaconApiValidatorClient) proposeBeaconBlock(ctx context.Context, in *e
// Try PostSSZ first with SSZ data // Try PostSSZ first with SSZ data
if res.marshalledSSZ != nil { if res.marshalledSSZ != nil {
_, _, err = c.jsonRestHandler.PostSSZ(ctx, endpoint, headers, bytes.NewBuffer(res.marshalledSSZ)) _, _, err = c.handler.PostSSZ(ctx, endpoint, headers, bytes.NewBuffer(res.marshalledSSZ))
if err != nil { if err != nil {
errJson := &httputil.DefaultJsonError{} errJson := &httputil.DefaultJsonError{}
// If PostSSZ fails with 406 (Not Acceptable), fall back to JSON // If PostSSZ fails with 406 (Not Acceptable), fall back to JSON
@@ -81,7 +81,7 @@ func (c *beaconApiValidatorClient) proposeBeaconBlock(ctx context.Context, in *e
return nil, errors.Wrap(jsonErr, "failed to marshal JSON") return nil, errors.Wrap(jsonErr, "failed to marshal JSON")
} }
// Reset headers for JSON // Reset headers for JSON
err = c.jsonRestHandler.Post(ctx, endpoint, headers, bytes.NewBuffer(jsonData), nil) err = c.handler.Post(ctx, endpoint, headers, bytes.NewBuffer(jsonData), nil)
// If JSON also fails, return that error // If JSON also fails, return that error
if err != nil { if err != nil {
return nil, errors.Wrap(err, "failed to submit block via JSON fallback") return nil, errors.Wrap(err, "failed to submit block via JSON fallback")
@@ -100,7 +100,7 @@ func (c *beaconApiValidatorClient) proposeBeaconBlock(ctx context.Context, in *e
return nil, errors.Wrap(jsonErr, "failed to marshal JSON") return nil, errors.Wrap(jsonErr, "failed to marshal JSON")
} }
// Reset headers for JSON // Reset headers for JSON
err = c.jsonRestHandler.Post(ctx, endpoint, headers, bytes.NewBuffer(jsonData), nil) err = c.handler.Post(ctx, endpoint, headers, bytes.NewBuffer(jsonData), nil)
errJson := &httputil.DefaultJsonError{} errJson := &httputil.DefaultJsonError{}
if err != nil { if err != nil {
if !errors.As(err, &errJson) { if !errors.As(err, &errJson) {

View File

@@ -103,13 +103,13 @@ func TestProposeBeaconBlock_SSZ_Error(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
// Expect PostSSZ to be called first with SSZ data // Expect PostSSZ to be called first with SSZ data
headers := map[string]string{ headers := map[string]string{
"Eth-Consensus-Version": testCase.consensusVersion, "Eth-Consensus-Version": testCase.consensusVersion,
} }
jsonRestHandler.EXPECT().PostSSZ( handler.EXPECT().PostSSZ(
gomock.Any(), gomock.Any(),
testCase.endpoint, testCase.endpoint,
headers, headers,
@@ -120,7 +120,7 @@ func TestProposeBeaconBlock_SSZ_Error(t *testing.T) {
// No JSON fallback expected for non-406 errors // No JSON fallback expected for non-406 errors
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
_, err := validatorClient.proposeBeaconBlock(ctx, testCase.block) _, err := validatorClient.proposeBeaconBlock(ctx, testCase.block)
assert.ErrorContains(t, testSuite.expectedErrorMessage, err) assert.ErrorContains(t, testSuite.expectedErrorMessage, err)
}) })
@@ -165,13 +165,13 @@ func TestProposeBeaconBlock_SSZSuccess_NoFallback(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
// Expect PostSSZ to be called and succeed // Expect PostSSZ to be called and succeed
headers := map[string]string{ headers := map[string]string{
"Eth-Consensus-Version": testCase.consensusVersion, "Eth-Consensus-Version": testCase.consensusVersion,
} }
jsonRestHandler.EXPECT().PostSSZ( handler.EXPECT().PostSSZ(
gomock.Any(), gomock.Any(),
testCase.endpoint, testCase.endpoint,
headers, headers,
@@ -181,7 +181,7 @@ func TestProposeBeaconBlock_SSZSuccess_NoFallback(t *testing.T) {
).Times(1) ).Times(1)
// Post should NOT be called when PostSSZ succeeds // Post should NOT be called when PostSSZ succeeds
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
gomock.Any(), gomock.Any(),
gomock.Any(), gomock.Any(),
@@ -189,7 +189,7 @@ func TestProposeBeaconBlock_SSZSuccess_NoFallback(t *testing.T) {
gomock.Any(), gomock.Any(),
).Times(0) ).Times(0)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
_, err := validatorClient.proposeBeaconBlock(ctx, testCase.block) _, err := validatorClient.proposeBeaconBlock(ctx, testCase.block)
assert.NoError(t, err) assert.NoError(t, err)
}) })
@@ -200,7 +200,7 @@ func TestProposeBeaconBlock_NewerTypes_SSZMarshal(t *testing.T) {
t.Run("deneb", func(t *testing.T) { t.Run("deneb", func(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
var blockContents structs.SignedBeaconBlockContentsDeneb var blockContents structs.SignedBeaconBlockContentsDeneb
err := json.Unmarshal([]byte(rpctesting.DenebBlockContents), &blockContents) err := json.Unmarshal([]byte(rpctesting.DenebBlockContents), &blockContents)
@@ -211,14 +211,14 @@ func TestProposeBeaconBlock_NewerTypes_SSZMarshal(t *testing.T) {
denebBytes, err := genericSignedBlock.GetDeneb().MarshalSSZ() denebBytes, err := genericSignedBlock.GetDeneb().MarshalSSZ()
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler.EXPECT().PostSSZ( handler.EXPECT().PostSSZ(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks", "/eth/v2/beacon/blocks",
gomock.Any(), gomock.Any(),
bytes.NewBuffer(denebBytes), bytes.NewBuffer(denebBytes),
) )
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
proposeResponse, err := validatorClient.proposeBeaconBlock(t.Context(), genericSignedBlock) proposeResponse, err := validatorClient.proposeBeaconBlock(t.Context(), genericSignedBlock)
assert.NoError(t, err) assert.NoError(t, err)
require.NotNil(t, proposeResponse) require.NotNil(t, proposeResponse)
@@ -231,7 +231,7 @@ func TestProposeBeaconBlock_NewerTypes_SSZMarshal(t *testing.T) {
t.Run("blinded_deneb", func(t *testing.T) { t.Run("blinded_deneb", func(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
var blindedBlock structs.SignedBlindedBeaconBlockDeneb var blindedBlock structs.SignedBlindedBeaconBlockDeneb
err := json.Unmarshal([]byte(rpctesting.BlindedDenebBlock), &blindedBlock) err := json.Unmarshal([]byte(rpctesting.BlindedDenebBlock), &blindedBlock)
@@ -242,14 +242,14 @@ func TestProposeBeaconBlock_NewerTypes_SSZMarshal(t *testing.T) {
blindedDenebBytes, err := genericSignedBlock.GetBlindedDeneb().MarshalSSZ() blindedDenebBytes, err := genericSignedBlock.GetBlindedDeneb().MarshalSSZ()
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler.EXPECT().PostSSZ( handler.EXPECT().PostSSZ(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blinded_blocks", "/eth/v2/beacon/blinded_blocks",
gomock.Any(), gomock.Any(),
bytes.NewBuffer(blindedDenebBytes), bytes.NewBuffer(blindedDenebBytes),
) )
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
proposeResponse, err := validatorClient.proposeBeaconBlock(t.Context(), genericSignedBlock) proposeResponse, err := validatorClient.proposeBeaconBlock(t.Context(), genericSignedBlock)
assert.NoError(t, err) assert.NoError(t, err)
require.NotNil(t, proposeResponse) require.NotNil(t, proposeResponse)
@@ -262,7 +262,7 @@ func TestProposeBeaconBlock_NewerTypes_SSZMarshal(t *testing.T) {
t.Run("electra", func(t *testing.T) { t.Run("electra", func(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
var blockContents structs.SignedBeaconBlockContentsElectra var blockContents structs.SignedBeaconBlockContentsElectra
err := json.Unmarshal([]byte(rpctesting.ElectraBlockContents), &blockContents) err := json.Unmarshal([]byte(rpctesting.ElectraBlockContents), &blockContents)
@@ -273,14 +273,14 @@ func TestProposeBeaconBlock_NewerTypes_SSZMarshal(t *testing.T) {
electraBytes, err := genericSignedBlock.GetElectra().MarshalSSZ() electraBytes, err := genericSignedBlock.GetElectra().MarshalSSZ()
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler.EXPECT().PostSSZ( handler.EXPECT().PostSSZ(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks", "/eth/v2/beacon/blocks",
gomock.Any(), gomock.Any(),
bytes.NewBuffer(electraBytes), bytes.NewBuffer(electraBytes),
) )
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
proposeResponse, err := validatorClient.proposeBeaconBlock(t.Context(), genericSignedBlock) proposeResponse, err := validatorClient.proposeBeaconBlock(t.Context(), genericSignedBlock)
assert.NoError(t, err) assert.NoError(t, err)
require.NotNil(t, proposeResponse) require.NotNil(t, proposeResponse)
@@ -293,7 +293,7 @@ func TestProposeBeaconBlock_NewerTypes_SSZMarshal(t *testing.T) {
t.Run("blinded_electra", func(t *testing.T) { t.Run("blinded_electra", func(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
var blindedBlock structs.SignedBlindedBeaconBlockElectra var blindedBlock structs.SignedBlindedBeaconBlockElectra
err := json.Unmarshal([]byte(rpctesting.BlindedElectraBlock), &blindedBlock) err := json.Unmarshal([]byte(rpctesting.BlindedElectraBlock), &blindedBlock)
@@ -304,14 +304,14 @@ func TestProposeBeaconBlock_NewerTypes_SSZMarshal(t *testing.T) {
blindedElectraBytes, err := genericSignedBlock.GetBlindedElectra().MarshalSSZ() blindedElectraBytes, err := genericSignedBlock.GetBlindedElectra().MarshalSSZ()
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler.EXPECT().PostSSZ( handler.EXPECT().PostSSZ(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blinded_blocks", "/eth/v2/beacon/blinded_blocks",
gomock.Any(), gomock.Any(),
bytes.NewBuffer(blindedElectraBytes), bytes.NewBuffer(blindedElectraBytes),
) )
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
proposeResponse, err := validatorClient.proposeBeaconBlock(t.Context(), genericSignedBlock) proposeResponse, err := validatorClient.proposeBeaconBlock(t.Context(), genericSignedBlock)
assert.NoError(t, err) assert.NoError(t, err)
require.NotNil(t, proposeResponse) require.NotNil(t, proposeResponse)
@@ -324,7 +324,7 @@ func TestProposeBeaconBlock_NewerTypes_SSZMarshal(t *testing.T) {
t.Run("fulu", func(t *testing.T) { t.Run("fulu", func(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
var blockContents structs.SignedBeaconBlockContentsFulu var blockContents structs.SignedBeaconBlockContentsFulu
err := json.Unmarshal([]byte(rpctesting.FuluBlockContents), &blockContents) err := json.Unmarshal([]byte(rpctesting.FuluBlockContents), &blockContents)
@@ -335,14 +335,14 @@ func TestProposeBeaconBlock_NewerTypes_SSZMarshal(t *testing.T) {
fuluBytes, err := genericSignedBlock.GetFulu().MarshalSSZ() fuluBytes, err := genericSignedBlock.GetFulu().MarshalSSZ()
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler.EXPECT().PostSSZ( handler.EXPECT().PostSSZ(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks", "/eth/v2/beacon/blocks",
gomock.Any(), gomock.Any(),
bytes.NewBuffer(fuluBytes), bytes.NewBuffer(fuluBytes),
) )
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
proposeResponse, err := validatorClient.proposeBeaconBlock(t.Context(), genericSignedBlock) proposeResponse, err := validatorClient.proposeBeaconBlock(t.Context(), genericSignedBlock)
assert.NoError(t, err) assert.NoError(t, err)
require.NotNil(t, proposeResponse) require.NotNil(t, proposeResponse)
@@ -355,7 +355,7 @@ func TestProposeBeaconBlock_NewerTypes_SSZMarshal(t *testing.T) {
t.Run("blinded_fulu", func(t *testing.T) { t.Run("blinded_fulu", func(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
var blindedBlock structs.SignedBlindedBeaconBlockFulu var blindedBlock structs.SignedBlindedBeaconBlockFulu
err := json.Unmarshal([]byte(rpctesting.BlindedFuluBlock), &blindedBlock) err := json.Unmarshal([]byte(rpctesting.BlindedFuluBlock), &blindedBlock)
@@ -366,14 +366,14 @@ func TestProposeBeaconBlock_NewerTypes_SSZMarshal(t *testing.T) {
blindedFuluBytes, err := genericSignedBlock.GetBlindedFulu().MarshalSSZ() blindedFuluBytes, err := genericSignedBlock.GetBlindedFulu().MarshalSSZ()
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler.EXPECT().PostSSZ( handler.EXPECT().PostSSZ(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blinded_blocks", "/eth/v2/beacon/blinded_blocks",
gomock.Any(), gomock.Any(),
bytes.NewBuffer(blindedFuluBytes), bytes.NewBuffer(blindedFuluBytes),
) )
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
proposeResponse, err := validatorClient.proposeBeaconBlock(t.Context(), genericSignedBlock) proposeResponse, err := validatorClient.proposeBeaconBlock(t.Context(), genericSignedBlock)
assert.NoError(t, err) assert.NoError(t, err)
require.NotNil(t, proposeResponse) require.NotNil(t, proposeResponse)
@@ -588,10 +588,10 @@ func TestProposeBeaconBlock_SSZFails_406_FallbackToJSON(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
// Expect PostSSZ to be called first and fail // Expect PostSSZ to be called first and fail
jsonRestHandler.EXPECT().PostSSZ( handler.EXPECT().PostSSZ(
gomock.Any(), gomock.Any(),
testCase.endpoint, testCase.endpoint,
gomock.Any(), gomock.Any(),
@@ -603,7 +603,7 @@ func TestProposeBeaconBlock_SSZFails_406_FallbackToJSON(t *testing.T) {
}, },
).Times(1) ).Times(1)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
testCase.endpoint, testCase.endpoint,
gomock.Any(), gomock.Any(),
@@ -613,7 +613,7 @@ func TestProposeBeaconBlock_SSZFails_406_FallbackToJSON(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
_, err := validatorClient.proposeBeaconBlock(ctx, testCase.block) _, err := validatorClient.proposeBeaconBlock(ctx, testCase.block)
assert.NoError(t, err) assert.NoError(t, err)
}) })
@@ -643,13 +643,13 @@ func TestProposeBeaconBlock_SSZFails_Non406_NoFallback(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
// Expect PostSSZ to be called first and fail with non-406 error // Expect PostSSZ to be called first and fail with non-406 error
sszHeaders := map[string]string{ sszHeaders := map[string]string{
"Eth-Consensus-Version": testCase.consensusVersion, "Eth-Consensus-Version": testCase.consensusVersion,
} }
jsonRestHandler.EXPECT().PostSSZ( handler.EXPECT().PostSSZ(
gomock.Any(), gomock.Any(),
testCase.endpoint, testCase.endpoint,
sszHeaders, sszHeaders,
@@ -662,7 +662,7 @@ func TestProposeBeaconBlock_SSZFails_Non406_NoFallback(t *testing.T) {
).Times(1) ).Times(1)
// Post should NOT be called for non-406 errors // Post should NOT be called for non-406 errors
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
gomock.Any(), gomock.Any(),
gomock.Any(), gomock.Any(),
@@ -670,7 +670,7 @@ func TestProposeBeaconBlock_SSZFails_Non406_NoFallback(t *testing.T) {
gomock.Any(), gomock.Any(),
).Times(0) ).Times(0)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
_, err := validatorClient.proposeBeaconBlock(ctx, testCase.block) _, err := validatorClient.proposeBeaconBlock(ctx, testCase.block)
require.ErrorContains(t, "Internal server error", err) require.ErrorContains(t, "Internal server error", err)
}) })

View File

@@ -34,7 +34,7 @@ func (c *beaconApiValidatorClient) proposeExit(ctx context.Context, signedVolunt
return nil, errors.Wrap(err, "failed to marshal signed voluntary exit") return nil, errors.Wrap(err, "failed to marshal signed voluntary exit")
} }
if err = c.jsonRestHandler.Post( if err = c.handler.Post(
ctx, ctx,
"/eth/v1/beacon/pool/voluntary_exits", "/eth/v1/beacon/pool/voluntary_exits",
nil, nil,

View File

@@ -36,8 +36,8 @@ func TestProposeExit_Valid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
proposeExitTestEndpoint, proposeExitTestEndpoint,
nil, nil,
@@ -61,7 +61,7 @@ func TestProposeExit_Valid(t *testing.T) {
expectedExitRoot, err := protoSignedVoluntaryExit.Exit.HashTreeRoot() expectedExitRoot, err := protoSignedVoluntaryExit.Exit.HashTreeRoot()
require.NoError(t, err) require.NoError(t, err)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
exitResponse, err := validatorClient.proposeExit(ctx, protoSignedVoluntaryExit) exitResponse, err := validatorClient.proposeExit(ctx, protoSignedVoluntaryExit)
require.NoError(t, err) require.NoError(t, err)
assert.DeepEqual(t, expectedExitRoot[:], exitResponse.ExitRoot) assert.DeepEqual(t, expectedExitRoot[:], exitResponse.ExitRoot)
@@ -85,8 +85,8 @@ func TestProposeExit_BadRequest(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
proposeExitTestEndpoint, proposeExitTestEndpoint,
nil, nil,
@@ -104,7 +104,7 @@ func TestProposeExit_BadRequest(t *testing.T) {
Signature: []byte{3}, Signature: []byte{3},
} }
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
_, err := validatorClient.proposeExit(ctx, protoSignedVoluntaryExit) _, err := validatorClient.proposeExit(ctx, protoSignedVoluntaryExit)
assert.ErrorContains(t, "foo error", err) assert.ErrorContains(t, "foo error", err)
} }

View File

@@ -19,16 +19,16 @@ import (
) )
// NewPrysmChainClient returns implementation of iface.PrysmChainClient. // NewPrysmChainClient returns implementation of iface.PrysmChainClient.
func NewPrysmChainClient(jsonRestHandler rest.RestHandler, nodeClient iface.NodeClient) iface.PrysmChainClient { func NewPrysmChainClient(handler rest.Handler, nodeClient iface.NodeClient) iface.PrysmChainClient {
return prysmChainClient{ return prysmChainClient{
jsonRestHandler: jsonRestHandler, handler: handler,
nodeClient: nodeClient, nodeClient: nodeClient,
} }
} }
type prysmChainClient struct { type prysmChainClient struct {
jsonRestHandler rest.RestHandler handler rest.Handler
nodeClient iface.NodeClient nodeClient iface.NodeClient
} }
func (c prysmChainClient) ValidatorCount(ctx context.Context, stateID string, statuses []validator2.Status) ([]iface.ValidatorCount, error) { func (c prysmChainClient) ValidatorCount(ctx context.Context, stateID string, statuses []validator2.Status) ([]iface.ValidatorCount, error) {
@@ -50,7 +50,7 @@ func (c prysmChainClient) ValidatorCount(ctx context.Context, stateID string, st
queryUrl := apiutil.BuildURL(fmt.Sprintf("/eth/v1/beacon/states/%s/validator_count", stateID), queryParams) queryUrl := apiutil.BuildURL(fmt.Sprintf("/eth/v1/beacon/states/%s/validator_count", stateID), queryParams)
var validatorCountResponse structs.GetValidatorCountResponse var validatorCountResponse structs.GetValidatorCountResponse
if err = c.jsonRestHandler.Get(ctx, queryUrl, &validatorCountResponse); err != nil { if err = c.handler.Get(ctx, queryUrl, &validatorCountResponse); err != nil {
return nil, err return nil, err
} }
@@ -97,7 +97,7 @@ func (c prysmChainClient) ValidatorPerformance(ctx context.Context, in *ethpb.Va
return nil, errors.Wrap(err, "failed to marshal request") return nil, errors.Wrap(err, "failed to marshal request")
} }
resp := &structs.GetValidatorPerformanceResponse{} resp := &structs.GetValidatorPerformanceResponse{}
if err = c.jsonRestHandler.Post(ctx, "/prysm/validators/performance", nil, bytes.NewBuffer(request), resp); err != nil { if err = c.handler.Post(ctx, "/prysm/validators/performance", nil, bytes.NewBuffer(request), resp); err != nil {
return nil, err return nil, err
} }

View File

@@ -116,11 +116,11 @@ func TestGetValidatorCount(t *testing.T) {
defer ctrl.Finish() defer ctrl.Finish()
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
// Expect node version endpoint call. // Expect node version endpoint call.
var nodeVersionResponse structs.GetVersionResponse var nodeVersionResponse structs.GetVersionResponse
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/node/version", "/eth/v1/node/version",
&nodeVersionResponse, &nodeVersionResponse,
@@ -132,7 +132,7 @@ func TestGetValidatorCount(t *testing.T) {
) )
var validatorCountResponse structs.GetValidatorCountResponse var validatorCountResponse structs.GetValidatorCountResponse
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/states/head/validator_count?status=active", "/eth/v1/beacon/states/head/validator_count?status=active",
&validatorCountResponse, &validatorCountResponse,
@@ -145,8 +145,8 @@ func TestGetValidatorCount(t *testing.T) {
// Type assertion. // Type assertion.
var client iface.PrysmChainClient = &prysmChainClient{ var client iface.PrysmChainClient = &prysmChainClient{
nodeClient: &beaconApiNodeClient{jsonRestHandler: jsonRestHandler}, nodeClient: &beaconApiNodeClient{handler: handler},
jsonRestHandler: jsonRestHandler, handler: handler,
} }
countResponse, err := client.ValidatorCount(ctx, "head", []validator.Status{validator.Active}) countResponse, err := client.ValidatorCount(ctx, "head", []validator.Status{validator.Active})
@@ -177,10 +177,10 @@ func Test_beaconApiBeaconChainClient_GetValidatorPerformance(t *testing.T) {
PublicKeys: [][]byte{publicKeys[0][:], publicKeys[2][:], publicKeys[1][:]}, PublicKeys: [][]byte{publicKeys[0][:], publicKeys[2][:], publicKeys[1][:]},
}) })
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
// Expect node version endpoint call. // Expect node version endpoint call.
var nodeVersionResponse structs.GetVersionResponse var nodeVersionResponse structs.GetVersionResponse
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/node/version", "/eth/v1/node/version",
&nodeVersionResponse, &nodeVersionResponse,
@@ -196,7 +196,7 @@ func Test_beaconApiBeaconChainClient_GetValidatorPerformance(t *testing.T) {
wantResponse := &structs.GetValidatorPerformanceResponse{} wantResponse := &structs.GetValidatorPerformanceResponse{}
want := &ethpb.ValidatorPerformanceResponse{} want := &ethpb.ValidatorPerformanceResponse{}
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/prysm/validators/performance", "/prysm/validators/performance",
nil, nil,
@@ -207,8 +207,8 @@ func Test_beaconApiBeaconChainClient_GetValidatorPerformance(t *testing.T) {
) )
var client iface.PrysmChainClient = &prysmChainClient{ var client iface.PrysmChainClient = &prysmChainClient{
nodeClient: &beaconApiNodeClient{jsonRestHandler: jsonRestHandler}, nodeClient: &beaconApiNodeClient{handler: handler},
jsonRestHandler: jsonRestHandler, handler: handler,
} }
got, err := client.ValidatorPerformance(ctx, &ethpb.ValidatorPerformanceRequest{ got, err := client.ValidatorPerformance(ctx, &ethpb.ValidatorPerformanceRequest{

View File

@@ -24,5 +24,5 @@ func (c *beaconApiValidatorClient) submitValidatorRegistrations(ctx context.Cont
return errors.Wrap(err, "failed to marshal registration") return errors.Wrap(err, "failed to marshal registration")
} }
return c.jsonRestHandler.Post(ctx, endpoint, nil, bytes.NewBuffer(marshalledJsonRegistration), nil) return c.handler.Post(ctx, endpoint, nil, bytes.NewBuffer(marshalledJsonRegistration), nil)
} }

View File

@@ -65,8 +65,8 @@ func TestRegistration_Valid(t *testing.T) {
marshalledJsonRegistrations, err := json.Marshal(jsonRegistrations) marshalledJsonRegistrations, err := json.Marshal(jsonRegistrations)
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v1/validator/register_validator", "/eth/v1/validator/register_validator",
nil, nil,
@@ -129,7 +129,7 @@ func TestRegistration_Valid(t *testing.T) {
}, },
} }
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
res, err := validatorClient.SubmitValidatorRegistrations(t.Context(), &protoRegistrations) res, err := validatorClient.SubmitValidatorRegistrations(t.Context(), &protoRegistrations)
assert.DeepEqual(t, new(empty.Empty), res) assert.DeepEqual(t, new(empty.Empty), res)
@@ -140,8 +140,8 @@ func TestRegistration_BadRequest(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v1/validator/register_validator", "/eth/v1/validator/register_validator",
nil, nil,
@@ -151,7 +151,7 @@ func TestRegistration_BadRequest(t *testing.T) {
errors.New("foo error"), errors.New("foo error"),
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
_, err := validatorClient.SubmitValidatorRegistrations(t.Context(), &ethpb.SignedValidatorRegistrationsV1{}) _, err := validatorClient.SubmitValidatorRegistrations(t.Context(), &ethpb.SignedValidatorRegistrationsV1{})
assert.ErrorContains(t, "foo error", err) assert.ErrorContains(t, "foo error", err)
} }

View File

@@ -44,9 +44,9 @@ func TestGet(t *testing.T) {
server := httptest.NewServer(mux) server := httptest.NewServer(mux)
defer server.Close() defer server.Close()
jsonRestHandler := rest.NewRestHandler(http.Client{Timeout: time.Second * 5}, server.URL) handler := rest.NewHandler(http.Client{Timeout: time.Second * 5}, server.URL)
resp := &structs.GetGenesisResponse{} resp := &structs.GetGenesisResponse{}
require.NoError(t, jsonRestHandler.Get(ctx, endpoint+"?arg1=abc&arg2=def", resp)) require.NoError(t, handler.Get(ctx, endpoint+"?arg1=abc&arg2=def", resp))
assert.DeepEqual(t, genesisJson, resp) assert.DeepEqual(t, genesisJson, resp)
} }
@@ -75,9 +75,9 @@ func TestGetSSZ(t *testing.T) {
server := httptest.NewServer(mux) server := httptest.NewServer(mux)
defer server.Close() defer server.Close()
jsonRestHandler := rest.NewRestHandler(http.Client{Timeout: time.Second * 5}, server.URL) handler := rest.NewHandler(http.Client{Timeout: time.Second * 5}, server.URL)
body, header, err := jsonRestHandler.GetSSZ(ctx, endpoint) body, header, err := handler.GetSSZ(ctx, endpoint)
require.NoError(t, err) require.NoError(t, err)
assert.DeepEqual(t, expectedBody, body) assert.DeepEqual(t, expectedBody, body)
require.StringContains(t, api.OctetStreamMediaType, header.Get("Content-Type")) require.StringContains(t, api.OctetStreamMediaType, header.Get("Content-Type"))
@@ -101,9 +101,9 @@ func TestGetSSZ(t *testing.T) {
server := httptest.NewServer(mux) server := httptest.NewServer(mux)
defer server.Close() defer server.Close()
jsonRestHandler := rest.NewRestHandler(http.Client{Timeout: time.Second * 5}, server.URL) handler := rest.NewHandler(http.Client{Timeout: time.Second * 5}, server.URL)
body, header, err := jsonRestHandler.GetSSZ(ctx, endpoint) body, header, err := handler.GetSSZ(ctx, endpoint)
require.NoError(t, err) require.NoError(t, err)
assert.LogsContain(t, logHook, "Server responded with non primary accept type") assert.LogsContain(t, logHook, "Server responded with non primary accept type")
require.Equal(t, api.JsonMediaType, header.Get("Content-Type")) require.Equal(t, api.JsonMediaType, header.Get("Content-Type"))
@@ -126,9 +126,9 @@ func TestGetSSZ(t *testing.T) {
server := httptest.NewServer(mux) server := httptest.NewServer(mux)
defer server.Close() defer server.Close()
jsonRestHandler := rest.NewRestHandler(http.Client{Timeout: time.Second * 5}, server.URL) handler := rest.NewHandler(http.Client{Timeout: time.Second * 5}, server.URL)
_, _, err := jsonRestHandler.GetSSZ(ctx, endpoint) _, _, err := handler.GetSSZ(ctx, endpoint)
require.NoError(t, err) require.NoError(t, err)
assert.LogsContain(t, logHook, "Server responded with non primary accept type") assert.LogsContain(t, logHook, "Server responded with non primary accept type")
}) })
@@ -148,7 +148,7 @@ func TestAcceptOverrideSSZ(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
})) }))
defer srv.Close() defer srv.Close()
c := rest.NewRestHandler(http.Client{Timeout: time.Second * 5}, srv.URL) c := rest.NewHandler(http.Client{Timeout: time.Second * 5}, srv.URL)
_, _, err := c.GetSSZ(t.Context(), "/test") _, _, err := c.GetSSZ(t.Context(), "/test")
require.NoError(t, err) require.NoError(t, err)
} }
@@ -191,9 +191,9 @@ func TestPost(t *testing.T) {
server := httptest.NewServer(mux) server := httptest.NewServer(mux)
defer server.Close() defer server.Close()
jsonRestHandler := rest.NewRestHandler(http.Client{Timeout: time.Second * 5}, server.URL) handler := rest.NewHandler(http.Client{Timeout: time.Second * 5}, server.URL)
resp := &structs.GetGenesisResponse{} resp := &structs.GetGenesisResponse{}
require.NoError(t, jsonRestHandler.Post(ctx, endpoint, headers, bytes.NewBuffer(dataBytes), resp)) require.NoError(t, handler.Post(ctx, endpoint, headers, bytes.NewBuffer(dataBytes), resp))
assert.DeepEqual(t, genesisJson, resp) assert.DeepEqual(t, genesisJson, resp)
} }
@@ -238,18 +238,18 @@ func TestGetStatusCode(t *testing.T) {
server := httptest.NewServer(mux) server := httptest.NewServer(mux)
defer server.Close() defer server.Close()
jsonRestHandler := rest.NewRestHandler(http.Client{Timeout: time.Second * 5}, server.URL) handler := rest.NewHandler(http.Client{Timeout: time.Second * 5}, server.URL)
statusCode, err := jsonRestHandler.GetStatusCode(ctx, endpoint) statusCode, err := handler.GetStatusCode(ctx, endpoint)
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, tc.expectedStatusCode, statusCode) assert.Equal(t, tc.expectedStatusCode, statusCode)
}) })
} }
t.Run("returns error on connection failure", func(t *testing.T) { t.Run("returns error on connection failure", func(t *testing.T) {
jsonRestHandler := rest.NewRestHandler(http.Client{Timeout: time.Millisecond * 100}, "http://localhost:99999") handler := rest.NewHandler(http.Client{Timeout: time.Millisecond * 100}, "http://localhost:99999")
_, err := jsonRestHandler.GetStatusCode(ctx, endpoint) _, err := handler.GetStatusCode(ctx, endpoint)
require.ErrorContains(t, "failed to perform request", err) require.ErrorContains(t, "failed to perform request", err)
}) })
} }

View File

@@ -22,7 +22,7 @@ type StateValidatorsProvider interface {
} }
type beaconApiStateValidatorsProvider struct { type beaconApiStateValidatorsProvider struct {
jsonRestHandler rest.RestHandler handler rest.Handler
} }
func (c beaconApiStateValidatorsProvider) StateValidators( func (c beaconApiStateValidatorsProvider) StateValidators(
@@ -94,7 +94,7 @@ func (c beaconApiStateValidatorsProvider) getStateValidatorsHelper(
} }
stateValidatorsJson := &structs.GetValidatorsResponse{} stateValidatorsJson := &structs.GetValidatorsResponse{}
// First try POST endpoint to check whether it is supported by the beacon node. // First try POST endpoint to check whether it is supported by the beacon node.
if err = c.jsonRestHandler.Post(ctx, endpoint, nil, bytes.NewBuffer(reqBytes), stateValidatorsJson); err == nil { if err = c.handler.Post(ctx, endpoint, nil, bytes.NewBuffer(reqBytes), stateValidatorsJson); err == nil {
if stateValidatorsJson.Data == nil { if stateValidatorsJson.Data == nil {
return nil, errors.New("stateValidatorsJson.Data is nil") return nil, errors.New("stateValidatorsJson.Data is nil")
} }
@@ -116,7 +116,7 @@ func (c beaconApiStateValidatorsProvider) getStateValidatorsHelper(
query := apiutil.BuildURL(endpoint, queryParams) query := apiutil.BuildURL(endpoint, queryParams)
err = c.jsonRestHandler.Get(ctx, query, stateValidatorsJson) err = c.handler.Get(ctx, query, stateValidatorsJson)
if err != nil { if err != nil {
return nil, err return nil, err
} }

View File

@@ -34,7 +34,7 @@ func TestGetStateValidators_Nominal_POST(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
stateValidatorsResponseJson := structs.GetValidatorsResponse{} stateValidatorsResponseJson := structs.GetValidatorsResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
wanted := []*structs.ValidatorContainer{ wanted := []*structs.ValidatorContainer{
{ {
@@ -69,7 +69,7 @@ func TestGetStateValidators_Nominal_POST(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/states/head/validators", "/eth/v1/beacon/states/head/validators",
nil, nil,
@@ -84,7 +84,7 @@ func TestGetStateValidators_Nominal_POST(t *testing.T) {
}, },
).Times(1) ).Times(1)
stateValidatorsProvider := beaconApiStateValidatorsProvider{jsonRestHandler: jsonRestHandler} stateValidatorsProvider := beaconApiStateValidatorsProvider{handler: handler}
actual, err := stateValidatorsProvider.StateValidators(ctx, []string{ actual, err := stateValidatorsProvider.StateValidators(ctx, []string{
"0x8000091c2ae64ee414a54c1cc1fc67dec663408bc636cb86756e0200e41a75c8f86603f104f02c856983d2783116be13", // active_ongoing "0x8000091c2ae64ee414a54c1cc1fc67dec663408bc636cb86756e0200e41a75c8f86603f104f02c856983d2783116be13", // active_ongoing
"0x80000e851c0f53c3246ff726d7ff7766661ca5e12a07c45c114d208d54f0f8233d4380b2e9aff759d69795d1df905526", // active_exiting "0x80000e851c0f53c3246ff726d7ff7766661ca5e12a07c45c114d208d54f0f8233d4380b2e9aff759d69795d1df905526", // active_exiting
@@ -120,7 +120,7 @@ func TestGetStateValidators_Nominal_GET(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
stateValidatorsResponseJson := structs.GetValidatorsResponse{} stateValidatorsResponseJson := structs.GetValidatorsResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
wanted := []*structs.ValidatorContainer{ wanted := []*structs.ValidatorContainer{
{ {
@@ -156,7 +156,7 @@ func TestGetStateValidators_Nominal_GET(t *testing.T) {
ctx := t.Context() ctx := t.Context()
// First return an error from POST call. // First return an error from POST call.
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/states/head/validators", "/eth/v1/beacon/states/head/validators",
nil, nil,
@@ -177,7 +177,7 @@ func TestGetStateValidators_Nominal_GET(t *testing.T) {
query := apiutil.BuildURL("/eth/v1/beacon/states/head/validators", queryParams) query := apiutil.BuildURL("/eth/v1/beacon/states/head/validators", queryParams)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
query, query,
&stateValidatorsResponseJson, &stateValidatorsResponseJson,
@@ -190,7 +190,7 @@ func TestGetStateValidators_Nominal_GET(t *testing.T) {
}, },
).Times(1) ).Times(1)
stateValidatorsProvider := beaconApiStateValidatorsProvider{jsonRestHandler: jsonRestHandler} stateValidatorsProvider := beaconApiStateValidatorsProvider{handler: handler}
actual, err := stateValidatorsProvider.StateValidators(ctx, []string{ actual, err := stateValidatorsProvider.StateValidators(ctx, []string{
"0x8000091c2ae64ee414a54c1cc1fc67dec663408bc636cb86756e0200e41a75c8f86603f104f02c856983d2783116be13", // active_ongoing "0x8000091c2ae64ee414a54c1cc1fc67dec663408bc636cb86756e0200e41a75c8f86603f104f02c856983d2783116be13", // active_ongoing
"0x80000e851c0f53c3246ff726d7ff7766661ca5e12a07c45c114d208d54f0f8233d4380b2e9aff759d69795d1df905526", // active_exiting "0x80000e851c0f53c3246ff726d7ff7766661ca5e12a07c45c114d208d54f0f8233d4380b2e9aff759d69795d1df905526", // active_exiting
@@ -220,12 +220,12 @@ func TestGetStateValidators_GetRestJsonResponseOnError(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
stateValidatorsResponseJson := structs.GetValidatorsResponse{} stateValidatorsResponseJson := structs.GetValidatorsResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
ctx := t.Context() ctx := t.Context()
// First call POST. // First call POST.
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/states/head/validators", "/eth/v1/beacon/states/head/validators",
nil, nil,
@@ -246,7 +246,7 @@ func TestGetStateValidators_GetRestJsonResponseOnError(t *testing.T) {
query := apiutil.BuildURL("/eth/v1/beacon/states/head/validators", queryParams) query := apiutil.BuildURL("/eth/v1/beacon/states/head/validators", queryParams)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
query, query,
&stateValidatorsResponseJson, &stateValidatorsResponseJson,
@@ -254,7 +254,7 @@ func TestGetStateValidators_GetRestJsonResponseOnError(t *testing.T) {
errors.New("an error"), errors.New("an error"),
).Times(1) ).Times(1)
stateValidatorsProvider := beaconApiStateValidatorsProvider{jsonRestHandler: jsonRestHandler} stateValidatorsProvider := beaconApiStateValidatorsProvider{handler: handler}
_, err = stateValidatorsProvider.StateValidators(ctx, []string{ _, err = stateValidatorsProvider.StateValidators(ctx, []string{
"0x8000091c2ae64ee414a54c1cc1fc67dec663408bc636cb86756e0200e41a75c8f86603f104f02c856983d2783116be13", // active_ongoing "0x8000091c2ae64ee414a54c1cc1fc67dec663408bc636cb86756e0200e41a75c8f86603f104f02c856983d2783116be13", // active_ongoing
}, },
@@ -277,9 +277,9 @@ func TestGetStateValidators_DataIsNil_POST(t *testing.T) {
ctx := t.Context() ctx := t.Context()
stateValidatorsResponseJson := structs.GetValidatorsResponse{} stateValidatorsResponseJson := structs.GetValidatorsResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/states/head/validators", "/eth/v1/beacon/states/head/validators",
nil, bytes.NewBuffer(reqBytes), nil, bytes.NewBuffer(reqBytes),
@@ -293,7 +293,7 @@ func TestGetStateValidators_DataIsNil_POST(t *testing.T) {
}, },
).Times(1) ).Times(1)
stateValidatorsProvider := beaconApiStateValidatorsProvider{jsonRestHandler: jsonRestHandler} stateValidatorsProvider := beaconApiStateValidatorsProvider{handler: handler}
_, err = stateValidatorsProvider.StateValidators(ctx, []string{ _, err = stateValidatorsProvider.StateValidators(ctx, []string{
"0x8000091c2ae64ee414a54c1cc1fc67dec663408bc636cb86756e0200e41a75c8f86603f104f02c856983d2783116be13", // active_ongoing "0x8000091c2ae64ee414a54c1cc1fc67dec663408bc636cb86756e0200e41a75c8f86603f104f02c856983d2783116be13", // active_ongoing
}, },
@@ -316,10 +316,10 @@ func TestGetStateValidators_DataIsNil_GET(t *testing.T) {
ctx := t.Context() ctx := t.Context()
stateValidatorsResponseJson := structs.GetValidatorsResponse{} stateValidatorsResponseJson := structs.GetValidatorsResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
// First call POST which will return an error. // First call POST which will return an error.
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/states/head/validators", "/eth/v1/beacon/states/head/validators",
nil, nil,
@@ -340,7 +340,7 @@ func TestGetStateValidators_DataIsNil_GET(t *testing.T) {
query := apiutil.BuildURL("/eth/v1/beacon/states/head/validators", queryParams) query := apiutil.BuildURL("/eth/v1/beacon/states/head/validators", queryParams)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
query, query,
&stateValidatorsResponseJson, &stateValidatorsResponseJson,
@@ -353,7 +353,7 @@ func TestGetStateValidators_DataIsNil_GET(t *testing.T) {
}, },
).Times(1) ).Times(1)
stateValidatorsProvider := beaconApiStateValidatorsProvider{jsonRestHandler: jsonRestHandler} stateValidatorsProvider := beaconApiStateValidatorsProvider{handler: handler}
_, err = stateValidatorsProvider.StateValidators(ctx, []string{ _, err = stateValidatorsProvider.StateValidators(ctx, []string{
"0x8000091c2ae64ee414a54c1cc1fc67dec663408bc636cb86756e0200e41a75c8f86603f104f02c856983d2783116be13", // active_ongoing "0x8000091c2ae64ee414a54c1cc1fc67dec663408bc636cb86756e0200e41a75c8f86603f104f02c856983d2783116be13", // active_ongoing
}, },

View File

@@ -50,19 +50,19 @@ func TestValidatorStatus_Nominal(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
validatorClient := beaconApiValidatorClient{ validatorClient := beaconApiValidatorClient{
stateValidatorsProvider: stateValidatorsProvider, stateValidatorsProvider: stateValidatorsProvider,
prysmChainClient: prysmChainClient{ prysmChainClient: prysmChainClient{
nodeClient: &beaconApiNodeClient{ nodeClient: &beaconApiNodeClient{
jsonRestHandler: jsonRestHandler, handler: handler,
}, },
}, },
} }
// Expect node version endpoint call. // Expect node version endpoint call.
var nodeVersionResponse structs.GetVersionResponse var nodeVersionResponse structs.GetVersionResponse
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/node/version", "/eth/v1/node/version",
&nodeVersionResponse, &nodeVersionResponse,
@@ -165,11 +165,11 @@ func TestMultipleValidatorStatus_Nominal(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
// Expect node version endpoint call. // Expect node version endpoint call.
var nodeVersionResponse structs.GetVersionResponse var nodeVersionResponse structs.GetVersionResponse
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/node/version", "/eth/v1/node/version",
&nodeVersionResponse, &nodeVersionResponse,
@@ -181,7 +181,7 @@ func TestMultipleValidatorStatus_Nominal(t *testing.T) {
stateValidatorsProvider: stateValidatorsProvider, stateValidatorsProvider: stateValidatorsProvider,
prysmChainClient: prysmChainClient{ prysmChainClient: prysmChainClient{
nodeClient: &beaconApiNodeClient{ nodeClient: &beaconApiNodeClient{
jsonRestHandler: jsonRestHandler, handler: handler,
}, },
}, },
} }
@@ -317,11 +317,11 @@ func TestGetValidatorsStatusResponse_Nominal_SomeActiveValidators(t *testing.T)
nil, nil,
).Times(1) ).Times(1)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
// Expect node version endpoint call. // Expect node version endpoint call.
var nodeVersionResponse structs.GetVersionResponse var nodeVersionResponse structs.GetVersionResponse
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/node/version", "/eth/v1/node/version",
&nodeVersionResponse, &nodeVersionResponse,
@@ -333,7 +333,7 @@ func TestGetValidatorsStatusResponse_Nominal_SomeActiveValidators(t *testing.T)
).Times(1) ).Times(1)
var validatorCountResponse structs.GetValidatorCountResponse var validatorCountResponse structs.GetValidatorCountResponse
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/states/head/validator_count?", "/eth/v1/beacon/states/head/validator_count?",
&validatorCountResponse, &validatorCountResponse,
@@ -420,9 +420,9 @@ func TestGetValidatorsStatusResponse_Nominal_SomeActiveValidators(t *testing.T)
stateValidatorsProvider: stateValidatorsProvider, stateValidatorsProvider: stateValidatorsProvider,
prysmChainClient: prysmChainClient{ prysmChainClient: prysmChainClient{
nodeClient: &beaconApiNodeClient{ nodeClient: &beaconApiNodeClient{
jsonRestHandler: jsonRestHandler, handler: handler,
}, },
jsonRestHandler: jsonRestHandler, handler: handler,
}, },
} }
actualValidatorsPubKey, actualValidatorsIndex, actualValidatorsStatusResponse, err := validatorClient.validatorsStatusResponse(ctx, validatorsPubKey, validatorsIndex) actualValidatorsPubKey, actualValidatorsIndex, actualValidatorsStatusResponse, err := validatorClient.validatorsStatusResponse(ctx, validatorsPubKey, validatorsIndex)
@@ -465,11 +465,11 @@ func TestGetValidatorsStatusResponse_Nominal_NoActiveValidators(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
// Expect node version endpoint call. // Expect node version endpoint call.
var nodeVersionResponse structs.GetVersionResponse var nodeVersionResponse structs.GetVersionResponse
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/node/version", "/eth/v1/node/version",
&nodeVersionResponse, &nodeVersionResponse,
@@ -490,9 +490,9 @@ func TestGetValidatorsStatusResponse_Nominal_NoActiveValidators(t *testing.T) {
stateValidatorsProvider: stateValidatorsProvider, stateValidatorsProvider: stateValidatorsProvider,
prysmChainClient: prysmChainClient{ prysmChainClient: prysmChainClient{
nodeClient: &beaconApiNodeClient{ nodeClient: &beaconApiNodeClient{
jsonRestHandler: jsonRestHandler, handler: handler,
}, },
jsonRestHandler: jsonRestHandler, handler: handler,
}, },
} }
actualValidatorsPubKey, actualValidatorsIndex, actualValidatorsStatusResponse, err := validatorClient.validatorsStatusResponse(ctx, wantedValidatorsPubKey, nil) actualValidatorsPubKey, actualValidatorsIndex, actualValidatorsStatusResponse, err := validatorClient.validatorsStatusResponse(ctx, wantedValidatorsPubKey, nil)
@@ -704,11 +704,11 @@ func TestValidatorStatusResponse_InvalidData(t *testing.T) {
testCase.inputGetStateValidatorsInterface.outputErr, testCase.inputGetStateValidatorsInterface.outputErr,
).Times(1) ).Times(1)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
// Expect node version endpoint call. // Expect node version endpoint call.
var nodeVersionResponse structs.GetVersionResponse var nodeVersionResponse structs.GetVersionResponse
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/node/version", "/eth/v1/node/version",
&nodeVersionResponse, &nodeVersionResponse,
@@ -720,9 +720,9 @@ func TestValidatorStatusResponse_InvalidData(t *testing.T) {
stateValidatorsProvider: stateValidatorsProvider, stateValidatorsProvider: stateValidatorsProvider,
prysmChainClient: prysmChainClient{ prysmChainClient: prysmChainClient{
nodeClient: &beaconApiNodeClient{ nodeClient: &beaconApiNodeClient{
jsonRestHandler: jsonRestHandler, handler: handler,
}, },
jsonRestHandler: jsonRestHandler, handler: handler,
}, },
} }

View File

@@ -72,7 +72,7 @@ func (c *beaconApiValidatorClient) headSignedBeaconBlock(ctx context.Context) (*
// Since we don't know yet what the json looks like, we unmarshal into an abstract structure that has only a version // Since we don't know yet what the json looks like, we unmarshal into an abstract structure that has only a version
// and a blob of data // and a blob of data
signedBlockResponseJson := abstractSignedBlockResponseJson{} signedBlockResponseJson := abstractSignedBlockResponseJson{}
if err := c.jsonRestHandler.Get(ctx, "/eth/v2/beacon/blocks/head", &signedBlockResponseJson); err != nil { if err := c.handler.Get(ctx, "/eth/v2/beacon/blocks/head", &signedBlockResponseJson); err != nil {
return nil, err return nil, err
} }

View File

@@ -24,8 +24,8 @@ func TestStreamBlocks_UnsupportedConsensusVersion(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
gomock.Any(), gomock.Any(),
&abstractSignedBlockResponseJson{}, &abstractSignedBlockResponseJson{},
@@ -36,7 +36,7 @@ func TestStreamBlocks_UnsupportedConsensusVersion(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
streamBlocksClient := validatorClient.streamBlocks(ctx, &eth.StreamBlocksRequest{}, time.Millisecond*100) streamBlocksClient := validatorClient.streamBlocks(ctx, &eth.StreamBlocksRequest{}, time.Millisecond*100)
_, err := streamBlocksClient.Recv() _, err := streamBlocksClient.Recv()
assert.ErrorContains(t, "unsupported consensus version `foo`", err) assert.ErrorContains(t, "unsupported consensus version `foo`", err)
@@ -146,8 +146,8 @@ func TestStreamBlocks_Error(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
gomock.Any(), gomock.Any(),
&abstractSignedBlockResponseJson{}, &abstractSignedBlockResponseJson{},
@@ -162,7 +162,7 @@ func TestStreamBlocks_Error(t *testing.T) {
).Times(1) ).Times(1)
beaconBlockConverter := testSuite.generateBeaconBlockConverter(ctrl, testCase.conversionError) beaconBlockConverter := testSuite.generateBeaconBlockConverter(ctrl, testCase.conversionError)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler, beaconBlockConverter: beaconBlockConverter} validatorClient := &beaconApiValidatorClient{handler: handler, beaconBlockConverter: beaconBlockConverter}
streamBlocksClient := validatorClient.streamBlocks(ctx, &eth.StreamBlocksRequest{}, time.Millisecond*100) streamBlocksClient := validatorClient.streamBlocks(ctx, &eth.StreamBlocksRequest{}, time.Millisecond*100)
_, err := streamBlocksClient.Recv() _, err := streamBlocksClient.Recv()
@@ -197,7 +197,7 @@ func TestStreamBlocks_Phase0Valid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
signedBlockResponseJson := abstractSignedBlockResponseJson{} signedBlockResponseJson := abstractSignedBlockResponseJson{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
beaconBlockConverter := mock.NewMockBeaconBlockConverter(ctrl) beaconBlockConverter := mock.NewMockBeaconBlockConverter(ctrl)
// For the first call, return a block that satisfies the verifiedOnly condition. This block should be returned by the first Recv(). // For the first call, return a block that satisfies the verifiedOnly condition. This block should be returned by the first Recv().
@@ -212,7 +212,7 @@ func TestStreamBlocks_Phase0Valid(t *testing.T) {
marshalledSignedBeaconBlockContainer1, err := json.Marshal(signedBeaconBlockContainer1) marshalledSignedBeaconBlockContainer1, err := json.Marshal(signedBeaconBlockContainer1)
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks/head", "/eth/v2/beacon/blocks/head",
&signedBlockResponseJson, &signedBlockResponseJson,
@@ -249,7 +249,7 @@ func TestStreamBlocks_Phase0Valid(t *testing.T) {
marshalledSignedBeaconBlockContainer2, err := json.Marshal(signedBeaconBlockContainer2) marshalledSignedBeaconBlockContainer2, err := json.Marshal(signedBeaconBlockContainer2)
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks/head", "/eth/v2/beacon/blocks/head",
&signedBlockResponseJson, &signedBlockResponseJson,
@@ -276,7 +276,7 @@ func TestStreamBlocks_Phase0Valid(t *testing.T) {
// The fourth call is only necessary when verifiedOnly == true since the previous block was optimistic // The fourth call is only necessary when verifiedOnly == true since the previous block was optimistic
if testCase.verifiedOnly { if testCase.verifiedOnly {
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks/head", "/eth/v2/beacon/blocks/head",
&signedBlockResponseJson, &signedBlockResponseJson,
@@ -299,7 +299,7 @@ func TestStreamBlocks_Phase0Valid(t *testing.T) {
).Times(1) ).Times(1)
} }
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler, beaconBlockConverter: beaconBlockConverter} validatorClient := &beaconApiValidatorClient{handler: handler, beaconBlockConverter: beaconBlockConverter}
streamBlocksClient := validatorClient.streamBlocks(ctx, &eth.StreamBlocksRequest{VerifiedOnly: testCase.verifiedOnly}, time.Millisecond*100) streamBlocksClient := validatorClient.streamBlocks(ctx, &eth.StreamBlocksRequest{VerifiedOnly: testCase.verifiedOnly}, time.Millisecond*100)
// Get the first block // Get the first block
@@ -358,7 +358,7 @@ func TestStreamBlocks_AltairValid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
signedBlockResponseJson := abstractSignedBlockResponseJson{} signedBlockResponseJson := abstractSignedBlockResponseJson{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
beaconBlockConverter := mock.NewMockBeaconBlockConverter(ctrl) beaconBlockConverter := mock.NewMockBeaconBlockConverter(ctrl)
// For the first call, return a block that satisfies the verifiedOnly condition. This block should be returned by the first Recv(). // For the first call, return a block that satisfies the verifiedOnly condition. This block should be returned by the first Recv().
@@ -373,7 +373,7 @@ func TestStreamBlocks_AltairValid(t *testing.T) {
marshalledSignedBeaconBlockContainer1, err := json.Marshal(signedBeaconBlockContainer1) marshalledSignedBeaconBlockContainer1, err := json.Marshal(signedBeaconBlockContainer1)
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks/head", "/eth/v2/beacon/blocks/head",
&signedBlockResponseJson, &signedBlockResponseJson,
@@ -410,7 +410,7 @@ func TestStreamBlocks_AltairValid(t *testing.T) {
marshalledSignedBeaconBlockContainer2, err := json.Marshal(signedBeaconBlockContainer2) marshalledSignedBeaconBlockContainer2, err := json.Marshal(signedBeaconBlockContainer2)
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks/head", "/eth/v2/beacon/blocks/head",
&signedBlockResponseJson, &signedBlockResponseJson,
@@ -437,7 +437,7 @@ func TestStreamBlocks_AltairValid(t *testing.T) {
// The fourth call is only necessary when verifiedOnly == true since the previous block was optimistic // The fourth call is only necessary when verifiedOnly == true since the previous block was optimistic
if testCase.verifiedOnly { if testCase.verifiedOnly {
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks/head", "/eth/v2/beacon/blocks/head",
&signedBlockResponseJson, &signedBlockResponseJson,
@@ -460,7 +460,7 @@ func TestStreamBlocks_AltairValid(t *testing.T) {
).Times(1) ).Times(1)
} }
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler, beaconBlockConverter: beaconBlockConverter} validatorClient := &beaconApiValidatorClient{handler: handler, beaconBlockConverter: beaconBlockConverter}
streamBlocksClient := validatorClient.streamBlocks(ctx, &eth.StreamBlocksRequest{VerifiedOnly: testCase.verifiedOnly}, time.Millisecond*100) streamBlocksClient := validatorClient.streamBlocks(ctx, &eth.StreamBlocksRequest{VerifiedOnly: testCase.verifiedOnly}, time.Millisecond*100)
// Get the first block // Get the first block
@@ -519,7 +519,7 @@ func TestStreamBlocks_BellatrixValid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
signedBlockResponseJson := abstractSignedBlockResponseJson{} signedBlockResponseJson := abstractSignedBlockResponseJson{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
beaconBlockConverter := mock.NewMockBeaconBlockConverter(ctrl) beaconBlockConverter := mock.NewMockBeaconBlockConverter(ctrl)
// For the first call, return a block that satisfies the verifiedOnly condition. This block should be returned by the first Recv(). // For the first call, return a block that satisfies the verifiedOnly condition. This block should be returned by the first Recv().
@@ -534,7 +534,7 @@ func TestStreamBlocks_BellatrixValid(t *testing.T) {
marshalledSignedBeaconBlockContainer1, err := json.Marshal(signedBeaconBlockContainer1) marshalledSignedBeaconBlockContainer1, err := json.Marshal(signedBeaconBlockContainer1)
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks/head", "/eth/v2/beacon/blocks/head",
&signedBlockResponseJson, &signedBlockResponseJson,
@@ -571,7 +571,7 @@ func TestStreamBlocks_BellatrixValid(t *testing.T) {
marshalledSignedBeaconBlockContainer2, err := json.Marshal(signedBeaconBlockContainer2) marshalledSignedBeaconBlockContainer2, err := json.Marshal(signedBeaconBlockContainer2)
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks/head", "/eth/v2/beacon/blocks/head",
&signedBlockResponseJson, &signedBlockResponseJson,
@@ -598,7 +598,7 @@ func TestStreamBlocks_BellatrixValid(t *testing.T) {
// The fourth call is only necessary when verifiedOnly == true since the previous block was optimistic // The fourth call is only necessary when verifiedOnly == true since the previous block was optimistic
if testCase.verifiedOnly { if testCase.verifiedOnly {
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks/head", "/eth/v2/beacon/blocks/head",
&signedBlockResponseJson, &signedBlockResponseJson,
@@ -621,7 +621,7 @@ func TestStreamBlocks_BellatrixValid(t *testing.T) {
).Times(1) ).Times(1)
} }
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler, beaconBlockConverter: beaconBlockConverter} validatorClient := &beaconApiValidatorClient{handler: handler, beaconBlockConverter: beaconBlockConverter}
streamBlocksClient := validatorClient.streamBlocks(ctx, &eth.StreamBlocksRequest{VerifiedOnly: testCase.verifiedOnly}, time.Millisecond*100) streamBlocksClient := validatorClient.streamBlocks(ctx, &eth.StreamBlocksRequest{VerifiedOnly: testCase.verifiedOnly}, time.Millisecond*100)
// Get the first block // Get the first block
@@ -680,7 +680,7 @@ func TestStreamBlocks_CapellaValid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
signedBlockResponseJson := abstractSignedBlockResponseJson{} signedBlockResponseJson := abstractSignedBlockResponseJson{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
beaconBlockConverter := mock.NewMockBeaconBlockConverter(ctrl) beaconBlockConverter := mock.NewMockBeaconBlockConverter(ctrl)
// For the first call, return a block that satisfies the verifiedOnly condition. This block should be returned by the first Recv(). // For the first call, return a block that satisfies the verifiedOnly condition. This block should be returned by the first Recv().
@@ -695,7 +695,7 @@ func TestStreamBlocks_CapellaValid(t *testing.T) {
marshalledSignedBeaconBlockContainer1, err := json.Marshal(signedBeaconBlockContainer1) marshalledSignedBeaconBlockContainer1, err := json.Marshal(signedBeaconBlockContainer1)
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks/head", "/eth/v2/beacon/blocks/head",
&signedBlockResponseJson, &signedBlockResponseJson,
@@ -732,7 +732,7 @@ func TestStreamBlocks_CapellaValid(t *testing.T) {
marshalledSignedBeaconBlockContainer2, err := json.Marshal(signedBeaconBlockContainer2) marshalledSignedBeaconBlockContainer2, err := json.Marshal(signedBeaconBlockContainer2)
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks/head", "/eth/v2/beacon/blocks/head",
&signedBlockResponseJson, &signedBlockResponseJson,
@@ -759,7 +759,7 @@ func TestStreamBlocks_CapellaValid(t *testing.T) {
// The fourth call is only necessary when verifiedOnly == true since the previous block was optimistic // The fourth call is only necessary when verifiedOnly == true since the previous block was optimistic
if testCase.verifiedOnly { if testCase.verifiedOnly {
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks/head", "/eth/v2/beacon/blocks/head",
&signedBlockResponseJson, &signedBlockResponseJson,
@@ -782,7 +782,7 @@ func TestStreamBlocks_CapellaValid(t *testing.T) {
).Times(1) ).Times(1)
} }
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler, beaconBlockConverter: beaconBlockConverter} validatorClient := &beaconApiValidatorClient{handler: handler, beaconBlockConverter: beaconBlockConverter}
streamBlocksClient := validatorClient.streamBlocks(ctx, &eth.StreamBlocksRequest{VerifiedOnly: testCase.verifiedOnly}, time.Millisecond*100) streamBlocksClient := validatorClient.streamBlocks(ctx, &eth.StreamBlocksRequest{VerifiedOnly: testCase.verifiedOnly}, time.Millisecond*100)
// Get the first block // Get the first block
@@ -841,7 +841,7 @@ func TestStreamBlocks_DenebValid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
signedBlockResponseJson := abstractSignedBlockResponseJson{} signedBlockResponseJson := abstractSignedBlockResponseJson{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
beaconBlockConverter := mock.NewMockBeaconBlockConverter(ctrl) beaconBlockConverter := mock.NewMockBeaconBlockConverter(ctrl)
// For the first call, return a block that satisfies the verifiedOnly condition. This block should be returned by the first Recv(). // For the first call, return a block that satisfies the verifiedOnly condition. This block should be returned by the first Recv().
@@ -856,7 +856,7 @@ func TestStreamBlocks_DenebValid(t *testing.T) {
marshalledSignedBeaconBlockContainer1, err := json.Marshal(denebBlock) marshalledSignedBeaconBlockContainer1, err := json.Marshal(denebBlock)
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks/head", "/eth/v2/beacon/blocks/head",
&signedBlockResponseJson, &signedBlockResponseJson,
@@ -885,7 +885,7 @@ func TestStreamBlocks_DenebValid(t *testing.T) {
marshalledSignedBeaconBlockContainer2, err := json.Marshal(denebBlock2) marshalledSignedBeaconBlockContainer2, err := json.Marshal(denebBlock2)
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks/head", "/eth/v2/beacon/blocks/head",
&signedBlockResponseJson, &signedBlockResponseJson,
@@ -902,7 +902,7 @@ func TestStreamBlocks_DenebValid(t *testing.T) {
// The fourth call is only necessary when verifiedOnly == true since the previous block was optimistic // The fourth call is only necessary when verifiedOnly == true since the previous block was optimistic
if testCase.verifiedOnly { if testCase.verifiedOnly {
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v2/beacon/blocks/head", "/eth/v2/beacon/blocks/head",
&signedBlockResponseJson, &signedBlockResponseJson,
@@ -918,7 +918,7 @@ func TestStreamBlocks_DenebValid(t *testing.T) {
).Times(1) ).Times(1)
} }
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler, beaconBlockConverter: beaconBlockConverter} validatorClient := &beaconApiValidatorClient{handler: handler, beaconBlockConverter: beaconBlockConverter}
streamBlocksClient := validatorClient.streamBlocks(ctx, &eth.StreamBlocksRequest{VerifiedOnly: testCase.verifiedOnly}, time.Millisecond*100) streamBlocksClient := validatorClient.streamBlocks(ctx, &eth.StreamBlocksRequest{VerifiedOnly: testCase.verifiedOnly}, time.Millisecond*100)
// Get the first block // Get the first block

View File

@@ -129,7 +129,7 @@ func (c *beaconApiValidatorClient) aggregateAttestation(
endpoint := apiutil.BuildURL("/eth/v2/validator/aggregate_attestation", params) endpoint := apiutil.BuildURL("/eth/v2/validator/aggregate_attestation", params)
var aggregateAttestationResponse structs.AggregateAttestationResponse var aggregateAttestationResponse structs.AggregateAttestationResponse
err := c.jsonRestHandler.Get(ctx, endpoint, &aggregateAttestationResponse) err := c.handler.Get(ctx, endpoint, &aggregateAttestationResponse)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -150,7 +150,7 @@ func (c *beaconApiValidatorClient) aggregateAttestationElectra(
endpoint := apiutil.BuildURL("/eth/v2/validator/aggregate_attestation", params) endpoint := apiutil.BuildURL("/eth/v2/validator/aggregate_attestation", params)
var aggregateAttestationResponse structs.AggregateAttestationResponse var aggregateAttestationResponse structs.AggregateAttestationResponse
if err := c.jsonRestHandler.Get(ctx, endpoint, &aggregateAttestationResponse); err != nil { if err := c.handler.Get(ctx, endpoint, &aggregateAttestationResponse); err != nil {
return nil, err return nil, err
} }

View File

@@ -94,10 +94,10 @@ func TestSubmitAggregateSelectionProof(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
// Call node syncing endpoint to check if head is optimistic. // Call node syncing endpoint to check if head is optimistic.
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
syncingEndpoint, syncingEndpoint,
&structs.SyncStatusResponse{}, &structs.SyncStatusResponse{},
@@ -113,7 +113,7 @@ func TestSubmitAggregateSelectionProof(t *testing.T) {
).Times(1) ).Times(1)
// Call attestation data to get attestation data root to query aggregate attestation. // Call attestation data to get attestation data root to query aggregate attestation.
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
fmt.Sprintf("%s?committee_index=%d&slot=%d", attestationDataEndpoint, committeeIndex, slot), fmt.Sprintf("%s?committee_index=%d&slot=%d", attestationDataEndpoint, committeeIndex, slot),
&structs.GetAttestationDataResponse{}, &structs.GetAttestationDataResponse{},
@@ -128,7 +128,7 @@ func TestSubmitAggregateSelectionProof(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
// Call attestation data to get attestation data root to query aggregate attestation. // Call attestation data to get attestation data root to query aggregate attestation.
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
fmt.Sprintf("%s?attestation_data_root=%s&committee_index=%d&slot=%d", aggregateAttestationEndpoint, hexutil.Encode(attestationDataRootBytes[:]), committeeIndex, slot), fmt.Sprintf("%s?attestation_data_root=%s&committee_index=%d&slot=%d", aggregateAttestationEndpoint, hexutil.Encode(attestationDataRootBytes[:]), committeeIndex, slot),
&structs.AggregateAttestationResponse{}, &structs.AggregateAttestationResponse{},
@@ -156,12 +156,12 @@ func TestSubmitAggregateSelectionProof(t *testing.T) {
} }
validatorClient := &beaconApiValidatorClient{ validatorClient := &beaconApiValidatorClient{
jsonRestHandler: jsonRestHandler, handler: handler,
stateValidatorsProvider: beaconApiStateValidatorsProvider{ stateValidatorsProvider: beaconApiStateValidatorsProvider{
jsonRestHandler: jsonRestHandler, handler: handler,
}, },
dutiesProvider: beaconApiDutiesProvider{ dutiesProvider: beaconApiDutiesProvider{
jsonRestHandler: jsonRestHandler, handler: handler,
}, },
} }
@@ -263,10 +263,10 @@ func TestSubmitAggregateSelectionProofElectra(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
// Call node syncing endpoint to check if head is optimistic. // Call node syncing endpoint to check if head is optimistic.
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
syncingEndpoint, syncingEndpoint,
&structs.SyncStatusResponse{}, &structs.SyncStatusResponse{},
@@ -282,7 +282,7 @@ func TestSubmitAggregateSelectionProofElectra(t *testing.T) {
).Times(1) ).Times(1)
// Call attestation data to get attestation data root to query aggregate attestation. // Call attestation data to get attestation data root to query aggregate attestation.
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
fmt.Sprintf("%s?committee_index=%d&slot=%d", attestationDataEndpoint, committeeIndex, slot), fmt.Sprintf("%s?committee_index=%d&slot=%d", attestationDataEndpoint, committeeIndex, slot),
&structs.GetAttestationDataResponse{}, &structs.GetAttestationDataResponse{},
@@ -297,7 +297,7 @@ func TestSubmitAggregateSelectionProofElectra(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
// Call attestation data to get attestation data root to query aggregate attestation. // Call attestation data to get attestation data root to query aggregate attestation.
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
fmt.Sprintf("%s?attestation_data_root=%s&committee_index=%d&slot=%d", aggregateAttestationEndpoint, hexutil.Encode(attestationDataRootBytes[:]), committeeIndex, slot), fmt.Sprintf("%s?attestation_data_root=%s&committee_index=%d&slot=%d", aggregateAttestationEndpoint, hexutil.Encode(attestationDataRootBytes[:]), committeeIndex, slot),
&structs.AggregateAttestationResponse{}, &structs.AggregateAttestationResponse{},
@@ -325,12 +325,12 @@ func TestSubmitAggregateSelectionProofElectra(t *testing.T) {
} }
validatorClient := &beaconApiValidatorClient{ validatorClient := &beaconApiValidatorClient{
jsonRestHandler: jsonRestHandler, handler: handler,
stateValidatorsProvider: beaconApiStateValidatorsProvider{ stateValidatorsProvider: beaconApiStateValidatorsProvider{
jsonRestHandler: jsonRestHandler, handler: handler,
}, },
dutiesProvider: beaconApiDutiesProvider{ dutiesProvider: beaconApiDutiesProvider{
jsonRestHandler: jsonRestHandler, handler: handler,
}, },
} }

View File

@@ -18,7 +18,7 @@ func (c *beaconApiValidatorClient) submitSignedAggregateSelectionProof(ctx conte
return nil, errors.Wrap(err, "failed to marshal SignedAggregateAttestationAndProof") return nil, errors.Wrap(err, "failed to marshal SignedAggregateAttestationAndProof")
} }
headers := map[string]string{"Eth-Consensus-Version": version.String(in.SignedAggregateAndProof.Version())} headers := map[string]string{"Eth-Consensus-Version": version.String(in.SignedAggregateAndProof.Version())}
err = c.jsonRestHandler.Post(ctx, "/eth/v2/validator/aggregate_and_proofs", headers, bytes.NewBuffer(body), nil) err = c.handler.Post(ctx, "/eth/v2/validator/aggregate_and_proofs", headers, bytes.NewBuffer(body), nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -39,7 +39,7 @@ func (c *beaconApiValidatorClient) submitSignedAggregateSelectionProofElectra(ct
dataSlot := in.SignedAggregateAndProof.Message.Aggregate.Data.Slot dataSlot := in.SignedAggregateAndProof.Message.Aggregate.Data.Slot
consensusVersion := version.String(slots.ToForkVersion(dataSlot)) consensusVersion := version.String(slots.ToForkVersion(dataSlot))
headers := map[string]string{"Eth-Consensus-Version": consensusVersion} headers := map[string]string{"Eth-Consensus-Version": consensusVersion}
if err = c.jsonRestHandler.Post(ctx, "/eth/v2/validator/aggregate_and_proofs", headers, bytes.NewBuffer(body), nil); err != nil { if err = c.handler.Post(ctx, "/eth/v2/validator/aggregate_and_proofs", headers, bytes.NewBuffer(body), nil); err != nil {
return nil, err return nil, err
} }

View File

@@ -28,8 +28,8 @@ func TestSubmitSignedAggregateSelectionProof_Valid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
headers := map[string]string{"Eth-Consensus-Version": version.String(signedAggregateAndProof.Message.Version())} headers := map[string]string{"Eth-Consensus-Version": version.String(signedAggregateAndProof.Message.Version())}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v2/validator/aggregate_and_proofs", "/eth/v2/validator/aggregate_and_proofs",
headers, headers,
@@ -42,7 +42,7 @@ func TestSubmitSignedAggregateSelectionProof_Valid(t *testing.T) {
attestationDataRoot, err := signedAggregateAndProof.Message.Aggregate.Data.HashTreeRoot() attestationDataRoot, err := signedAggregateAndProof.Message.Aggregate.Data.HashTreeRoot()
require.NoError(t, err) require.NoError(t, err)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
resp, err := validatorClient.submitSignedAggregateSelectionProof(ctx, &ethpb.SignedAggregateSubmitRequest{ resp, err := validatorClient.submitSignedAggregateSelectionProof(ctx, &ethpb.SignedAggregateSubmitRequest{
SignedAggregateAndProof: signedAggregateAndProof, SignedAggregateAndProof: signedAggregateAndProof,
}) })
@@ -60,8 +60,8 @@ func TestSubmitSignedAggregateSelectionProof_BadRequest(t *testing.T) {
ctx := t.Context() ctx := t.Context()
headers := map[string]string{"Eth-Consensus-Version": version.String(signedAggregateAndProof.Message.Version())} headers := map[string]string{"Eth-Consensus-Version": version.String(signedAggregateAndProof.Message.Version())}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v2/validator/aggregate_and_proofs", "/eth/v2/validator/aggregate_and_proofs",
headers, headers,
@@ -71,7 +71,7 @@ func TestSubmitSignedAggregateSelectionProof_BadRequest(t *testing.T) {
errors.New("bad request"), errors.New("bad request"),
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
_, err = validatorClient.submitSignedAggregateSelectionProof(ctx, &ethpb.SignedAggregateSubmitRequest{ _, err = validatorClient.submitSignedAggregateSelectionProof(ctx, &ethpb.SignedAggregateSubmitRequest{
SignedAggregateAndProof: signedAggregateAndProof, SignedAggregateAndProof: signedAggregateAndProof,
}) })
@@ -93,8 +93,8 @@ func TestSubmitSignedAggregateSelectionProofElectra_Valid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
expectedVersion := version.String(slots.ToForkVersion(signedAggregateAndProofElectra.Message.Aggregate.Data.Slot)) expectedVersion := version.String(slots.ToForkVersion(signedAggregateAndProofElectra.Message.Aggregate.Data.Slot))
headers := map[string]string{"Eth-Consensus-Version": expectedVersion} headers := map[string]string{"Eth-Consensus-Version": expectedVersion}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v2/validator/aggregate_and_proofs", "/eth/v2/validator/aggregate_and_proofs",
headers, headers,
@@ -107,7 +107,7 @@ func TestSubmitSignedAggregateSelectionProofElectra_Valid(t *testing.T) {
attestationDataRoot, err := signedAggregateAndProofElectra.Message.Aggregate.Data.HashTreeRoot() attestationDataRoot, err := signedAggregateAndProofElectra.Message.Aggregate.Data.HashTreeRoot()
require.NoError(t, err) require.NoError(t, err)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
resp, err := validatorClient.submitSignedAggregateSelectionProofElectra(ctx, &ethpb.SignedAggregateSubmitElectraRequest{ resp, err := validatorClient.submitSignedAggregateSelectionProofElectra(ctx, &ethpb.SignedAggregateSubmitElectraRequest{
SignedAggregateAndProof: signedAggregateAndProofElectra, SignedAggregateAndProof: signedAggregateAndProofElectra,
}) })
@@ -130,8 +130,8 @@ func TestSubmitSignedAggregateSelectionProofElectra_BadRequest(t *testing.T) {
ctx := t.Context() ctx := t.Context()
expectedVersion := version.String(slots.ToForkVersion(signedAggregateAndProofElectra.Message.Aggregate.Data.Slot)) expectedVersion := version.String(slots.ToForkVersion(signedAggregateAndProofElectra.Message.Aggregate.Data.Slot))
headers := map[string]string{"Eth-Consensus-Version": expectedVersion} headers := map[string]string{"Eth-Consensus-Version": expectedVersion}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v2/validator/aggregate_and_proofs", "/eth/v2/validator/aggregate_and_proofs",
headers, headers,
@@ -141,7 +141,7 @@ func TestSubmitSignedAggregateSelectionProofElectra_BadRequest(t *testing.T) {
errors.New("bad request"), errors.New("bad request"),
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
_, err = validatorClient.submitSignedAggregateSelectionProofElectra(ctx, &ethpb.SignedAggregateSubmitElectraRequest{ _, err = validatorClient.submitSignedAggregateSelectionProofElectra(ctx, &ethpb.SignedAggregateSubmitElectraRequest{
SignedAggregateAndProof: signedAggregateAndProofElectra, SignedAggregateAndProof: signedAggregateAndProofElectra,
}) })
@@ -163,8 +163,8 @@ func TestSubmitSignedAggregateSelectionProofElectra_FuluVersion(t *testing.T) {
ctx := t.Context() ctx := t.Context()
expectedVersion := version.String(slots.ToForkVersion(signedAggregateAndProofElectra.Message.Aggregate.Data.Slot)) expectedVersion := version.String(slots.ToForkVersion(signedAggregateAndProofElectra.Message.Aggregate.Data.Slot))
headers := map[string]string{"Eth-Consensus-Version": expectedVersion} headers := map[string]string{"Eth-Consensus-Version": expectedVersion}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v2/validator/aggregate_and_proofs", "/eth/v2/validator/aggregate_and_proofs",
headers, headers,
@@ -177,7 +177,7 @@ func TestSubmitSignedAggregateSelectionProofElectra_FuluVersion(t *testing.T) {
attestationDataRoot, err := signedAggregateAndProofElectra.Message.Aggregate.Data.HashTreeRoot() attestationDataRoot, err := signedAggregateAndProofElectra.Message.Aggregate.Data.HashTreeRoot()
require.NoError(t, err) require.NoError(t, err)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
resp, err := validatorClient.submitSignedAggregateSelectionProofElectra(ctx, &ethpb.SignedAggregateSubmitElectraRequest{ resp, err := validatorClient.submitSignedAggregateSelectionProofElectra(ctx, &ethpb.SignedAggregateSubmitElectraRequest{
SignedAggregateAndProof: signedAggregateAndProofElectra, SignedAggregateAndProof: signedAggregateAndProofElectra,
}) })

View File

@@ -47,7 +47,7 @@ func (c *beaconApiValidatorClient) submitSignedContributionAndProof(ctx context.
return errors.Wrap(err, "failed to marshall signed contribution and proof") return errors.Wrap(err, "failed to marshall signed contribution and proof")
} }
return c.jsonRestHandler.Post( return c.handler.Post(
ctx, ctx,
"/eth/v1/validator/contribution_and_proofs", "/eth/v1/validator/contribution_and_proofs",
nil, nil,

View File

@@ -43,8 +43,8 @@ func TestSubmitSignedContributionAndProof_Valid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
submitSignedContributionAndProofTestEndpoint, submitSignedContributionAndProofTestEndpoint,
nil, nil,
@@ -69,7 +69,7 @@ func TestSubmitSignedContributionAndProof_Valid(t *testing.T) {
Signature: []byte{8}, Signature: []byte{8},
} }
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
err = validatorClient.submitSignedContributionAndProof(ctx, contributionAndProof) err = validatorClient.submitSignedContributionAndProof(ctx, contributionAndProof)
require.NoError(t, err) require.NoError(t, err)
} }
@@ -117,9 +117,9 @@ func TestSubmitSignedContributionAndProof_Error(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
if testCase.httpRequestExpected { if testCase.httpRequestExpected {
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
submitSignedContributionAndProofTestEndpoint, submitSignedContributionAndProofTestEndpoint,
gomock.Any(), gomock.Any(),
@@ -130,7 +130,7 @@ func TestSubmitSignedContributionAndProof_Error(t *testing.T) {
).Times(1) ).Times(1)
} }
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
err := validatorClient.submitSignedContributionAndProof(ctx, testCase.data) err := validatorClient.submitSignedContributionAndProof(ctx, testCase.data)
assert.ErrorContains(t, testCase.expectedErrorMessage, err) assert.ErrorContains(t, testCase.expectedErrorMessage, err)
}) })

View File

@@ -36,7 +36,7 @@ func (c *beaconApiValidatorClient) subscribeCommitteeSubnets(ctx context.Context
return errors.Wrap(err, "failed to marshal committees subscriptions") return errors.Wrap(err, "failed to marshal committees subscriptions")
} }
return c.jsonRestHandler.Post( return c.handler.Post(
ctx, ctx,
"/eth/v1/validator/beacon_committee_subscriptions", "/eth/v1/validator/beacon_committee_subscriptions",
nil, nil,

View File

@@ -44,8 +44,8 @@ func TestSubscribeCommitteeSubnets_Valid(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
subscribeCommitteeSubnetsTestEndpoint, subscribeCommitteeSubnetsTestEndpoint,
nil, nil,
@@ -66,7 +66,7 @@ func TestSubscribeCommitteeSubnets_Valid(t *testing.T) {
} }
validatorClient := &beaconApiValidatorClient{ validatorClient := &beaconApiValidatorClient{
jsonRestHandler: jsonRestHandler, handler: handler,
} }
err = validatorClient.subscribeCommitteeSubnets( err = validatorClient.subscribeCommitteeSubnets(
ctx, ctx,
@@ -205,9 +205,9 @@ func TestSubscribeCommitteeSubnets_Error(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
if testCase.expectSubscribeRestCall { if testCase.expectSubscribeRestCall {
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
subscribeCommitteeSubnetsTestEndpoint, subscribeCommitteeSubnetsTestEndpoint,
gomock.Any(), gomock.Any(),
@@ -219,7 +219,7 @@ func TestSubscribeCommitteeSubnets_Error(t *testing.T) {
} }
validatorClient := &beaconApiValidatorClient{ validatorClient := &beaconApiValidatorClient{
jsonRestHandler: jsonRestHandler, handler: handler,
} }
err := validatorClient.subscribeCommitteeSubnets(ctx, testCase.subscribeRequest, testCase.duties) err := validatorClient.subscribeCommitteeSubnets(ctx, testCase.subscribeRequest, testCase.duties)
assert.ErrorContains(t, testCase.expectedErrorMessage, err) assert.ErrorContains(t, testCase.expectedErrorMessage, err)

View File

@@ -31,13 +31,13 @@ func (c *beaconApiValidatorClient) submitSyncMessage(ctx context.Context, syncMe
return errors.Wrap(err, "failed to marshal sync committee message") return errors.Wrap(err, "failed to marshal sync committee message")
} }
return c.jsonRestHandler.Post(ctx, endpoint, nil, bytes.NewBuffer(marshalledJsonSyncCommitteeMessage), nil) return c.handler.Post(ctx, endpoint, nil, bytes.NewBuffer(marshalledJsonSyncCommitteeMessage), nil)
} }
func (c *beaconApiValidatorClient) syncMessageBlockRoot(ctx context.Context) (*ethpb.SyncMessageBlockRootResponse, error) { func (c *beaconApiValidatorClient) syncMessageBlockRoot(ctx context.Context) (*ethpb.SyncMessageBlockRootResponse, error) {
// Get head beacon block root. // Get head beacon block root.
var resp structs.BlockRootResponse var resp structs.BlockRootResponse
if err := c.jsonRestHandler.Get(ctx, "/eth/v1/beacon/blocks/head/root", &resp); err != nil { if err := c.handler.Get(ctx, "/eth/v1/beacon/blocks/head/root", &resp); err != nil {
return nil, err return nil, err
} }
@@ -82,7 +82,7 @@ func (c *beaconApiValidatorClient) syncCommitteeContribution(
params.Add("beacon_block_root", blockRoot) params.Add("beacon_block_root", blockRoot)
var resp structs.ProduceSyncCommitteeContributionResponse var resp structs.ProduceSyncCommitteeContributionResponse
if err = c.jsonRestHandler.Get(ctx, apiutil.BuildURL("/eth/v1/validator/sync_committee_contribution", params), &resp); err != nil { if err = c.handler.Get(ctx, apiutil.BuildURL("/eth/v1/validator/sync_committee_contribution", params), &resp); err != nil {
return nil, err return nil, err
} }

View File

@@ -20,7 +20,7 @@ func (c *beaconApiValidatorClient) aggregatedSyncSelections(ctx context.Context,
} }
var resp aggregatedSyncSelectionResponse var resp aggregatedSyncSelectionResponse
err = c.jsonRestHandler.Post(ctx, "/eth/v1/validator/sync_committee_selections", nil, bytes.NewBuffer(body), &resp) err = c.handler.Post(ctx, "/eth/v1/validator/sync_committee_selections", nil, bytes.NewBuffer(body), &resp)
if err != nil { if err != nil {
return nil, errors.Wrap(err, "error calling post endpoint") return nil, errors.Wrap(err, "error calling post endpoint")
} }

View File

@@ -96,13 +96,13 @@ func TestGetAggregatedSyncSelections(t *testing.T) {
for _, test := range testcases { for _, test := range testcases {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
reqBody, err := json.Marshal(test.req) reqBody, err := json.Marshal(test.req)
require.NoError(t, err) require.NoError(t, err)
ctx := t.Context() ctx := t.Context()
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v1/validator/sync_committee_selections", "/eth/v1/validator/sync_committee_selections",
nil, nil,
@@ -115,7 +115,7 @@ func TestGetAggregatedSyncSelections(t *testing.T) {
test.endpointError, test.endpointError,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
res, err := validatorClient.AggregatedSyncSelections(ctx, test.req) res, err := validatorClient.AggregatedSyncSelections(ctx, test.req)
if test.expectedErrorMessage != "" { if test.expectedErrorMessage != "" {
require.ErrorContains(t, test.expectedErrorMessage, err) require.ErrorContains(t, test.expectedErrorMessage, err)

View File

@@ -44,8 +44,8 @@ func TestSubmitSyncMessage_Valid(t *testing.T) {
marshalledJsonRegistrations, err := json.Marshal([]*structs.SyncCommitteeMessage{jsonSyncCommitteeMessage}) marshalledJsonRegistrations, err := json.Marshal([]*structs.SyncCommitteeMessage{jsonSyncCommitteeMessage})
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/pool/sync_committees", "/eth/v1/beacon/pool/sync_committees",
nil, nil,
@@ -62,7 +62,7 @@ func TestSubmitSyncMessage_Valid(t *testing.T) {
Signature: decodedSignature, Signature: decodedSignature,
} }
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
res, err := validatorClient.SubmitSyncMessage(t.Context(), &protoSyncCommitteeMessage) res, err := validatorClient.SubmitSyncMessage(t.Context(), &protoSyncCommitteeMessage)
assert.DeepEqual(t, new(empty.Empty), res) assert.DeepEqual(t, new(empty.Empty), res)
@@ -73,8 +73,8 @@ func TestSubmitSyncMessage_BadRequest(t *testing.T) {
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
defer ctrl.Finish() defer ctrl.Finish()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/pool/sync_committees", "/eth/v1/beacon/pool/sync_committees",
nil, nil,
@@ -84,7 +84,7 @@ func TestSubmitSyncMessage_BadRequest(t *testing.T) {
errors.New("foo error"), errors.New("foo error"),
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
_, err := validatorClient.SubmitSyncMessage(t.Context(), &ethpb.SyncCommitteeMessage{}) _, err := validatorClient.SubmitSyncMessage(t.Context(), &ethpb.SyncCommitteeMessage{})
assert.ErrorContains(t, "foo error", err) assert.ErrorContains(t, "foo error", err)
} }
@@ -137,8 +137,8 @@ func TestGetSyncMessageBlockRoot(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/blocks/head/root", "/eth/v1/beacon/blocks/head/root",
&structs.BlockRootResponse{}, &structs.BlockRootResponse{},
@@ -149,7 +149,7 @@ func TestGetSyncMessageBlockRoot(t *testing.T) {
test.endpointError, test.endpointError,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
actualResponse, err := validatorClient.syncMessageBlockRoot(ctx) actualResponse, err := validatorClient.syncMessageBlockRoot(ctx)
if test.expectedErrorMessage != "" { if test.expectedErrorMessage != "" {
require.ErrorContains(t, test.expectedErrorMessage, err) require.ErrorContains(t, test.expectedErrorMessage, err)
@@ -207,8 +207,8 @@ func TestGetSyncCommitteeContribution(t *testing.T) {
for _, test := range tests { for _, test := range tests {
t.Run(test.name, func(t *testing.T) { t.Run(test.name, func(t *testing.T) {
ctx := t.Context() ctx := t.Context()
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/blocks/head/root", "/eth/v1/beacon/blocks/head/root",
&structs.BlockRootResponse{}, &structs.BlockRootResponse{},
@@ -223,7 +223,7 @@ func TestGetSyncCommitteeContribution(t *testing.T) {
nil, nil,
).Times(1) ).Times(1)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
fmt.Sprintf("/eth/v1/validator/sync_committee_contribution?beacon_block_root=%s&slot=%d&subcommittee_index=%d", fmt.Sprintf("/eth/v1/validator/sync_committee_contribution?beacon_block_root=%s&slot=%d&subcommittee_index=%d",
blockRoot, uint64(request.Slot), request.SubnetId), blockRoot, uint64(request.Slot), request.SubnetId),
@@ -235,7 +235,7 @@ func TestGetSyncCommitteeContribution(t *testing.T) {
test.endpointErr, test.endpointErr,
).Times(1) ).Times(1)
validatorClient := &beaconApiValidatorClient{jsonRestHandler: jsonRestHandler} validatorClient := &beaconApiValidatorClient{handler: handler}
actualResponse, err := validatorClient.syncCommitteeContribution(ctx, request) actualResponse, err := validatorClient.syncCommitteeContribution(ctx, request)
if test.expectedErrMsg != "" { if test.expectedErrMsg != "" {
require.ErrorContains(t, test.expectedErrMsg, err) require.ErrorContains(t, test.expectedErrMsg, err)
@@ -314,8 +314,8 @@ func TestGetSyncSubCommitteeIndex(t *testing.T) {
} }
valsReqBytes, err := json.Marshal(valsReq) valsReqBytes, err := json.Marshal(valsReq)
require.NoError(t, err) require.NoError(t, err)
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
validatorsEndpoint, validatorsEndpoint,
nil, nil,
@@ -350,7 +350,7 @@ func TestGetSyncSubCommitteeIndex(t *testing.T) {
query := apiutil.BuildURL("/eth/v1/beacon/states/head/validators", queryParams) query := apiutil.BuildURL("/eth/v1/beacon/states/head/validators", queryParams)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
query, query,
&structs.GetValidatorsResponse{}, &structs.GetValidatorsResponse{},
@@ -367,7 +367,7 @@ func TestGetSyncSubCommitteeIndex(t *testing.T) {
syncDutiesCalled = 1 syncDutiesCalled = 1
} }
jsonRestHandler.EXPECT().Post( handler.EXPECT().Post(
gomock.Any(), gomock.Any(),
fmt.Sprintf("%s/%d", syncDutiesEndpoint, slots.ToEpoch(slot)), fmt.Sprintf("%s/%d", syncDutiesEndpoint, slots.ToEpoch(slot)),
nil, nil,
@@ -386,12 +386,12 @@ func TestGetSyncSubCommitteeIndex(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
validatorClient := &beaconApiValidatorClient{ validatorClient := &beaconApiValidatorClient{
jsonRestHandler: jsonRestHandler, handler: handler,
stateValidatorsProvider: beaconApiStateValidatorsProvider{ stateValidatorsProvider: beaconApiStateValidatorsProvider{
jsonRestHandler: jsonRestHandler, handler: handler,
}, },
dutiesProvider: beaconApiDutiesProvider{ dutiesProvider: beaconApiDutiesProvider{
jsonRestHandler: jsonRestHandler, handler: handler,
}, },
} }
actualResponse, err := validatorClient.syncSubcommitteeIndex(ctx, &ethpb.SyncSubcommitteeIndexRequest{ actualResponse, err := validatorClient.syncSubcommitteeIndex(ctx, &ethpb.SyncSubcommitteeIndexRequest{

View File

@@ -21,8 +21,8 @@ func TestWaitForChainStart_ValidGenesis(t *testing.T) {
ctx := t.Context() ctx := t.Context()
genesisResponseJson := structs.GetGenesisResponse{} genesisResponseJson := structs.GetGenesisResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/genesis", "/eth/v1/beacon/genesis",
&genesisResponseJson, &genesisResponseJson,
@@ -38,7 +38,7 @@ func TestWaitForChainStart_ValidGenesis(t *testing.T) {
}, },
).Times(1) ).Times(1)
genesisProvider := beaconApiGenesisProvider{jsonRestHandler: jsonRestHandler} genesisProvider := beaconApiGenesisProvider{handler: handler}
validatorClient := beaconApiValidatorClient{genesisProvider: &genesisProvider} validatorClient := beaconApiValidatorClient{genesisProvider: &genesisProvider}
resp, err := validatorClient.WaitForChainStart(ctx, &emptypb.Empty{}) resp, err := validatorClient.WaitForChainStart(ctx, &emptypb.Empty{})
assert.NoError(t, err) assert.NoError(t, err)
@@ -88,8 +88,8 @@ func TestWaitForChainStart_BadGenesis(t *testing.T) {
ctx := t.Context() ctx := t.Context()
genesisResponseJson := structs.GetGenesisResponse{} genesisResponseJson := structs.GetGenesisResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/genesis", "/eth/v1/beacon/genesis",
&genesisResponseJson, &genesisResponseJson,
@@ -102,7 +102,7 @@ func TestWaitForChainStart_BadGenesis(t *testing.T) {
}, },
).Times(1) ).Times(1)
genesisProvider := beaconApiGenesisProvider{jsonRestHandler: jsonRestHandler} genesisProvider := beaconApiGenesisProvider{handler: handler}
validatorClient := beaconApiValidatorClient{genesisProvider: &genesisProvider} validatorClient := beaconApiValidatorClient{genesisProvider: &genesisProvider}
_, err := validatorClient.WaitForChainStart(ctx, &emptypb.Empty{}) _, err := validatorClient.WaitForChainStart(ctx, &emptypb.Empty{})
assert.ErrorContains(t, testCase.errorMessage, err) assert.ErrorContains(t, testCase.errorMessage, err)
@@ -116,8 +116,8 @@ func TestWaitForChainStart_JsonResponseError(t *testing.T) {
ctx := t.Context() ctx := t.Context()
genesisResponseJson := structs.GetGenesisResponse{} genesisResponseJson := structs.GetGenesisResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/genesis", "/eth/v1/beacon/genesis",
&genesisResponseJson, &genesisResponseJson,
@@ -125,7 +125,7 @@ func TestWaitForChainStart_JsonResponseError(t *testing.T) {
errors.New("some specific json error"), errors.New("some specific json error"),
).Times(1) ).Times(1)
genesisProvider := beaconApiGenesisProvider{jsonRestHandler: jsonRestHandler} genesisProvider := beaconApiGenesisProvider{handler: handler}
validatorClient := beaconApiValidatorClient{genesisProvider: &genesisProvider} validatorClient := beaconApiValidatorClient{genesisProvider: &genesisProvider}
_, err := validatorClient.WaitForChainStart(ctx, &emptypb.Empty{}) _, err := validatorClient.WaitForChainStart(ctx, &emptypb.Empty{})
assert.ErrorContains(t, "failed to get genesis data", err) assert.ErrorContains(t, "failed to get genesis data", err)
@@ -139,10 +139,10 @@ func TestWaitForChainStart_JsonResponseError404(t *testing.T) {
ctx := t.Context() ctx := t.Context()
genesisResponseJson := structs.GetGenesisResponse{} genesisResponseJson := structs.GetGenesisResponse{}
jsonRestHandler := mock.NewMockJsonRestHandler(ctrl) handler := mock.NewMockJsonRestHandler(ctrl)
// First, mock a request that receives a 404 error (which means that the genesis data is not available yet) // First, mock a request that receives a 404 error (which means that the genesis data is not available yet)
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/genesis", "/eth/v1/beacon/genesis",
&genesisResponseJson, &genesisResponseJson,
@@ -154,7 +154,7 @@ func TestWaitForChainStart_JsonResponseError404(t *testing.T) {
).Times(1) ).Times(1)
// After receiving a 404 error, mock a request that actually has genesis data available // After receiving a 404 error, mock a request that actually has genesis data available
jsonRestHandler.EXPECT().Get( handler.EXPECT().Get(
gomock.Any(), gomock.Any(),
"/eth/v1/beacon/genesis", "/eth/v1/beacon/genesis",
&genesisResponseJson, &genesisResponseJson,
@@ -170,7 +170,7 @@ func TestWaitForChainStart_JsonResponseError404(t *testing.T) {
}, },
).Times(1) ).Times(1)
genesisProvider := beaconApiGenesisProvider{jsonRestHandler: jsonRestHandler} genesisProvider := beaconApiGenesisProvider{handler: handler}
validatorClient := beaconApiValidatorClient{genesisProvider: &genesisProvider} validatorClient := beaconApiValidatorClient{genesisProvider: &genesisProvider}
resp, err := validatorClient.WaitForChainStart(ctx, &emptypb.Empty{}) resp, err := validatorClient.WaitForChainStart(ctx, &emptypb.Empty{})
assert.NoError(t, err) assert.NoError(t, err)

View File

@@ -15,6 +15,7 @@ go_library(
deps = [ deps = [
"//api/client:go_default_library", "//api/client:go_default_library",
"//api/client/event:go_default_library", "//api/client/event:go_default_library",
"//api/failover:go_default_library",
"//api/server/structs:go_default_library", "//api/server/structs:go_default_library",
"//beacon-chain/rpc/eth/helpers:go_default_library", "//beacon-chain/rpc/eth/helpers:go_default_library",
"//beacon-chain/state/state-native:go_default_library", "//beacon-chain/state/state-native:go_default_library",
@@ -49,6 +50,7 @@ go_test(
embed = [":go_default_library"], embed = [":go_default_library"],
deps = [ deps = [
"//api/client/event:go_default_library", "//api/client/event:go_default_library",
"//api/grpc:go_default_library",
"//api/server/structs:go_default_library", "//api/server/structs:go_default_library",
"//config/params:go_default_library", "//config/params:go_default_library",
"//consensus-types/primitives:go_default_library", "//consensus-types/primitives:go_default_library",

View File

@@ -10,11 +10,11 @@ import (
// grpcClientManager handles dynamic gRPC client recreation when the connection changes. // grpcClientManager handles dynamic gRPC client recreation when the connection changes.
// It uses generics to work with any gRPC client type. // It uses generics to work with any gRPC client type.
type grpcClientManager[T any] struct { type grpcClientManager[T any] struct {
mu sync.Mutex mu sync.Mutex
conn validatorHelpers.NodeConnection conn validatorHelpers.NodeConnection
client T client T
lastHost string lastConnCounter uint64 // connection counter when client was last created; compared to detect host switches
newClient func(grpc.ClientConnInterface) T newClient func(grpc.ClientConnInterface) T
} }
// newGrpcClientManager creates a new client manager with the given connection and client constructor. // newGrpcClientManager creates a new client manager with the given connection and client constructor.
@@ -23,22 +23,25 @@ func newGrpcClientManager[T any](
newClient func(grpc.ClientConnInterface) T, newClient func(grpc.ClientConnInterface) T,
) *grpcClientManager[T] { ) *grpcClientManager[T] {
return &grpcClientManager[T]{ return &grpcClientManager[T]{
conn: conn, conn: conn,
newClient: newClient, newClient: newClient,
client: newClient(conn.GetGrpcClientConn()), client: newClient(conn.GetGrpcClientConn()),
lastHost: conn.GetGrpcConnectionProvider().CurrentHost(), lastConnCounter: conn.GetGrpcConnectionProvider().ConnectionCounter(),
} }
} }
// getClient returns the current client, recreating it if the connection has changed. // getClient returns the current client, recreating it if the connection has changed.
// It uses the provider's connection counter rather than the host string to detect changes,
// which correctly handles host bounces (e.g., host0 → host1 → host0) where the host
// string returns to its original value but the underlying connection has been replaced.
func (m *grpcClientManager[T]) getClient() T { func (m *grpcClientManager[T]) getClient() T {
m.mu.Lock() m.mu.Lock()
defer m.mu.Unlock() defer m.mu.Unlock()
currentHost := m.conn.GetGrpcConnectionProvider().CurrentHost() currentCounter := m.conn.GetGrpcConnectionProvider().ConnectionCounter()
if m.lastHost != currentHost { if m.lastConnCounter != currentCounter {
m.client = m.newClient(m.conn.GetGrpcClientConn()) m.client = m.newClient(m.conn.GetGrpcClientConn())
m.lastHost = currentHost m.lastConnCounter = currentCounter
} }
return m.client return m.client
} }

View File

@@ -14,6 +14,7 @@ import (
type mockProvider struct { type mockProvider struct {
hosts []string hosts []string
currentIndex int currentIndex int
connCounter uint64
mu sync.Mutex mu sync.Mutex
} }
@@ -31,14 +32,22 @@ func (m *mockProvider) SwitchHost(index int) error {
m.mu.Lock() m.mu.Lock()
defer m.mu.Unlock() defer m.mu.Unlock()
m.currentIndex = index m.currentIndex = index
m.connCounter++
return nil return nil
} }
func (m *mockProvider) ConnectionCounter() uint64 {
m.mu.Lock()
defer m.mu.Unlock()
return m.connCounter
}
// nextHost is a test helper for round-robin simulation (not part of the interface). // nextHost is a test helper for round-robin simulation (not part of the interface).
func (m *mockProvider) nextHost() { func (m *mockProvider) nextHost() {
m.mu.Lock() m.mu.Lock()
defer m.mu.Unlock() defer m.mu.Unlock()
m.currentIndex = (m.currentIndex + 1) % len(m.hosts) m.currentIndex = (m.currentIndex + 1) % len(m.hosts)
m.connCounter++
} }
// testClient is a simple type for testing the generic client manager. // testClient is a simple type for testing the generic client manager.
@@ -61,11 +70,11 @@ func testManager(t *testing.T, provider *mockProvider) (*grpcClientManager[*test
} }
func TestGrpcClientManager(t *testing.T) { func TestGrpcClientManager(t *testing.T) {
t.Run("tracks host", func(t *testing.T) { t.Run("tracks connection counter", func(t *testing.T) {
provider := &mockProvider{hosts: []string{"host1:4000", "host2:4000"}} provider := &mockProvider{hosts: []string{"host1:4000", "host2:4000"}}
manager, count := testManager(t, provider) manager, count := testManager(t, provider)
assert.Equal(t, 1, *count) assert.Equal(t, 1, *count)
assert.Equal(t, "host1:4000", manager.lastHost) assert.Equal(t, uint64(0), manager.lastConnCounter)
}) })
t.Run("same host returns same client", func(t *testing.T) { t.Run("same host returns same client", func(t *testing.T) {
@@ -96,6 +105,30 @@ func TestGrpcClientManager(t *testing.T) {
assert.Equal(t, c2, c3) assert.Equal(t, c2, c3)
}) })
t.Run("host bounce recreates client", func(t *testing.T) {
// Regression test: when host bounces (host0 → host1 → host0), the client
// must be recreated even though the host string returns to its original value,
// because the underlying *grpc.ClientConn was destroyed and replaced.
provider := &mockProvider{hosts: []string{"host1:4000", "host2:4000"}}
manager, count := testManager(t, provider)
c1 := manager.getClient()
assert.Equal(t, 1, c1.id)
// Switch to host2
provider.nextHost()
c2 := manager.getClient()
assert.Equal(t, 2, *count)
assert.Equal(t, 2, c2.id)
// Switch back to host1 — same host string but new connection
provider.nextHost()
assert.Equal(t, "host1:4000", provider.CurrentHost())
c3 := manager.getClient()
assert.Equal(t, 3, *count, "client should be recreated on host bounce")
assert.Equal(t, 3, c3.id)
})
t.Run("multiple host switches", func(t *testing.T) { t.Run("multiple host switches", func(t *testing.T) {
provider := &mockProvider{hosts: []string{"host1:4000", "host2:4000", "host3:4000"}} provider := &mockProvider{hosts: []string{"host1:4000", "host2:4000", "host3:4000"}}
manager, count := testManager(t, provider) manager, count := testManager(t, provider)

View File

@@ -38,7 +38,7 @@ func (c *grpcNodeClient) IsReady(ctx context.Context) bool {
// otherwise it will throw an error // otherwise it will throw an error
_, err := c.getClient().GetHealth(ctx, &ethpb.HealthRequest{}) _, err := c.getClient().GetHealth(ctx, &ethpb.HealthRequest{})
if err != nil { if err != nil {
log.WithError(err).Debug("Node is not ready") log.WithError(err).WithField("beaconNodeUrl", c.conn.GetGrpcConnectionProvider().CurrentHost()).Debug("Node is not ready")
return false return false
} }
return true return true

View File

@@ -58,10 +58,10 @@ func TestGrpcNodeClient_IsReady(t *testing.T) {
// Create client with injected mock // Create client with injected mock
client := &grpcNodeClient{ client := &grpcNodeClient{
grpcClientManager: &grpcClientManager[ethpb.NodeClient]{ grpcClientManager: &grpcClientManager[ethpb.NodeClient]{
conn: conn, conn: conn,
client: mockNodeClient, client: mockNodeClient,
lastHost: "host1:4000", lastConnCounter: 0,
newClient: func(grpc.ClientConnInterface) ethpb.NodeClient { return mockNodeClient }, newClient: func(grpc.ClientConnInterface) ethpb.NodeClient { return mockNodeClient },
}, },
} }

View File

@@ -7,6 +7,7 @@ import (
"github.com/OffchainLabs/prysm/v7/api/client" "github.com/OffchainLabs/prysm/v7/api/client"
eventClient "github.com/OffchainLabs/prysm/v7/api/client/event" eventClient "github.com/OffchainLabs/prysm/v7/api/client/event"
"github.com/OffchainLabs/prysm/v7/api/failover"
"github.com/OffchainLabs/prysm/v7/api/server/structs" "github.com/OffchainLabs/prysm/v7/api/server/structs"
"github.com/OffchainLabs/prysm/v7/config/features" "github.com/OffchainLabs/prysm/v7/config/features"
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives" "github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
@@ -24,6 +25,7 @@ import (
type grpcValidatorClient struct { type grpcValidatorClient struct {
*grpcClientManager[ethpb.BeaconNodeValidatorClient] *grpcClientManager[ethpb.BeaconNodeValidatorClient]
nodeClient *grpcNodeClient
isEventStreamRunning bool isEventStreamRunning bool
} }
@@ -282,6 +284,9 @@ func (*grpcValidatorClient) AggregatedSyncSelections(context.Context, []iface.Sy
func NewGrpcValidatorClient(conn validatorHelpers.NodeConnection) iface.ValidatorClient { func NewGrpcValidatorClient(conn validatorHelpers.NodeConnection) iface.ValidatorClient {
return &grpcValidatorClient{ return &grpcValidatorClient{
grpcClientManager: newGrpcClientManager(conn, ethpb.NewBeaconNodeValidatorClient), grpcClientManager: newGrpcClientManager(conn, ethpb.NewBeaconNodeValidatorClient),
nodeClient: &grpcNodeClient{
grpcClientManager: newGrpcClientManager(conn, ethpb.NewNodeClient),
},
} }
} }
@@ -382,16 +387,7 @@ func (c *grpcValidatorClient) Host() string {
return c.grpcClientManager.conn.GetGrpcConnectionProvider().CurrentHost() return c.grpcClientManager.conn.GetGrpcConnectionProvider().CurrentHost()
} }
func (c *grpcValidatorClient) SwitchHost(host string) { func (c *grpcValidatorClient) EnsureReady(ctx context.Context) bool {
provider := c.grpcClientManager.conn.GetGrpcConnectionProvider() provider := c.grpcClientManager.conn.GetGrpcConnectionProvider()
// Find the index of the requested host and switch to it return failover.EnsureReady(ctx, provider, c.nodeClient)
for i, h := range provider.Hosts() {
if h == host {
if err := provider.SwitchHost(i); err != nil {
log.WithError(err).WithField("host", host).Error("Failed to set gRPC host")
}
return
}
}
log.WithField("host", host).Warn("Requested gRPC host not found in configured endpoints")
} }

View File

@@ -8,12 +8,14 @@ import (
"time" "time"
eventClient "github.com/OffchainLabs/prysm/v7/api/client/event" eventClient "github.com/OffchainLabs/prysm/v7/api/client/event"
grpcutil "github.com/OffchainLabs/prysm/v7/api/grpc"
"github.com/OffchainLabs/prysm/v7/api/server/structs" "github.com/OffchainLabs/prysm/v7/api/server/structs"
"github.com/OffchainLabs/prysm/v7/consensus-types/primitives" "github.com/OffchainLabs/prysm/v7/consensus-types/primitives"
eth "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1" eth "github.com/OffchainLabs/prysm/v7/proto/prysm/v1alpha1"
"github.com/OffchainLabs/prysm/v7/testing/assert" "github.com/OffchainLabs/prysm/v7/testing/assert"
mock2 "github.com/OffchainLabs/prysm/v7/testing/mock" mock2 "github.com/OffchainLabs/prysm/v7/testing/mock"
"github.com/OffchainLabs/prysm/v7/testing/require" "github.com/OffchainLabs/prysm/v7/testing/require"
validatorHelpers "github.com/OffchainLabs/prysm/v7/validator/helpers"
validatorTesting "github.com/OffchainLabs/prysm/v7/validator/testing" validatorTesting "github.com/OffchainLabs/prysm/v7/validator/testing"
logTest "github.com/sirupsen/logrus/hooks/test" logTest "github.com/sirupsen/logrus/hooks/test"
"go.uber.org/mock/gomock" "go.uber.org/mock/gomock"
@@ -253,3 +255,94 @@ func TestStartEventStream(t *testing.T) {
}) })
} }
} }
func TestEnsureReady(t *testing.T) {
tests := []struct {
name string
hosts []string
healthResults []error // one per GetHealth call in order
expectedResult bool
expectedIndex int // expected provider index after EnsureReady
}{
{
name: "Single host ready",
hosts: []string{"host1:4000"},
healthResults: []error{nil},
expectedResult: true,
expectedIndex: 0,
},
{
name: "Single host not ready",
hosts: []string{"host1:4000"},
healthResults: []error{errors.New("not synced")},
expectedResult: false,
expectedIndex: 0,
},
{
name: "Multiple hosts first ready",
hosts: []string{"host1:4000", "host2:4000", "host3:4000"},
healthResults: []error{nil},
expectedResult: true,
expectedIndex: 0,
},
{
name: "Failover to second host",
hosts: []string{"host1:4000", "host2:4000", "host3:4000"},
healthResults: []error{errors.New("not synced"), nil},
expectedResult: true,
expectedIndex: 1,
},
{
name: "Failover to third host",
hosts: []string{"host1:4000", "host2:4000", "host3:4000"},
healthResults: []error{errors.New("not synced"), errors.New("not synced"), nil},
expectedResult: true,
expectedIndex: 2,
},
{
name: "All hosts down",
hosts: []string{"host1:4000", "host2:4000", "host3:4000"},
healthResults: []error{errors.New("not synced"), errors.New("not synced"), errors.New("not synced")},
expectedResult: false,
expectedIndex: 2,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
ctrl := gomock.NewController(t)
mockProvider := &grpcutil.MockGrpcProvider{
MockHosts: tt.hosts,
}
conn, err := validatorHelpers.NewNodeConnection(
validatorHelpers.WithGRPCProvider(mockProvider),
)
require.NoError(t, err)
mockNodeClient := mock2.NewMockNodeClient(ctrl)
for _, healthErr := range tt.healthResults {
if healthErr != nil {
mockNodeClient.EXPECT().GetHealth(gomock.Any(), gomock.Any()).Return(nil, healthErr)
} else {
mockNodeClient.EXPECT().GetHealth(gomock.Any(), gomock.Any()).Return(&emptypb.Empty{}, nil)
}
}
client := &grpcValidatorClient{
grpcClientManager: newGrpcClientManager(conn, func(_ grpc.ClientConnInterface) eth.BeaconNodeValidatorClient {
return mock2.NewMockBeaconNodeValidatorClient(ctrl)
}),
nodeClient: &grpcNodeClient{
grpcClientManager: newGrpcClientManager(conn, func(_ grpc.ClientConnInterface) eth.NodeClient {
return mockNodeClient
}),
},
}
result := client.EnsureReady(t.Context())
assert.Equal(t, tt.expectedResult, result)
assert.Equal(t, tt.expectedIndex, mockProvider.CurrentIndex)
})
}
}

View File

@@ -49,31 +49,39 @@ func (m *healthMonitor) IsHealthy() bool {
} }
func (m *healthMonitor) performHealthCheck() { func (m *healthMonitor) performHealthCheck() {
ishealthy := m.v.FindHealthyHost(m.ctx) ishealthy := m.v.EnsureReady(m.ctx)
m.Lock() m.Lock()
defer m.Unlock() defer m.Unlock()
if ishealthy { if ishealthy {
m.fails = 0 m.fails = 0
} else if m.maxFails > 0 && m.fails < m.maxFails { } else if m.maxFails > 0 && m.fails < m.maxFails {
log.WithFields(logrus.Fields{ log.WithFields(logrus.Fields{
"fails": m.fails, "fails": m.fails,
"maxFails": m.maxFails, "maxFails": m.maxFails,
"beaconNodeUrl": m.v.Host(),
}).Warn("Failed health check, beacon node is unresponsive") }).Warn("Failed health check, beacon node is unresponsive")
m.fails++ m.fails++
} else if m.maxFails > 0 && m.fails >= m.maxFails { } else if m.maxFails > 0 && m.fails >= m.maxFails {
log.WithField("maxFails", m.maxFails).Warn("Maximum health checks reached. Stopping health check routine") log.WithFields(logrus.Fields{
"maxFails": m.maxFails,
"beaconNodeUrl": m.v.Host(),
}).Warn("Maximum health checks reached. Stopping health check routine")
m.isHealthy = ishealthy m.isHealthy = ishealthy
m.cancel() m.cancel()
return return
} }
if ishealthy == m.isHealthy { if ishealthy == m.isHealthy {
// is not a new status so skip update // is not a new status so skip update
log.WithField("isHealthy", m.isHealthy).Debug("Health status did not change") log.WithFields(logrus.Fields{
"isHealthy": m.isHealthy,
"beaconNodeUrl": m.v.Host(),
}).Debug("Health status did not change")
return return
} }
log.WithFields(logrus.Fields{ log.WithFields(logrus.Fields{
"healthy": ishealthy, "current": ishealthy,
"previously": m.isHealthy, "previous": m.isHealthy,
"beaconNodeUrl": m.v.Host(),
}).Info("Health status changed") }).Info("Health status changed")
m.isHealthy = ishealthy m.isHealthy = ishealthy
go m.healthEventFeed.Send(ishealthy) // non blocking send go m.healthEventFeed.Send(ishealthy) // non blocking send

View File

@@ -25,8 +25,9 @@ func TestHealthMonitor_IsHealthy_Concurrency(t *testing.T) {
parentCtx, parentCancel := context.WithTimeout(context.Background(), 500*time.Millisecond) parentCtx, parentCancel := context.WithTimeout(context.Background(), 500*time.Millisecond)
t.Cleanup(parentCancel) t.Cleanup(parentCancel)
// Expectation for newHealthMonitor's FindHealthyHost call // Expectation for newHealthMonitor's EnsureReady call
mockValidator.EXPECT().FindHealthyHost(gomock.Any()).Return(true).Times(1) mockValidator.EXPECT().EnsureReady(gomock.Any()).Return(true).Times(1)
mockValidator.EXPECT().Host().Return("http://localhost:3500").AnyTimes()
monitor := newHealthMonitor(parentCtx, parentCancel, 3, mockValidator) monitor := newHealthMonitor(parentCtx, parentCancel, 3, mockValidator)
require.NotNil(t, monitor) require.NotNil(t, monitor)
@@ -64,81 +65,81 @@ func TestHealthMonitor_PerformHealthCheck(t *testing.T) {
mockValidator := validatormock.NewMockValidator(ctrl) mockValidator := validatormock.NewMockValidator(ctrl)
tests := []struct { tests := []struct {
expectStatusUpdate bool // true if healthyCh should receive a new, different status expectStatusUpdate bool // true if healthyCh should receive a new, different status
expectCancelCalled bool expectCancelCalled bool
expectedIsHealthy bool expectedIsHealthy bool
findHealthyHostReturns bool ensureReadyReturns bool
initialIsHealthy bool initialIsHealthy bool
expectedFails int expectedFails int
maxFails int maxFails int
initialFails int initialFails int
name string name string
}{ }{
{ {
name: "Becomes Unhealthy", name: "Becomes Unhealthy",
initialIsHealthy: true, initialIsHealthy: true,
initialFails: 0, initialFails: 0,
maxFails: 3, maxFails: 3,
findHealthyHostReturns: false, ensureReadyReturns: false,
expectedIsHealthy: false, expectedIsHealthy: false,
expectedFails: 1, expectedFails: 1,
expectCancelCalled: false, expectCancelCalled: false,
expectStatusUpdate: true, expectStatusUpdate: true,
}, },
{ {
name: "Becomes Healthy", name: "Becomes Healthy",
initialIsHealthy: false, initialIsHealthy: false,
initialFails: 1, initialFails: 1,
maxFails: 3, maxFails: 3,
findHealthyHostReturns: true, ensureReadyReturns: true,
expectedIsHealthy: true, expectedIsHealthy: true,
expectedFails: 0, expectedFails: 0,
expectCancelCalled: false, expectCancelCalled: false,
expectStatusUpdate: true, expectStatusUpdate: true,
}, },
{ {
name: "Remains Healthy", name: "Remains Healthy",
initialIsHealthy: true, initialIsHealthy: true,
initialFails: 0, initialFails: 0,
maxFails: 3, maxFails: 3,
findHealthyHostReturns: true, ensureReadyReturns: true,
expectedIsHealthy: true, expectedIsHealthy: true,
expectedFails: 0, expectedFails: 0,
expectCancelCalled: false, expectCancelCalled: false,
expectStatusUpdate: false, // Status did not change expectStatusUpdate: false, // Status did not change
}, },
{ {
name: "Remains Unhealthy", name: "Remains Unhealthy",
initialIsHealthy: false, initialIsHealthy: false,
initialFails: 1, initialFails: 1,
maxFails: 3, maxFails: 3,
findHealthyHostReturns: false, ensureReadyReturns: false,
expectedIsHealthy: false, expectedIsHealthy: false,
expectedFails: 2, expectedFails: 2,
expectCancelCalled: false, expectCancelCalled: false,
expectStatusUpdate: false, // Status did not change expectStatusUpdate: false, // Status did not change
}, },
{ {
name: "Max Fails Reached - Stays Unhealthy and Cancels", name: "Max Fails Reached - Stays Unhealthy and Cancels",
initialIsHealthy: false, initialIsHealthy: false,
initialFails: 2, // One fail away from maxFails initialFails: 2, // One fail away from maxFails
maxFails: 2, maxFails: 2,
findHealthyHostReturns: false, ensureReadyReturns: false,
expectedIsHealthy: false, expectedIsHealthy: false,
expectedFails: 2, expectedFails: 2,
expectCancelCalled: true, expectCancelCalled: true,
expectStatusUpdate: false, // Status was already false, no new update sent before cancel expectStatusUpdate: false, // Status was already false, no new update sent before cancel
}, },
{ {
name: "MaxFails is 0 - Remains Unhealthy, No Cancel", name: "MaxFails is 0 - Remains Unhealthy, No Cancel",
initialIsHealthy: false, initialIsHealthy: false,
initialFails: 100, // Arbitrarily high initialFails: 100, // Arbitrarily high
maxFails: 0, // Infinite maxFails: 0, // Infinite
findHealthyHostReturns: false, ensureReadyReturns: false,
expectedIsHealthy: false, expectedIsHealthy: false,
expectedFails: 100, expectedFails: 100,
expectCancelCalled: false, expectCancelCalled: false,
expectStatusUpdate: false, expectStatusUpdate: false,
}, },
} }
@@ -163,7 +164,8 @@ func TestHealthMonitor_PerformHealthCheck(t *testing.T) {
} }
monitor.healthEventFeed.Subscribe(monitor.healthyCh) monitor.healthEventFeed.Subscribe(monitor.healthyCh)
mockValidator.EXPECT().FindHealthyHost(gomock.Any()).Return(tt.findHealthyHostReturns) mockValidator.EXPECT().EnsureReady(gomock.Any()).Return(tt.ensureReadyReturns)
mockValidator.EXPECT().Host().Return("http://localhost:3500").AnyTimes()
monitor.performHealthCheck() monitor.performHealthCheck()
@@ -218,12 +220,14 @@ func TestHealthMonitor_HealthyChan_ReceivesUpdates(t *testing.T) {
ch := monitor.HealthyChan() ch := monitor.HealthyChan()
require.NotNil(t, ch) require.NotNil(t, ch)
mockValidator.EXPECT().Host().Return("http://localhost:3500").AnyTimes()
first := mockValidator.EXPECT(). first := mockValidator.EXPECT().
FindHealthyHost(gomock.Any()). EnsureReady(gomock.Any()).
Return(true).Times(1) Return(true).Times(1)
mockValidator.EXPECT(). mockValidator.EXPECT().
FindHealthyHost(gomock.Any()). EnsureReady(gomock.Any()).
Return(false). Return(false).
AnyTimes(). AnyTimes().
After(first) After(first)

View File

@@ -69,7 +69,7 @@ type Validator interface {
SetGraffiti(ctx context.Context, pubKey [fieldparams.BLSPubkeyLength]byte, graffiti []byte) error SetGraffiti(ctx context.Context, pubKey [fieldparams.BLSPubkeyLength]byte, graffiti []byte) error
DeleteGraffiti(ctx context.Context, pubKey [fieldparams.BLSPubkeyLength]byte) error DeleteGraffiti(ctx context.Context, pubKey [fieldparams.BLSPubkeyLength]byte) error
Host() string Host() string
FindHealthyHost(ctx context.Context) bool EnsureReady(ctx context.Context) bool
SetTicker() SetTicker()
} }

View File

@@ -152,5 +152,5 @@ type ValidatorClient interface {
AggregatedSelections(ctx context.Context, selections []BeaconCommitteeSelection) ([]BeaconCommitteeSelection, error) AggregatedSelections(ctx context.Context, selections []BeaconCommitteeSelection) ([]BeaconCommitteeSelection, error)
AggregatedSyncSelections(ctx context.Context, selections []SyncCommitteeSelection) ([]SyncCommitteeSelection, error) AggregatedSyncSelections(ctx context.Context, selections []SyncCommitteeSelection) ([]SyncCommitteeSelection, error)
Host() string Host() string
SwitchHost(host string) EnsureReady(ctx context.Context) bool
} }

View File

@@ -94,7 +94,7 @@ func (r *runner) run(ctx context.Context) {
return // Exit if context is canceled. return // Exit if context is canceled.
case slot := <-v.NextSlot(): case slot := <-v.NextSlot():
if !r.healthMonitor.IsHealthy() { if !r.healthMonitor.IsHealthy() {
log.Warn("Beacon node unhealthy, stopping runner") log.WithField("beaconNodeUrl", r.validator.Host()).Warn("Beacon node unhealthy, stopping runner")
return return
} }

View File

@@ -207,7 +207,6 @@ func (v *ValidatorService) Start() {
graffitiStruct: v.graffitiStruct, graffitiStruct: v.graffitiStruct,
graffitiOrderedIndex: graffitiOrderedIndex, graffitiOrderedIndex: graffitiOrderedIndex,
conn: v.conn, conn: v.conn,
currentHostIndex: 0,
validatorClient: validatorClient, validatorClient: validatorClient,
chainClient: beaconChainClientFactory.NewChainClient(v.conn), chainClient: beaconChainClientFactory.NewChainClient(v.conn),
nodeClient: nodeclientfactory.NewNodeClient(v.conn), nodeClient: nodeclientfactory.NewNodeClient(v.conn),
@@ -247,7 +246,7 @@ func (v *ValidatorService) Start() {
case isHealthy := <-hm.HealthyChan(): case isHealthy := <-hm.HealthyChan():
if !isHealthy { if !isHealthy {
// wait until the next health tracker update // wait until the next health tracker update
log.Warn("Validator service health check failed, waiting for healthy beacon node...") log.WithField("beaconNodeUrl", v.validator.Host()).Warn("Validator service health check failed, waiting for healthy beacon node...")
continue continue
} }

View File

@@ -23,7 +23,7 @@ var _ iface.Validator = (*FakeValidator)(nil)
// FakeValidator for mocking. // FakeValidator for mocking.
type FakeValidator struct { type FakeValidator struct {
CanChangeHost bool IsReady bool
LogValidatorGainsAndLossesCalled bool LogValidatorGainsAndLossesCalled bool
SaveProtectionsCalled bool SaveProtectionsCalled bool
DeleteProtectionCalled bool DeleteProtectionCalled bool
@@ -330,8 +330,8 @@ func (*FakeValidator) Host() string {
return "127.0.0.1:0" return "127.0.0.1:0"
} }
func (fv *FakeValidator) FindHealthyHost(_ context.Context) bool { func (fv *FakeValidator) EnsureReady(_ context.Context) bool {
return fv.CanChangeHost return fv.IsReady
} }
func (fv *FakeValidator) SetTicker() { func (fv *FakeValidator) SetTicker() {

View File

@@ -13,7 +13,7 @@ func NewValidatorClient(
opt ...beaconApi.ValidatorClientOpt, opt ...beaconApi.ValidatorClientOpt,
) iface.ValidatorClient { ) iface.ValidatorClient {
if features.Get().EnableBeaconRESTApi { if features.Get().EnableBeaconRESTApi {
return beaconApi.NewBeaconApiValidatorClient(validatorConn.GetRestHandler(), opt...) return beaconApi.NewBeaconApiValidatorClient(validatorConn.GetRestConnectionProvider(), opt...)
} }
return grpcApi.NewGrpcValidatorClient(validatorConn) return grpcApi.NewGrpcValidatorClient(validatorConn)
} }

View File

@@ -115,7 +115,6 @@ type validator struct {
km keymanager.IKeymanager km keymanager.IKeymanager
accountChangedSub event.Subscription accountChangedSub event.Subscription
ticker slots.Ticker ticker slots.Ticker
currentHostIndex uint64
genesisTime time.Time genesisTime time.Time
graffiti []byte graffiti []byte
voteStats voteStats voteStats voteStats
@@ -1311,65 +1310,8 @@ func (v *validator) Host() string {
return v.validatorClient.Host() return v.validatorClient.Host()
} }
func (v *validator) changeHost() { func (v *validator) EnsureReady(ctx context.Context) bool {
hosts := v.hosts() return v.validatorClient.EnsureReady(ctx)
if len(hosts) <= 1 {
return
}
next := (v.currentHostIndex + 1) % uint64(len(hosts))
log.WithFields(logrus.Fields{
"currentHost": hosts[v.currentHostIndex],
"nextHost": hosts[next],
}).Warn("Beacon node is not responding, switching host")
v.validatorClient.SwitchHost(hosts[next])
v.currentHostIndex = next
}
// hosts returns the list of configured beacon node hosts.
func (v *validator) hosts() []string {
if features.Get().EnableBeaconRESTApi {
return v.conn.GetRestConnectionProvider().Hosts()
}
return v.conn.GetGrpcConnectionProvider().Hosts()
}
// numHosts returns the number of configured beacon node hosts.
func (v *validator) numHosts() int {
return len(v.hosts())
}
func (v *validator) FindHealthyHost(ctx context.Context) bool {
numHosts := v.numHosts()
startingHost := v.Host()
attemptedHosts := []string{}
// Check all hosts for a fully synced node
for i := range numHosts {
if v.nodeClient.IsReady(ctx) {
if len(attemptedHosts) > 0 {
log.WithFields(logrus.Fields{
"previousHost": startingHost,
"newHost": v.Host(),
"failedAttempts": attemptedHosts,
}).Info("Failover succeeded: connected to healthy beacon node")
}
return true
}
log.WithField("host", v.Host()).Debug("Beacon node not fully synced")
attemptedHosts = append(attemptedHosts, v.Host())
// Try next host if not the last iteration
if i < numHosts-1 {
v.changeHost()
}
}
if numHosts == 1 {
log.WithField("host", v.Host()).Warn("Beacon node is not fully synced, no backup node configured")
} else {
log.Warn("No fully synced beacon node found")
}
return false
} }
func (v *validator) filterAndCacheActiveKeys(ctx context.Context, pubkeys [][fieldparams.BLSPubkeyLength]byte, slot primitives.Slot) ([][fieldparams.BLSPubkeyLength]byte, error) { func (v *validator) filterAndCacheActiveKeys(ctx context.Context, pubkeys [][fieldparams.BLSPubkeyLength]byte, slot primitives.Slot) ([][fieldparams.BLSPubkeyLength]byte, error) {

View File

@@ -17,7 +17,6 @@ import (
"time" "time"
grpcutil "github.com/OffchainLabs/prysm/v7/api/grpc" grpcutil "github.com/OffchainLabs/prysm/v7/api/grpc"
"github.com/OffchainLabs/prysm/v7/api/rest"
"github.com/OffchainLabs/prysm/v7/api/server/structs" "github.com/OffchainLabs/prysm/v7/api/server/structs"
"github.com/OffchainLabs/prysm/v7/async/event" "github.com/OffchainLabs/prysm/v7/async/event"
"github.com/OffchainLabs/prysm/v7/cmd/validator/flags" "github.com/OffchainLabs/prysm/v7/cmd/validator/flags"
@@ -2794,34 +2793,6 @@ func TestValidator_Host(t *testing.T) {
require.Equal(t, "host", v.Host()) require.Equal(t, "host", v.Host())
} }
func TestValidator_ChangeHost(t *testing.T) {
// Enable REST API mode for this test since changeHost only calls SwitchHost in REST API mode
resetCfg := features.InitWithReset(&features.Flags{EnableBeaconRESTApi: true})
defer resetCfg()
ctrl := gomock.NewController(t)
defer ctrl.Finish()
hosts := []string{"http://localhost:8080", "http://localhost:8081"}
restProvider := &rest.MockRestProvider{MockHosts: hosts}
conn, err := validatorHelpers.NewNodeConnection(validatorHelpers.WithRestProvider(restProvider))
require.NoError(t, err)
client := validatormock.NewMockValidatorClient(ctrl)
v := validator{
validatorClient: client,
conn: conn,
currentHostIndex: 0,
}
client.EXPECT().SwitchHost(hosts[1])
client.EXPECT().SwitchHost(hosts[0])
v.changeHost()
assert.Equal(t, uint64(1), v.currentHostIndex)
v.changeHost()
assert.Equal(t, uint64(0), v.currentHostIndex)
}
func TestUpdateValidatorStatusCache(t *testing.T) { func TestUpdateValidatorStatusCache(t *testing.T) {
ctx := t.Context() ctx := t.Context()
ctrl := gomock.NewController(t) ctrl := gomock.NewController(t)
@@ -2855,9 +2826,8 @@ func TestUpdateValidatorStatusCache(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
v := &validator{ v := &validator{
validatorClient: client, validatorClient: client,
conn: conn, conn: conn,
currentHostIndex: 0,
pubkeyToStatus: map[[fieldparams.BLSPubkeyLength]byte]*validatorStatus{ pubkeyToStatus: map[[fieldparams.BLSPubkeyLength]byte]*validatorStatus{
[fieldparams.BLSPubkeyLength]byte{0x03}: { // add non existent key and status to cache, should be fully removed on update [fieldparams.BLSPubkeyLength]byte{0x03}: { // add non existent key and status to cache, should be fully removed on update
publicKey: []byte{0x03}, publicKey: []byte{0x03},

View File

@@ -20,7 +20,7 @@ type NodeConnection interface {
GetRestConnectionProvider() rest.RestConnectionProvider GetRestConnectionProvider() rest.RestConnectionProvider
// GetRestHandler returns the REST handler for making API requests. // GetRestHandler returns the REST handler for making API requests.
// Returns nil if no REST provider is configured. // Returns nil if no REST provider is configured.
GetRestHandler() rest.RestHandler GetRestHandler() rest.Handler
} }
type nodeConnection struct { type nodeConnection struct {
@@ -43,11 +43,11 @@ func (c *nodeConnection) GetRestConnectionProvider() rest.RestConnectionProvider
return c.restConnectionProvider return c.restConnectionProvider
} }
func (c *nodeConnection) GetRestHandler() rest.RestHandler { func (c *nodeConnection) GetRestHandler() rest.Handler {
if c.restConnectionProvider == nil { if c.restConnectionProvider == nil {
return nil return nil
} }
return c.restConnectionProvider.RestHandler() return c.restConnectionProvider.Handler()
} }
// NodeConnectionOption is a functional option for configuring a NodeConnection. // NodeConnectionOption is a functional option for configuring a NodeConnection.

View File

@@ -42,7 +42,7 @@ func TestNewNodeConnection(t *testing.T) {
assert.Equal(t, grpcProvider, conn.GetGrpcConnectionProvider()) assert.Equal(t, grpcProvider, conn.GetGrpcConnectionProvider())
assert.Equal(t, (rest.RestConnectionProvider)(nil), conn.GetRestConnectionProvider()) assert.Equal(t, (rest.RestConnectionProvider)(nil), conn.GetRestConnectionProvider())
assert.Equal(t, (rest.RestHandler)(nil), conn.GetRestHandler()) assert.Equal(t, (rest.Handler)(nil), conn.GetRestHandler())
}) })
t.Run("with no providers returns error", func(t *testing.T) { t.Run("with no providers returns error", func(t *testing.T) {
@@ -84,7 +84,7 @@ func TestNodeConnection_GetGrpcClientConn(t *testing.T) {
func TestNodeConnection_GetRestHandler(t *testing.T) { func TestNodeConnection_GetRestHandler(t *testing.T) {
t.Run("delegates to provider", func(t *testing.T) { t.Run("delegates to provider", func(t *testing.T) {
mockHandler := &rest.MockRestHandler{} mockHandler := &rest.MockHandler{}
restProvider := &rest.MockRestProvider{MockHandler: mockHandler, MockHosts: []string{"http://localhost:3500"}} restProvider := &rest.MockRestProvider{MockHandler: mockHandler, MockHosts: []string{"http://localhost:3500"}}
conn, err := NewNodeConnection(WithRestProvider(restProvider)) conn, err := NewNodeConnection(WithRestProvider(restProvider))
require.NoError(t, err) require.NoError(t, err)
@@ -96,6 +96,6 @@ func TestNodeConnection_GetRestHandler(t *testing.T) {
grpcProvider := &grpcutil.MockGrpcProvider{MockHosts: []string{"localhost:4000"}} grpcProvider := &grpcutil.MockGrpcProvider{MockHosts: []string{"localhost:4000"}}
conn, err := NewNodeConnection(WithGRPCProvider(grpcProvider)) conn, err := NewNodeConnection(WithGRPCProvider(grpcProvider))
require.NoError(t, err) require.NoError(t, err)
assert.Equal(t, (rest.RestHandler)(nil), conn.GetRestHandler()) assert.Equal(t, (rest.Handler)(nil), conn.GetRestHandler())
}) })
} }