1*1c12ee1eSDan Willemsen// Copyright 2019 The Go Authors. All rights reserved. 2*1c12ee1eSDan Willemsen// Use of this source code is governed by a BSD-style 3*1c12ee1eSDan Willemsen// license that can be found in the LICENSE file. 4*1c12ee1eSDan Willemsen 5*1c12ee1eSDan Willemsenpackage proto_test 6*1c12ee1eSDan Willemsen 7*1c12ee1eSDan Willemsenimport ( 8*1c12ee1eSDan Willemsen "testing" 9*1c12ee1eSDan Willemsen 10*1c12ee1eSDan Willemsen "google.golang.org/protobuf/internal/flags" 11*1c12ee1eSDan Willemsen "google.golang.org/protobuf/internal/protobuild" 12*1c12ee1eSDan Willemsen "google.golang.org/protobuf/proto" 13*1c12ee1eSDan Willemsen "google.golang.org/protobuf/testing/protopack" 14*1c12ee1eSDan Willemsen 15*1c12ee1eSDan Willemsen testpb "google.golang.org/protobuf/internal/testprotos/test" 16*1c12ee1eSDan Willemsen weakpb "google.golang.org/protobuf/internal/testprotos/test/weak1" 17*1c12ee1eSDan Willemsen) 18*1c12ee1eSDan Willemsen 19*1c12ee1eSDan Willemsenfunc init() { 20*1c12ee1eSDan Willemsen if flags.ProtoLegacy { 21*1c12ee1eSDan Willemsen testValidMessages = append(testValidMessages, testWeakValidMessages...) 22*1c12ee1eSDan Willemsen testInvalidMessages = append(testInvalidMessages, testWeakInvalidMessages...) 23*1c12ee1eSDan Willemsen testMerges = append(testMerges, testWeakMerges...) 24*1c12ee1eSDan Willemsen } 25*1c12ee1eSDan Willemsen} 26*1c12ee1eSDan Willemsen 27*1c12ee1eSDan Willemsenvar testWeakValidMessages = []testProto{ 28*1c12ee1eSDan Willemsen { 29*1c12ee1eSDan Willemsen desc: "weak message", 30*1c12ee1eSDan Willemsen decodeTo: []proto.Message{ 31*1c12ee1eSDan Willemsen func() proto.Message { 32*1c12ee1eSDan Willemsen if !flags.ProtoLegacy { 33*1c12ee1eSDan Willemsen return nil 34*1c12ee1eSDan Willemsen } 35*1c12ee1eSDan Willemsen m := &testpb.TestWeak{} 36*1c12ee1eSDan Willemsen m.SetWeakMessage1(&weakpb.WeakImportMessage1{ 37*1c12ee1eSDan Willemsen A: proto.Int32(1000), 38*1c12ee1eSDan Willemsen }) 39*1c12ee1eSDan Willemsen m.ProtoReflect().SetUnknown(protopack.Message{ 40*1c12ee1eSDan Willemsen protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{ 41*1c12ee1eSDan Willemsen protopack.Tag{1, protopack.VarintType}, protopack.Varint(2000), 42*1c12ee1eSDan Willemsen }), 43*1c12ee1eSDan Willemsen }.Marshal()) 44*1c12ee1eSDan Willemsen return m 45*1c12ee1eSDan Willemsen }(), 46*1c12ee1eSDan Willemsen }, 47*1c12ee1eSDan Willemsen wire: protopack.Message{ 48*1c12ee1eSDan Willemsen protopack.Tag{1, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{ 49*1c12ee1eSDan Willemsen protopack.Tag{1, protopack.VarintType}, protopack.Varint(1000), 50*1c12ee1eSDan Willemsen }), 51*1c12ee1eSDan Willemsen protopack.Tag{2, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{ 52*1c12ee1eSDan Willemsen protopack.Tag{1, protopack.VarintType}, protopack.Varint(2000), 53*1c12ee1eSDan Willemsen }), 54*1c12ee1eSDan Willemsen }.Marshal(), 55*1c12ee1eSDan Willemsen }, 56*1c12ee1eSDan Willemsen} 57*1c12ee1eSDan Willemsen 58*1c12ee1eSDan Willemsenvar testWeakInvalidMessages = []testProto{ 59*1c12ee1eSDan Willemsen { 60*1c12ee1eSDan Willemsen desc: "invalid field number 0 in weak message", 61*1c12ee1eSDan Willemsen decodeTo: []proto.Message{(*testpb.TestWeak)(nil)}, 62*1c12ee1eSDan Willemsen wire: protopack.Message{ 63*1c12ee1eSDan Willemsen protopack.Tag{1, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{ 64*1c12ee1eSDan Willemsen protopack.Tag{0, protopack.VarintType}, protopack.Varint(1000), 65*1c12ee1eSDan Willemsen }), 66*1c12ee1eSDan Willemsen }.Marshal(), 67*1c12ee1eSDan Willemsen }, 68*1c12ee1eSDan Willemsen} 69*1c12ee1eSDan Willemsen 70*1c12ee1eSDan Willemsenvar testWeakMerges = []testMerge{ 71*1c12ee1eSDan Willemsen { 72*1c12ee1eSDan Willemsen desc: "clone weak message", 73*1c12ee1eSDan Willemsen src: protobuild.Message{ 74*1c12ee1eSDan Willemsen "weak_message1": protobuild.Message{ 75*1c12ee1eSDan Willemsen "a": 1, 76*1c12ee1eSDan Willemsen }, 77*1c12ee1eSDan Willemsen }, 78*1c12ee1eSDan Willemsen types: []proto.Message{&testpb.TestWeak{}}, 79*1c12ee1eSDan Willemsen }, { 80*1c12ee1eSDan Willemsen desc: "merge weak message", 81*1c12ee1eSDan Willemsen dst: protobuild.Message{ 82*1c12ee1eSDan Willemsen "weak_message1": protobuild.Message{ 83*1c12ee1eSDan Willemsen "a": 1, 84*1c12ee1eSDan Willemsen }, 85*1c12ee1eSDan Willemsen }, 86*1c12ee1eSDan Willemsen src: protobuild.Message{ 87*1c12ee1eSDan Willemsen "weak_message1": protobuild.Message{ 88*1c12ee1eSDan Willemsen "a": 2, 89*1c12ee1eSDan Willemsen }, 90*1c12ee1eSDan Willemsen }, 91*1c12ee1eSDan Willemsen want: protobuild.Message{ 92*1c12ee1eSDan Willemsen "weak_message1": protobuild.Message{ 93*1c12ee1eSDan Willemsen "a": 2, 94*1c12ee1eSDan Willemsen }, 95*1c12ee1eSDan Willemsen }, 96*1c12ee1eSDan Willemsen types: []proto.Message{&testpb.TestWeak{}}, 97*1c12ee1eSDan Willemsen }, 98*1c12ee1eSDan Willemsen} 99*1c12ee1eSDan Willemsen 100*1c12ee1eSDan Willemsenfunc TestWeakNil(t *testing.T) { 101*1c12ee1eSDan Willemsen if !flags.ProtoLegacy { 102*1c12ee1eSDan Willemsen t.SkipNow() 103*1c12ee1eSDan Willemsen } 104*1c12ee1eSDan Willemsen 105*1c12ee1eSDan Willemsen m := new(testpb.TestWeak) 106*1c12ee1eSDan Willemsen if v, ok := m.GetWeakMessage1().(*weakpb.WeakImportMessage1); !ok || v != nil { 107*1c12ee1eSDan Willemsen t.Errorf("m.GetWeakMessage1() = type %[1]T(%[1]v), want (*weakpb.WeakImportMessage1)", v) 108*1c12ee1eSDan Willemsen } 109*1c12ee1eSDan Willemsen} 110*1c12ee1eSDan Willemsen 111*1c12ee1eSDan Willemsenfunc TestWeakMarshalNil(t *testing.T) { 112*1c12ee1eSDan Willemsen if !flags.ProtoLegacy { 113*1c12ee1eSDan Willemsen t.SkipNow() 114*1c12ee1eSDan Willemsen } 115*1c12ee1eSDan Willemsen 116*1c12ee1eSDan Willemsen m := new(testpb.TestWeak) 117*1c12ee1eSDan Willemsen m.SetWeakMessage1(nil) 118*1c12ee1eSDan Willemsen if b, err := proto.Marshal(m); err != nil || len(b) != 0 { 119*1c12ee1eSDan Willemsen t.Errorf("Marshal(weak field set to nil) = [%x], %v; want [], nil", b, err) 120*1c12ee1eSDan Willemsen } 121*1c12ee1eSDan Willemsen m.SetWeakMessage1((*weakpb.WeakImportMessage1)(nil)) 122*1c12ee1eSDan Willemsen if b, err := proto.Marshal(m); err != nil || len(b) != 0 { 123*1c12ee1eSDan Willemsen t.Errorf("Marshal(weak field set to typed nil) = [%x], %v; want [], nil", b, err) 124*1c12ee1eSDan Willemsen } 125*1c12ee1eSDan Willemsen} 126