Skip to content

Commit

Permalink
Merge pull request #117 from ObolNetwork/gsora/validatorstate-panic
Browse files Browse the repository at this point in the history
Check correctness of ValidatorState value
  • Loading branch information
mcdee authored Mar 19, 2024
2 parents 605f842 + 3a40bf1 commit c531d84
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 2 deletions.
15 changes: 13 additions & 2 deletions api/v1/validatorstate.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,9 +59,20 @@ var validatorStateStrings = [...]string{
"withdrawal_done",
}

// valid returns true if v integer value can be represented as one of the validator state strings.
func (v ValidatorState) valid() bool {
return v >= 0 && int(v) < len(validatorStateStrings)
}

// MarshalJSON implements json.Marshaler.
func (v *ValidatorState) MarshalJSON() ([]byte, error) {
return []byte(fmt.Sprintf("%q", validatorStateStrings[*v])), nil
vs := validatorStateStrings[0]

if v.valid() {
vs = validatorStateStrings[*v]
}

return []byte(fmt.Sprintf("%q", vs)), nil
}

// UnmarshalJSON implements json.Unmarshaler.
Expand Down Expand Up @@ -96,7 +107,7 @@ func (v *ValidatorState) UnmarshalJSON(input []byte) error {
}

func (v ValidatorState) String() string {
if v < 0 || int(v) >= len(validatorStateStrings) {
if !v.valid() {
return validatorStateStrings[0] // unknown
}

Expand Down
57 changes: 57 additions & 0 deletions api/v1/validatorstate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ package v1_test

import (
"encoding/json"
"math"
"strings"
"testing"

Expand Down Expand Up @@ -386,3 +387,59 @@ func TestString(t *testing.T) {
})
}
}

func TestMarshalJSON(t *testing.T) {
tests := []struct {
name string
state api.ValidatorState
expected []byte
errFunc require.ErrorAssertionFunc
}{
{
"ok validator state",
api.ValidatorStateActiveOngoing,
[]byte(`"active_ongoing"`),
require.NoError,
},
{
"very high invalid validator state",
math.MaxInt,
[]byte(`"unknown"`),
require.NoError,
},
{
"very low invalid validator state",
math.MinInt,
[]byte(`"unknown"`),
require.NoError,
},
{
"overflowing integer validator state",
math.MaxInt64,
[]byte(`"unknown"`),
require.NoError,
},
{
"underflowing integer validator state",
math.MinInt64,
[]byte(`"unknown"`),
require.NoError,
},
{
"zero is unknown",
0,
[]byte(`"unknown"`),
require.NoError,
},
}

for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
require.NotPanics(t, func() {
res, err := json.Marshal(&test.state) //test.state.MarshalJSON()
test.errFunc(t, err)
require.Equal(t, test.expected, res)
})
})
}
}

0 comments on commit c531d84

Please sign in to comment.