prysm-pulse/validator/rpc/apimiddleware/structs_test.go
terencechain d17996f8b0
Update to V4 🚀 (#12134)
* Update V3 from V4

* Fix build v3 -> v4

* Update ssz

* Update beacon_chain.pb.go

* Fix formatter import

* Update update-mockgen.sh comment to v4

* Fix conflicts. Pass build and tests

* Fix test
2023-03-17 18:52:56 +00:00

272 lines
7.0 KiB
Go

package apimiddleware
import (
"encoding/json"
"fmt"
"testing"
fieldparams "github.com/prysmaticlabs/prysm/v4/config/fieldparams"
"github.com/prysmaticlabs/prysm/v4/proto/eth/service"
"github.com/prysmaticlabs/prysm/v4/testing/require"
)
func TestListKeystores_JSONisEqual(t *testing.T) {
middlewareResponse := &ListKeystoresResponseJson{
Keystores: []*KeystoreJson{
{
ValidatingPubkey: "0x0",
DerivationPath: "m/44'/60'/0'/0/0",
},
},
}
protoResponse := &service.ListKeystoresResponse{
Data: []*service.ListKeystoresResponse_Keystore{
{
ValidatingPubkey: make([]byte, fieldparams.BLSPubkeyLength),
DerivationPath: "m/44'/60'/0'/0/0",
},
},
}
listResp, err := areJsonPropertyNamesEqual(middlewareResponse, protoResponse)
require.NoError(t, err)
require.Equal(t, listResp, true)
resp, err := areJsonPropertyNamesEqual(middlewareResponse.Keystores[0], protoResponse.Data[0])
require.NoError(t, err)
require.Equal(t, resp, true)
}
func TestImportKeystores_JSONisEqual(t *testing.T) {
importKeystoresRequest := &ImportKeystoresRequestJson{}
protoImportRequest := &service.ImportKeystoresRequest{
Keystores: []string{""},
Passwords: []string{""},
SlashingProtection: "a",
}
requestResp, err := areJsonPropertyNamesEqual(importKeystoresRequest, protoImportRequest)
require.NoError(t, err)
require.Equal(t, requestResp, true)
importKeystoresResponse := &ImportKeystoresResponseJson{
Statuses: []*StatusJson{
{
Status: "Error",
Message: "a",
},
},
}
protoImportKeystoresResponse := &service.ImportKeystoresResponse{
Data: []*service.ImportedKeystoreStatus{
{
Status: service.ImportedKeystoreStatus_ERROR,
Message: "a",
},
},
}
ImportResp, err := areJsonPropertyNamesEqual(importKeystoresResponse, protoImportKeystoresResponse)
require.NoError(t, err)
require.Equal(t, ImportResp, true)
resp, err := areJsonPropertyNamesEqual(importKeystoresResponse.Statuses[0], protoImportKeystoresResponse.Data[0])
require.NoError(t, err)
require.Equal(t, resp, true)
}
func TestDeleteKeystores_JSONisEqual(t *testing.T) {
deleteKeystoresRequest := &DeleteKeystoresRequestJson{}
protoDeleteRequest := &service.DeleteKeystoresRequest{
Pubkeys: [][]byte{{}},
}
requestResp, err := areJsonPropertyNamesEqual(deleteKeystoresRequest, protoDeleteRequest)
require.NoError(t, err)
require.Equal(t, requestResp, true)
deleteKeystoresResponse := &DeleteKeystoresResponseJson{
Statuses: []*StatusJson{
{
Status: "Error",
Message: "a",
},
},
SlashingProtection: "a",
}
protoDeleteResponse := &service.DeleteKeystoresResponse{
Data: []*service.DeletedKeystoreStatus{
{
Status: service.DeletedKeystoreStatus_ERROR,
Message: "a",
},
},
SlashingProtection: "a",
}
deleteResp, err := areJsonPropertyNamesEqual(deleteKeystoresResponse, protoDeleteResponse)
require.NoError(t, err)
require.Equal(t, deleteResp, true)
resp, err := areJsonPropertyNamesEqual(deleteKeystoresResponse.Statuses[0], protoDeleteResponse.Data[0])
require.NoError(t, err)
require.Equal(t, resp, true)
}
func TestListRemoteKeys_JSONisEqual(t *testing.T) {
middlewareResponse := &ListRemoteKeysResponseJson{
Keystores: []*RemoteKeysListJson{
{
Pubkey: "0x0",
Url: "http://localhost:8080",
Readonly: true,
},
},
}
protoResponse := &service.ListRemoteKeysResponse{
Data: []*service.ListRemoteKeysResponse_Keystore{
{
Pubkey: make([]byte, fieldparams.BLSPubkeyLength),
Url: "http://localhost:8080",
Readonly: true,
},
},
}
listResp, err := areJsonPropertyNamesEqual(middlewareResponse, protoResponse)
require.NoError(t, err)
require.Equal(t, listResp, true)
resp, err := areJsonPropertyNamesEqual(middlewareResponse.Keystores[0], protoResponse.Data[0])
require.NoError(t, err)
require.Equal(t, resp, true)
}
func TestImportRemoteKeys_JSONisEqual(t *testing.T) {
importKeystoresRequest := &ImportRemoteKeysRequestJson{}
protoImportRequest := &service.ImportRemoteKeysRequest{
RemoteKeys: []*service.ImportRemoteKeysRequest_Keystore{
{
Pubkey: make([]byte, fieldparams.BLSPubkeyLength),
Url: "http://localhost:8080",
},
},
}
requestResp, err := areJsonPropertyNamesEqual(importKeystoresRequest, protoImportRequest)
require.NoError(t, err)
require.Equal(t, requestResp, true)
importKeystoresResponse := &ImportRemoteKeysResponseJson{
Statuses: []*StatusJson{
{
Status: "Error",
Message: "a",
},
},
}
protoImportKeystoresResponse := &service.ImportRemoteKeysResponse{
Data: []*service.ImportedRemoteKeysStatus{
{
Status: service.ImportedRemoteKeysStatus_ERROR,
Message: "a",
},
},
}
ImportResp, err := areJsonPropertyNamesEqual(importKeystoresResponse, protoImportKeystoresResponse)
require.NoError(t, err)
require.Equal(t, ImportResp, true)
resp, err := areJsonPropertyNamesEqual(importKeystoresResponse.Statuses[0], protoImportKeystoresResponse.Data[0])
require.NoError(t, err)
require.Equal(t, resp, true)
}
func TestDeleteRemoteKeys_JSONisEqual(t *testing.T) {
deleteKeystoresRequest := &DeleteRemoteKeysRequestJson{}
protoDeleteRequest := &service.DeleteRemoteKeysRequest{
Pubkeys: [][]byte{{}},
}
requestResp, err := areJsonPropertyNamesEqual(deleteKeystoresRequest, protoDeleteRequest)
require.NoError(t, err)
require.Equal(t, requestResp, true)
deleteKeystoresResponse := &DeleteRemoteKeysResponseJson{
Statuses: []*StatusJson{
{
Status: "Error",
Message: "a",
},
},
}
protoDeleteResponse := &service.DeleteRemoteKeysResponse{
Data: []*service.DeletedRemoteKeysStatus{
{
Status: service.DeletedRemoteKeysStatus_ERROR,
Message: "a",
},
},
}
deleteResp, err := areJsonPropertyNamesEqual(deleteKeystoresResponse, protoDeleteResponse)
require.NoError(t, err)
require.Equal(t, deleteResp, true)
resp, err := areJsonPropertyNamesEqual(deleteKeystoresResponse.Statuses[0], protoDeleteResponse.Data[0])
require.NoError(t, err)
require.Equal(t, resp, true)
}
// note: this does not do a deep comparison of the structs
func areJsonPropertyNamesEqual(internal, proto interface{}) (bool, error) {
internalJSON, err := json.Marshal(internal)
if err != nil {
return false, err
}
protoJSON, err := json.Marshal(proto)
if err != nil {
return false, err
}
var internalRaw map[string]json.RawMessage
err = json.Unmarshal(internalJSON, &internalRaw)
if err != nil {
return false, err
}
var protoRaw map[string]json.RawMessage
err = json.Unmarshal(protoJSON, &protoRaw)
if err != nil {
return false, err
}
internalKeys := make([]string, 0, len(internalRaw))
protoKeys := make([]string, 0, len(protoRaw))
for key := range internalRaw {
internalKeys = append(internalKeys, key)
if _, ok := protoRaw[key]; !ok {
fmt.Printf("key: %s not found\n", key)
fmt.Printf("proto: %v\n", protoRaw)
return false, nil
} else {
protoKeys = append(protoKeys, key)
fmt.Printf("key: %s\n", key)
}
}
if len(internalKeys) != len(protoKeys) {
return false, nil
}
return true, nil
}