encoding/textpb: clean up tests on Any

Remove unnecessary v1 wrapping. Change most tests to operate on message
Any directly.

Change-Id: I19bbca6c1af72894f6a292aab8ebd09e0301a260
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/168517
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
This commit is contained in:
Herbie Ong 2019-03-20 18:05:16 -07:00
parent ca46d8c924
commit 300cff08c7
2 changed files with 80 additions and 133 deletions

View File

@ -57,7 +57,7 @@ func TestUnmarshal(t *testing.T) {
inputMessage proto.Message
inputText string
wantMessage proto.Message
wantErr bool
wantErr bool // TODO: Verify error message content.
}{{
desc: "proto2 empty message",
inputMessage: &pb2.Scalars{},
@ -1254,8 +1254,7 @@ opt_int32: 42
inputText: `
[pb2.message_set_extension]: {
opt_string: "another not a messageset extension"
}
`,
}`,
wantMessage: func() proto.Message {
m := &pb2.MessageSet{}
setExtension(m, pb2.E_MessageSetExtension, &pb2.FakeMessageSetExtension{
@ -1264,59 +1263,41 @@ opt_int32: 42
return m
}(),
}, {
// TODO: Change these tests to directly use knownpb.Any type instead once
// type has been regenerated with V2 compiler.
desc: "Any not expanded",
inputMessage: &pb2.KnownTypes{},
inputText: `opt_any: {
inputMessage: &knownpb.Any{},
inputText: `
type_url: "pb2.Nested"
value: "some bytes"
}
`,
wantMessage: &pb2.KnownTypes{
OptAny: &knownpb.Any{
TypeUrl: "pb2.Nested",
Value: []byte("some bytes"),
},
wantMessage: &knownpb.Any{
TypeUrl: "pb2.Nested",
Value: []byte("some bytes"),
},
}, {
desc: "Any not expanded missing value",
inputMessage: &pb2.KnownTypes{},
inputText: `opt_any: {
type_url: "pb2.Nested"
}
`,
wantMessage: &pb2.KnownTypes{
OptAny: &knownpb.Any{
TypeUrl: "pb2.Nested",
},
inputMessage: &knownpb.Any{},
inputText: `type_url: "pb2.Nested"`,
wantMessage: &knownpb.Any{
TypeUrl: "pb2.Nested",
},
}, {
desc: "Any not expanded missing type_url",
inputMessage: &pb2.KnownTypes{},
inputText: `opt_any: {
value: "some bytes"
}
`,
wantMessage: &pb2.KnownTypes{
OptAny: &knownpb.Any{
Value: []byte("some bytes"),
},
inputMessage: &knownpb.Any{},
inputText: `value: "some bytes"`,
wantMessage: &knownpb.Any{
Value: []byte("some bytes"),
},
}, {
desc: "Any expanded",
umo: func() textpb.UnmarshalOptions {
m := &pb2.Nested{}
resolver := preg.NewTypes(m.ProtoReflect().Type())
return textpb.UnmarshalOptions{Resolver: resolver}
}(),
inputMessage: &pb2.KnownTypes{},
inputText: `opt_any: {
[foobar/pb2.Nested]: {
opt_string: "embedded inside Any"
opt_nested: {
opt_string: "inception"
}
umo: textpb.UnmarshalOptions{
Resolver: preg.NewTypes((&pb2.Nested{}).ProtoReflect().Type()),
},
inputMessage: &knownpb.Any{},
inputText: `
[foobar/pb2.Nested]: {
opt_string: "embedded inside Any"
opt_nested: {
opt_string: "inception"
}
}
`,
@ -1331,110 +1312,82 @@ value: "some bytes"
if err != nil {
t.Fatalf("error in binary marshaling message for Any.value: %v", err)
}
return &pb2.KnownTypes{
OptAny: &knownpb.Any{
TypeUrl: "foobar/pb2.Nested",
Value: b,
},
return &knownpb.Any{
TypeUrl: "foobar/pb2.Nested",
Value: b,
}
}(),
}, {
desc: "Any expanded with empty value",
umo: func() textpb.UnmarshalOptions {
m := &pb2.Nested{}
resolver := preg.NewTypes(m.ProtoReflect().Type())
return textpb.UnmarshalOptions{Resolver: resolver}
}(),
inputMessage: &pb2.KnownTypes{},
inputText: `opt_any: {
[foo.com/pb2.Nested]: {}
}
`,
wantMessage: &pb2.KnownTypes{
OptAny: &knownpb.Any{
TypeUrl: "foo.com/pb2.Nested",
},
umo: textpb.UnmarshalOptions{
Resolver: preg.NewTypes((&pb2.Nested{}).ProtoReflect().Type()),
},
inputMessage: &knownpb.Any{},
inputText: `[foo.com/pb2.Nested]: {}`,
wantMessage: &knownpb.Any{
TypeUrl: "foo.com/pb2.Nested",
},
}, {
desc: "Any expanded with missing required error",
umo: func() textpb.UnmarshalOptions {
m := &pb2.PartialRequired{}
resolver := preg.NewTypes(m.ProtoReflect().Type())
return textpb.UnmarshalOptions{Resolver: resolver}
}(),
inputMessage: &pb2.KnownTypes{},
inputText: `opt_any: {
[pb2.PartialRequired]: {
opt_string: "embedded inside Any"
}
umo: textpb.UnmarshalOptions{
Resolver: preg.NewTypes((&pb2.PartialRequired{}).ProtoReflect().Type()),
},
inputMessage: &knownpb.Any{},
inputText: `
[pb2.PartialRequired]: {
opt_string: "embedded inside Any"
}
`,
wantMessage: func() proto.Message {
m := &pb2.PartialRequired{
OptString: scalar.String("embedded inside Any"),
}
// TODO: Switch to V2 marshal when ready.
b, err := protoV1.Marshal(m)
// Ignore required not set error.
if _, ok := err.(*protoV1.RequiredNotSetError); !ok {
b, err := proto.MarshalOptions{Deterministic: true}.Marshal(m)
// TODO: Marshal may fail due to required field not set at some
// point. Need to ignore required not set error here.
if err != nil {
t.Fatalf("error in binary marshaling message for Any.value: %v", err)
}
return &pb2.KnownTypes{
OptAny: &knownpb.Any{
TypeUrl: "pb2.PartialRequired",
Value: b,
},
return &knownpb.Any{
TypeUrl: "pb2.PartialRequired",
Value: b,
}
}(),
wantErr: true,
}, {
desc: "Any expanded with unregistered type",
umo: textpb.UnmarshalOptions{Resolver: preg.NewTypes()},
inputMessage: &pb2.KnownTypes{},
inputText: `opt_any: {
[SomeMessage]: {}
}
`,
wantErr: true,
inputMessage: &knownpb.Any{},
inputText: `[SomeMessage]: {}`,
wantErr: true,
}, {
desc: "Any expanded with invalid value",
umo: func() textpb.UnmarshalOptions {
m := &pb2.Nested{}
resolver := preg.NewTypes(m.ProtoReflect().Type())
return textpb.UnmarshalOptions{Resolver: resolver}
}(),
inputMessage: &pb2.KnownTypes{},
inputText: `opt_any: {
[pb2.Nested]: 123
}
`,
wantErr: true,
umo: textpb.UnmarshalOptions{
Resolver: preg.NewTypes((&pb2.Nested{}).ProtoReflect().Type()),
},
inputMessage: &knownpb.Any{},
inputText: `[pb2.Nested]: 123`,
wantErr: true,
}, {
desc: "Any expanded with unknown fields",
umo: func() textpb.UnmarshalOptions {
m := &pb2.Nested{}
resolver := preg.NewTypes(m.ProtoReflect().Type())
return textpb.UnmarshalOptions{Resolver: resolver}
}(),
inputMessage: &pb2.KnownTypes{},
inputText: `opt_any: {
umo: textpb.UnmarshalOptions{
Resolver: preg.NewTypes((&pb2.Nested{}).ProtoReflect().Type()),
},
inputMessage: &knownpb.Any{},
inputText: `
[pb2.Nested]: {}
unknown: ""
}
`,
wantErr: true,
}, {
desc: "Any contains expanded and unexpanded fields",
umo: func() textpb.UnmarshalOptions {
m := &pb2.Nested{}
resolver := preg.NewTypes(m.ProtoReflect().Type())
return textpb.UnmarshalOptions{Resolver: resolver}
}(),
inputMessage: &pb2.KnownTypes{},
inputText: `opt_any: {
umo: textpb.UnmarshalOptions{
Resolver: preg.NewTypes((&pb2.Nested{}).ProtoReflect().Type()),
},
inputMessage: &knownpb.Any{},
inputText: `
[pb2.Nested]: {}
type_url: "pb2.Nested"
}
`,
wantErr: true,
}}

View File

@ -10,13 +10,11 @@ import (
"strings"
"testing"
protoV1 "github.com/golang/protobuf/proto"
"github.com/golang/protobuf/protoapi"
"github.com/golang/protobuf/v2/encoding/textpb"
"github.com/golang/protobuf/v2/internal/detrand"
"github.com/golang/protobuf/v2/internal/encoding/pack"
"github.com/golang/protobuf/v2/internal/encoding/wire"
"github.com/golang/protobuf/v2/internal/impl"
"github.com/golang/protobuf/v2/internal/scalar"
"github.com/golang/protobuf/v2/proto"
preg "github.com/golang/protobuf/v2/reflect/protoregistry"
@ -61,10 +59,6 @@ func setExtension(m proto.Message, xd *protoapi.ExtensionDesc, val interface{})
knownFields.Set(wire.Number(xd.Field), pval)
}
func wrapV1Message(any *knownpb.Any) proto.Message {
return impl.Export{}.MessageOf(any).Interface()
}
// dhex decodes a hex-string and returns the bytes and panics if s is invalid.
func dhex(s string) []byte {
b, err := hex.DecodeString(s)
@ -80,7 +74,7 @@ func TestMarshal(t *testing.T) {
mo textpb.MarshalOptions
input proto.Message
want string
wantErr bool
wantErr bool // TODO: Verify error message content.
}{{
desc: "proto2 optional scalars not set",
input: &pb2.Scalars{},
@ -1033,10 +1027,10 @@ opt_int32: 42
if err != nil {
t.Fatalf("error in binary marshaling message for Any.value: %v", err)
}
return wrapV1Message(&knownpb.Any{
return &knownpb.Any{
TypeUrl: "pb2.Nested",
Value: b,
})
}
}(),
want: `type_url: "pb2.Nested"
value: "\n\x13embedded inside Any\x12\x0b\n\tinception"
@ -1057,10 +1051,10 @@ value: "\n\x13embedded inside Any\x12\x0b\n\tinception"
if err != nil {
t.Fatalf("error in binary marshaling message for Any.value: %v", err)
}
return wrapV1Message(&knownpb.Any{
return &knownpb.Any{
TypeUrl: "foo/pb2.Nested",
Value: b,
})
}
}(),
want: `[foo/pb2.Nested]: {
opt_string: "embedded inside Any"
@ -1078,16 +1072,16 @@ value: "\n\x13embedded inside Any\x12\x0b\n\tinception"
m := &pb2.PartialRequired{
OptString: scalar.String("embedded inside Any"),
}
// TODO: Switch to V2 marshal when ready.
b, err := protoV1.Marshal(m)
// Ignore required not set error.
if _, ok := err.(*protoV1.RequiredNotSetError); !ok {
b, err := proto.MarshalOptions{Deterministic: true}.Marshal(m)
// TODO: Marshal may fail due to required field not set at some
// point. Need to ignore required not set error here.
if err != nil {
t.Fatalf("error in binary marshaling message for Any.value: %v", err)
}
return wrapV1Message(&knownpb.Any{
return &knownpb.Any{
TypeUrl: string(m.ProtoReflect().Type().FullName()),
Value: b,
})
}
}(),
want: `[pb2.PartialRequired]: {
opt_string: "embedded inside Any"
@ -1099,10 +1093,10 @@ value: "\n\x13embedded inside Any\x12\x0b\n\tinception"
mo: textpb.MarshalOptions{
Resolver: preg.NewTypes((&pb2.Nested{}).ProtoReflect().Type()),
},
input: wrapV1Message(&knownpb.Any{
input: &knownpb.Any{
TypeUrl: "foo/pb2.Nested",
Value: dhex("80"),
}),
},
want: `type_url: "foo/pb2.Nested"
value: "\x80"
`,