diff --git a/pkg/schema/field/number.go b/pkg/schema/field/number.go index 1075ef2bc075ef07aa403ee3ad1dd51903f32345..d8dc218f8551c0ad589532f972113a8fb88e9674 100644 --- a/pkg/schema/field/number.go +++ b/pkg/schema/field/number.go @@ -90,6 +90,9 @@ func (NumberType) decode(_ context.Context, field *Field, v interface{}) (interf case int64: return i, nil case uint64: + if i > maxInt { + return nil, errors.New("integer out of range") + } return i, nil case float64: if i > maxInt || i < minInt { diff --git a/pkg/schema/field/number_test.go b/pkg/schema/field/number_test.go index 797091669c780b422238866453d30d592de34a24..da154cd09fa7dcd80b53108a6f80c2b0fcca1f5f 100644 --- a/pkg/schema/field/number_test.go +++ b/pkg/schema/field/number_test.go @@ -1,6 +1,7 @@ package field import ( + "context" "math" "reflect" "testing" @@ -42,7 +43,7 @@ func TestNumberField_Decode(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := Decode(nil, tt.field, tt.data) + got, err := Decode(context.Background(), tt.field, tt.data) if (err != nil) != tt.wantErr { t.Errorf("Decode() error = %v, wantErr %v", err, tt.wantErr) return @@ -82,7 +83,7 @@ func TestNumberField_Encode(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := Encode(nil, tt.field, tt.data) + got, err := Encode(context.Background(), tt.field, tt.data) if (err != nil) != tt.wantErr { t.Errorf("Decode() error = %v, wantErr %v", err, tt.wantErr) return diff --git a/pkg/schema/test/object_test.go b/pkg/schema/test/object_test.go index e5af975cdb9ed8e86044e5d357530dd2420afee9..4d9d13a521b6c4f9de48e507759e425afbb2b88b 100644 --- a/pkg/schema/test/object_test.go +++ b/pkg/schema/test/object_test.go @@ -74,6 +74,66 @@ func TestNumberField_JSON(t *testing.T) { assert.Equal(t, fld, res) } +func TestNumberField_JSON_With_MaxInt(t *testing.T) { + t.Run("Without overflow from int64", func(t *testing.T) { + fld := field.Object("num", field.Number(field.NumberFormatInt)) + + itemData := map[string]interface{}{"num": 1<<53 - 1} + + b, err := json.Marshal(itemData) + require.NoError(t, err) + + itemDataToDecode := make(map[string]interface{}) + require.NoError(t, json.Unmarshal(b, &itemDataToDecode)) + + _, err = field.Decode(context.Background(), fld, itemDataToDecode) + require.NoError(t, err) + }) + t.Run("With overflow from int64", func(t *testing.T) { + fld := field.Object("num", field.Number(field.NumberFormatInt)) + + itemData := map[string]interface{}{"num": 1 << 53} + + b, err := json.Marshal(itemData) + require.NoError(t, err) + + itemDataToDecode := make(map[string]interface{}) + require.NoError(t, json.Unmarshal(b, &itemDataToDecode)) + + _, err = field.Decode(context.Background(), fld, itemDataToDecode) + require.Error(t, err, "integer out of range") + }) + t.Run("With overflow from uint64", func(t *testing.T) { + fld := field.Object("num", field.Number(field.NumberFormatInt)) + + itemData := map[string]interface{}{"num": uint64(1 << 53)} + + b, err := json.Marshal(itemData) + require.NoError(t, err) + + itemDataToDecode := make(map[string]interface{}) + require.NoError(t, json.Unmarshal(b, &itemDataToDecode)) + + _, err = field.Decode(context.Background(), fld, itemDataToDecode) + require.Error(t, err, "integer out of range") + }) + t.Run("With overflow from float64", func(t *testing.T) { + fld := field.Object("num", field.Number(field.NumberFormatInt)) + + itemData := map[string]interface{}{"num": float64(1 << 53)} + + b, err := json.Marshal(itemData) + require.NoError(t, err) + + itemDataToDecode := make(map[string]interface{}) + require.NoError(t, json.Unmarshal(b, &itemDataToDecode)) + + _, err = field.Decode(context.Background(), fld, itemDataToDecode) + require.Error(t, err, "integer out of range") + }) + +} + func TestSchema_JSON(t *testing.T) { enumStr := field.String().AddOptions( validate.Enum(