forked from TrueCloudLab/frostfs-api-go
[#122] protogen: Always marshal empty fields
This is how it was done previously:
a0a9b765f3/rpc/message/encoding.go (L31)
The tricky part is `[]byte` which is marshaled as `null` by easyjson
helper, but as `""` by protojson.
Signed-off-by: Evgenii Stratonikov <e.stratonikov@yadro.com>
This commit is contained in:
parent
3e705a3cbe
commit
29c522d5d8
20 changed files with 3574 additions and 4230 deletions
|
@ -26,11 +26,37 @@ func nonZero[T protoInt]() T {
|
|||
|
||||
func TestStableMarshalSingle(t *testing.T) {
|
||||
t.Run("empty", func(t *testing.T) {
|
||||
input := &generated.Primitives{}
|
||||
require.Zero(t, input.StableSize())
|
||||
t.Run("proto", func(t *testing.T) {
|
||||
input := &generated.Primitives{}
|
||||
require.Zero(t, input.StableSize())
|
||||
|
||||
r := input.MarshalProtobuf(nil)
|
||||
require.Empty(t, r)
|
||||
r := input.MarshalProtobuf(nil)
|
||||
require.Empty(t, r)
|
||||
})
|
||||
t.Run("json", func(t *testing.T) {
|
||||
input := &generated.Primitives{}
|
||||
r, err := input.MarshalJSON()
|
||||
require.NoError(t, err)
|
||||
require.NotEmpty(t, r)
|
||||
|
||||
var actual test.Primitives
|
||||
require.NoError(t, protojson.Unmarshal(r, &actual))
|
||||
|
||||
t.Run("protojson compatibility", func(t *testing.T) {
|
||||
data, err := protojson.MarshalOptions{EmitUnpopulated: true}.Marshal(&actual)
|
||||
require.NoError(t, err)
|
||||
require.JSONEq(t, string(data), string(r))
|
||||
})
|
||||
|
||||
var actualFrostfs generated.Primitives
|
||||
require.NoError(t, actualFrostfs.UnmarshalJSON(r))
|
||||
if len(actualFrostfs.FieldA) == 0 {
|
||||
actualFrostfs.FieldA = nil
|
||||
}
|
||||
require.Equal(t, input, &actualFrostfs)
|
||||
|
||||
primitivesEqual(t, input, &actual)
|
||||
})
|
||||
})
|
||||
|
||||
marshalCases := []struct {
|
||||
|
@ -77,13 +103,16 @@ func TestStableMarshalSingle(t *testing.T) {
|
|||
require.NoError(t, protojson.Unmarshal(r, &actual))
|
||||
|
||||
t.Run("protojson compatibility", func(t *testing.T) {
|
||||
data, err := protojson.Marshal(&actual)
|
||||
data, err := protojson.MarshalOptions{EmitUnpopulated: true}.Marshal(&actual)
|
||||
require.NoError(t, err)
|
||||
require.JSONEq(t, string(data), string(r))
|
||||
})
|
||||
|
||||
var actualFrostfs generated.Primitives
|
||||
require.NoError(t, actualFrostfs.UnmarshalJSON(r))
|
||||
if len(actualFrostfs.FieldA) == 0 {
|
||||
actualFrostfs.FieldA = nil
|
||||
}
|
||||
require.Equal(t, tc.input, &actualFrostfs)
|
||||
|
||||
primitivesEqual(t, tc.input, &actual)
|
||||
|
@ -94,7 +123,10 @@ func TestStableMarshalSingle(t *testing.T) {
|
|||
|
||||
func primitivesEqual(t *testing.T, a *generated.Primitives, b *test.Primitives) {
|
||||
// Compare each field directly, because proto-generated code has private fields.
|
||||
require.Equal(t, a.FieldA, b.FieldA)
|
||||
require.Equal(t, len(a.FieldA), len(b.FieldA))
|
||||
if len(a.FieldA) != 0 {
|
||||
require.Equal(t, a.FieldA, b.FieldA)
|
||||
}
|
||||
require.Equal(t, a.FieldB, b.FieldB)
|
||||
require.Equal(t, a.FieldC, b.FieldC)
|
||||
require.Equal(t, a.FieldD, b.FieldD)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue