aboutsummaryrefslogtreecommitdiff
path: root/proto/weak_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'proto/weak_test.go')
-rw-r--r--proto/weak_test.go125
1 files changed, 125 insertions, 0 deletions
diff --git a/proto/weak_test.go b/proto/weak_test.go
new file mode 100644
index 00000000..79340e39
--- /dev/null
+++ b/proto/weak_test.go
@@ -0,0 +1,125 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package proto_test
+
+import (
+ "testing"
+
+ "google.golang.org/protobuf/internal/flags"
+ "google.golang.org/protobuf/internal/protobuild"
+ "google.golang.org/protobuf/proto"
+ "google.golang.org/protobuf/testing/protopack"
+
+ testpb "google.golang.org/protobuf/internal/testprotos/test"
+ weakpb "google.golang.org/protobuf/internal/testprotos/test/weak1"
+)
+
+func init() {
+ if flags.ProtoLegacy {
+ testValidMessages = append(testValidMessages, testWeakValidMessages...)
+ testInvalidMessages = append(testInvalidMessages, testWeakInvalidMessages...)
+ testMerges = append(testMerges, testWeakMerges...)
+ }
+}
+
+var testWeakValidMessages = []testProto{
+ {
+ desc: "weak message",
+ decodeTo: []proto.Message{
+ func() proto.Message {
+ if !flags.ProtoLegacy {
+ return nil
+ }
+ m := &testpb.TestWeak{}
+ m.SetWeakMessage1(&weakpb.WeakImportMessage1{
+ A: proto.Int32(1000),
+ })
+ m.ProtoReflect().SetUnknown(protopack.Message{
+ protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
+ protopack.Tag{1, protopack.VarintType}, protopack.Varint(2000),
+ }),
+ }.Marshal())
+ return m
+ }(),
+ },
+ wire: protopack.Message{
+ protopack.Tag{1, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
+ protopack.Tag{1, protopack.VarintType}, protopack.Varint(1000),
+ }),
+ protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
+ protopack.Tag{1, protopack.VarintType}, protopack.Varint(2000),
+ }),
+ }.Marshal(),
+ },
+}
+
+var testWeakInvalidMessages = []testProto{
+ {
+ desc: "invalid field number 0 in weak message",
+ decodeTo: []proto.Message{(*testpb.TestWeak)(nil)},
+ wire: protopack.Message{
+ protopack.Tag{1, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
+ protopack.Tag{0, protopack.VarintType}, protopack.Varint(1000),
+ }),
+ }.Marshal(),
+ },
+}
+
+var testWeakMerges = []testMerge{
+ {
+ desc: "clone weak message",
+ src: protobuild.Message{
+ "weak_message1": protobuild.Message{
+ "a": 1,
+ },
+ },
+ types: []proto.Message{&testpb.TestWeak{}},
+ }, {
+ desc: "merge weak message",
+ dst: protobuild.Message{
+ "weak_message1": protobuild.Message{
+ "a": 1,
+ },
+ },
+ src: protobuild.Message{
+ "weak_message1": protobuild.Message{
+ "a": 2,
+ },
+ },
+ want: protobuild.Message{
+ "weak_message1": protobuild.Message{
+ "a": 2,
+ },
+ },
+ types: []proto.Message{&testpb.TestWeak{}},
+ },
+}
+
+func TestWeakNil(t *testing.T) {
+ if !flags.ProtoLegacy {
+ t.SkipNow()
+ }
+
+ m := new(testpb.TestWeak)
+ if v, ok := m.GetWeakMessage1().(*weakpb.WeakImportMessage1); !ok || v != nil {
+ t.Errorf("m.GetWeakMessage1() = type %[1]T(%[1]v), want (*weakpb.WeakImportMessage1)", v)
+ }
+}
+
+func TestWeakMarshalNil(t *testing.T) {
+ if !flags.ProtoLegacy {
+ t.SkipNow()
+ }
+
+ m := new(testpb.TestWeak)
+ m.SetWeakMessage1(nil)
+ if b, err := proto.Marshal(m); err != nil || len(b) != 0 {
+ t.Errorf("Marshal(weak field set to nil) = [%x], %v; want [], nil", b, err)
+ }
+ m.SetWeakMessage1((*weakpb.WeakImportMessage1)(nil))
+ if b, err := proto.Marshal(m); err != nil || len(b) != 0 {
+ t.Errorf("Marshal(weak field set to typed nil) = [%x], %v; want [], nil", b, err)
+ }
+}