xref: /aosp_15_r20/external/golang-protobuf/proto/messageset_test.go (revision 1c12ee1efe575feb122dbf939ff15148a3b3e8f2)
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	"google.golang.org/protobuf/encoding/protowire"
9*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/internal/flags"
10*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/proto"
11*1c12ee1eSDan Willemsen	"google.golang.org/protobuf/testing/protopack"
12*1c12ee1eSDan Willemsen
13*1c12ee1eSDan Willemsen	messagesetpb "google.golang.org/protobuf/internal/testprotos/messageset/messagesetpb"
14*1c12ee1eSDan Willemsen	msetextpb "google.golang.org/protobuf/internal/testprotos/messageset/msetextpb"
15*1c12ee1eSDan Willemsen)
16*1c12ee1eSDan Willemsen
17*1c12ee1eSDan Willemsenfunc init() {
18*1c12ee1eSDan Willemsen	if flags.ProtoLegacy {
19*1c12ee1eSDan Willemsen		testValidMessages = append(testValidMessages, messageSetTestProtos...)
20*1c12ee1eSDan Willemsen		testInvalidMessages = append(testInvalidMessages, messageSetInvalidTestProtos...)
21*1c12ee1eSDan Willemsen	}
22*1c12ee1eSDan Willemsen}
23*1c12ee1eSDan Willemsen
24*1c12ee1eSDan Willemsenvar messageSetTestProtos = []testProto{
25*1c12ee1eSDan Willemsen	{
26*1c12ee1eSDan Willemsen		desc: "MessageSet type_id before message content",
27*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{func() proto.Message {
28*1c12ee1eSDan Willemsen			m := &messagesetpb.MessageSetContainer{MessageSet: &messagesetpb.MessageSet{}}
29*1c12ee1eSDan Willemsen			proto.SetExtension(m.MessageSet, msetextpb.E_Ext1_MessageSetExtension, &msetextpb.Ext1{
30*1c12ee1eSDan Willemsen				Ext1Field1: proto.Int32(10),
31*1c12ee1eSDan Willemsen			})
32*1c12ee1eSDan Willemsen			return m
33*1c12ee1eSDan Willemsen		}()},
34*1c12ee1eSDan Willemsen		wire: protopack.Message{
35*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
36*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.StartGroupType},
37*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(1000),
38*1c12ee1eSDan Willemsen				protopack.Tag{3, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
39*1c12ee1eSDan Willemsen					protopack.Tag{1, protopack.VarintType}, protopack.Varint(10),
40*1c12ee1eSDan Willemsen				}),
41*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.EndGroupType},
42*1c12ee1eSDan Willemsen			}),
43*1c12ee1eSDan Willemsen		}.Marshal(),
44*1c12ee1eSDan Willemsen	},
45*1c12ee1eSDan Willemsen	{
46*1c12ee1eSDan Willemsen		desc: "MessageSet type_id after message content",
47*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{func() proto.Message {
48*1c12ee1eSDan Willemsen			m := &messagesetpb.MessageSetContainer{MessageSet: &messagesetpb.MessageSet{}}
49*1c12ee1eSDan Willemsen			proto.SetExtension(m.MessageSet, msetextpb.E_Ext1_MessageSetExtension, &msetextpb.Ext1{
50*1c12ee1eSDan Willemsen				Ext1Field1: proto.Int32(10),
51*1c12ee1eSDan Willemsen			})
52*1c12ee1eSDan Willemsen			return m
53*1c12ee1eSDan Willemsen		}()},
54*1c12ee1eSDan Willemsen		wire: protopack.Message{
55*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
56*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.StartGroupType},
57*1c12ee1eSDan Willemsen				protopack.Tag{3, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
58*1c12ee1eSDan Willemsen					protopack.Tag{1, protopack.VarintType}, protopack.Varint(10),
59*1c12ee1eSDan Willemsen				}),
60*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(1000),
61*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.EndGroupType},
62*1c12ee1eSDan Willemsen			}),
63*1c12ee1eSDan Willemsen		}.Marshal(),
64*1c12ee1eSDan Willemsen	},
65*1c12ee1eSDan Willemsen	{
66*1c12ee1eSDan Willemsen		desc: "MessageSet does not preserve unknown field",
67*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{build(
68*1c12ee1eSDan Willemsen			&messagesetpb.MessageSet{},
69*1c12ee1eSDan Willemsen			extend(msetextpb.E_Ext1_MessageSetExtension, &msetextpb.Ext1{
70*1c12ee1eSDan Willemsen				Ext1Field1: proto.Int32(10),
71*1c12ee1eSDan Willemsen			}),
72*1c12ee1eSDan Willemsen		)},
73*1c12ee1eSDan Willemsen		wire: protopack.Message{
74*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.StartGroupType},
75*1c12ee1eSDan Willemsen			protopack.Tag{2, protopack.VarintType}, protopack.Varint(1000),
76*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
77*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(10),
78*1c12ee1eSDan Willemsen			}),
79*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.EndGroupType},
80*1c12ee1eSDan Willemsen			// Unknown field
81*1c12ee1eSDan Willemsen			protopack.Tag{4, protopack.VarintType}, protopack.Varint(30),
82*1c12ee1eSDan Willemsen		}.Marshal(),
83*1c12ee1eSDan Willemsen	},
84*1c12ee1eSDan Willemsen	{
85*1c12ee1eSDan Willemsen		desc: "MessageSet with unknown type_id",
86*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{build(
87*1c12ee1eSDan Willemsen			&messagesetpb.MessageSet{},
88*1c12ee1eSDan Willemsen			unknown(protopack.Message{
89*1c12ee1eSDan Willemsen				protopack.Tag{999, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
90*1c12ee1eSDan Willemsen					protopack.Tag{1, protopack.VarintType}, protopack.Varint(10),
91*1c12ee1eSDan Willemsen				}),
92*1c12ee1eSDan Willemsen			}.Marshal()),
93*1c12ee1eSDan Willemsen		)},
94*1c12ee1eSDan Willemsen		wire: protopack.Message{
95*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.StartGroupType},
96*1c12ee1eSDan Willemsen			protopack.Tag{2, protopack.VarintType}, protopack.Varint(999),
97*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
98*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(10),
99*1c12ee1eSDan Willemsen			}),
100*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.EndGroupType},
101*1c12ee1eSDan Willemsen		}.Marshal(),
102*1c12ee1eSDan Willemsen	},
103*1c12ee1eSDan Willemsen	{
104*1c12ee1eSDan Willemsen		desc: "MessageSet merges repeated message fields in item",
105*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{build(
106*1c12ee1eSDan Willemsen			&messagesetpb.MessageSet{},
107*1c12ee1eSDan Willemsen			extend(msetextpb.E_Ext1_MessageSetExtension, &msetextpb.Ext1{
108*1c12ee1eSDan Willemsen				Ext1Field1: proto.Int32(10),
109*1c12ee1eSDan Willemsen				Ext1Field2: proto.Int32(20),
110*1c12ee1eSDan Willemsen			}),
111*1c12ee1eSDan Willemsen		)},
112*1c12ee1eSDan Willemsen		wire: protopack.Message{
113*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.StartGroupType},
114*1c12ee1eSDan Willemsen			protopack.Tag{2, protopack.VarintType}, protopack.Varint(1000),
115*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
116*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(10),
117*1c12ee1eSDan Willemsen			}),
118*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
119*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(20),
120*1c12ee1eSDan Willemsen			}),
121*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.EndGroupType},
122*1c12ee1eSDan Willemsen		}.Marshal(),
123*1c12ee1eSDan Willemsen	},
124*1c12ee1eSDan Willemsen	{
125*1c12ee1eSDan Willemsen		desc: "MessageSet merges message fields in repeated items",
126*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{build(
127*1c12ee1eSDan Willemsen			&messagesetpb.MessageSet{},
128*1c12ee1eSDan Willemsen			extend(msetextpb.E_Ext1_MessageSetExtension, &msetextpb.Ext1{
129*1c12ee1eSDan Willemsen				Ext1Field1: proto.Int32(10),
130*1c12ee1eSDan Willemsen				Ext1Field2: proto.Int32(20),
131*1c12ee1eSDan Willemsen			}),
132*1c12ee1eSDan Willemsen			extend(msetextpb.E_Ext2_MessageSetExtension, &msetextpb.Ext2{
133*1c12ee1eSDan Willemsen				Ext2Field1: proto.Int32(30),
134*1c12ee1eSDan Willemsen			}),
135*1c12ee1eSDan Willemsen		)},
136*1c12ee1eSDan Willemsen		wire: protopack.Message{
137*1c12ee1eSDan Willemsen			// Ext1, field1
138*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.StartGroupType},
139*1c12ee1eSDan Willemsen			protopack.Tag{2, protopack.VarintType}, protopack.Varint(1000),
140*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
141*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(10),
142*1c12ee1eSDan Willemsen			}),
143*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.EndGroupType},
144*1c12ee1eSDan Willemsen			// Ext2, field1
145*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.StartGroupType},
146*1c12ee1eSDan Willemsen			protopack.Tag{2, protopack.VarintType}, protopack.Varint(1001),
147*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
148*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(30),
149*1c12ee1eSDan Willemsen			}),
150*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.EndGroupType},
151*1c12ee1eSDan Willemsen			// Ext2, field2
152*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.StartGroupType},
153*1c12ee1eSDan Willemsen			protopack.Tag{2, protopack.VarintType}, protopack.Varint(1000),
154*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
155*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(20),
156*1c12ee1eSDan Willemsen			}),
157*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.EndGroupType},
158*1c12ee1eSDan Willemsen		}.Marshal(),
159*1c12ee1eSDan Willemsen	},
160*1c12ee1eSDan Willemsen	{
161*1c12ee1eSDan Willemsen		desc: "MessageSet with missing type_id",
162*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{build(
163*1c12ee1eSDan Willemsen			&messagesetpb.MessageSet{},
164*1c12ee1eSDan Willemsen		)},
165*1c12ee1eSDan Willemsen		wire: protopack.Message{
166*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.StartGroupType},
167*1c12ee1eSDan Willemsen			protopack.Tag{3, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
168*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.VarintType}, protopack.Varint(10),
169*1c12ee1eSDan Willemsen			}),
170*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.EndGroupType},
171*1c12ee1eSDan Willemsen		}.Marshal(),
172*1c12ee1eSDan Willemsen	},
173*1c12ee1eSDan Willemsen	{
174*1c12ee1eSDan Willemsen		desc: "MessageSet with missing message",
175*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{build(
176*1c12ee1eSDan Willemsen			&messagesetpb.MessageSet{},
177*1c12ee1eSDan Willemsen			extend(msetextpb.E_Ext1_MessageSetExtension, &msetextpb.Ext1{}),
178*1c12ee1eSDan Willemsen		)},
179*1c12ee1eSDan Willemsen		wire: protopack.Message{
180*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.StartGroupType},
181*1c12ee1eSDan Willemsen			protopack.Tag{2, protopack.VarintType}, protopack.Varint(1000),
182*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.EndGroupType},
183*1c12ee1eSDan Willemsen		}.Marshal(),
184*1c12ee1eSDan Willemsen	},
185*1c12ee1eSDan Willemsen	{
186*1c12ee1eSDan Willemsen		desc: "MessageSet with type id out of valid field number range",
187*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{func() proto.Message {
188*1c12ee1eSDan Willemsen			m := &messagesetpb.MessageSetContainer{MessageSet: &messagesetpb.MessageSet{}}
189*1c12ee1eSDan Willemsen			proto.SetExtension(m.MessageSet, msetextpb.E_ExtLargeNumber_MessageSetExtension, &msetextpb.ExtLargeNumber{})
190*1c12ee1eSDan Willemsen			return m
191*1c12ee1eSDan Willemsen		}()},
192*1c12ee1eSDan Willemsen		wire: protopack.Message{
193*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
194*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.StartGroupType},
195*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(protowire.MaxValidNumber + 1),
196*1c12ee1eSDan Willemsen				protopack.Tag{3, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{}),
197*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.EndGroupType},
198*1c12ee1eSDan Willemsen			}),
199*1c12ee1eSDan Willemsen		}.Marshal(),
200*1c12ee1eSDan Willemsen	},
201*1c12ee1eSDan Willemsen	{
202*1c12ee1eSDan Willemsen		desc: "MessageSet with unknown type id out of valid field number range",
203*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{func() proto.Message {
204*1c12ee1eSDan Willemsen			m := &messagesetpb.MessageSetContainer{MessageSet: &messagesetpb.MessageSet{}}
205*1c12ee1eSDan Willemsen			m.MessageSet.ProtoReflect().SetUnknown(
206*1c12ee1eSDan Willemsen				protopack.Message{
207*1c12ee1eSDan Willemsen					protopack.Tag{protowire.MaxValidNumber + 2, protopack.BytesType}, protopack.LengthPrefix{},
208*1c12ee1eSDan Willemsen				}.Marshal(),
209*1c12ee1eSDan Willemsen			)
210*1c12ee1eSDan Willemsen			return m
211*1c12ee1eSDan Willemsen		}()},
212*1c12ee1eSDan Willemsen		wire: protopack.Message{
213*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
214*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.StartGroupType},
215*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(protowire.MaxValidNumber + 2),
216*1c12ee1eSDan Willemsen				protopack.Tag{3, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{}),
217*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.EndGroupType},
218*1c12ee1eSDan Willemsen			}),
219*1c12ee1eSDan Willemsen		}.Marshal(),
220*1c12ee1eSDan Willemsen	},
221*1c12ee1eSDan Willemsen	{
222*1c12ee1eSDan Willemsen		desc: "MessageSet with unknown field",
223*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{func() proto.Message {
224*1c12ee1eSDan Willemsen			m := &messagesetpb.MessageSetContainer{MessageSet: &messagesetpb.MessageSet{}}
225*1c12ee1eSDan Willemsen			proto.SetExtension(m.MessageSet, msetextpb.E_Ext1_MessageSetExtension, &msetextpb.Ext1{
226*1c12ee1eSDan Willemsen				Ext1Field1: proto.Int32(10),
227*1c12ee1eSDan Willemsen			})
228*1c12ee1eSDan Willemsen			return m
229*1c12ee1eSDan Willemsen		}()},
230*1c12ee1eSDan Willemsen		wire: protopack.Message{
231*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
232*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.StartGroupType},
233*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(1000),
234*1c12ee1eSDan Willemsen				protopack.Tag{3, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
235*1c12ee1eSDan Willemsen					protopack.Tag{1, protopack.VarintType}, protopack.Varint(10),
236*1c12ee1eSDan Willemsen				}),
237*1c12ee1eSDan Willemsen				protopack.Tag{4, protopack.VarintType}, protopack.Varint(0),
238*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.EndGroupType},
239*1c12ee1eSDan Willemsen			}),
240*1c12ee1eSDan Willemsen		}.Marshal(),
241*1c12ee1eSDan Willemsen	},
242*1c12ee1eSDan Willemsen	{
243*1c12ee1eSDan Willemsen		desc:          "MessageSet with required field set",
244*1c12ee1eSDan Willemsen		checkFastInit: true,
245*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{func() proto.Message {
246*1c12ee1eSDan Willemsen			m := &messagesetpb.MessageSetContainer{MessageSet: &messagesetpb.MessageSet{}}
247*1c12ee1eSDan Willemsen			proto.SetExtension(m.MessageSet, msetextpb.E_ExtRequired_MessageSetExtension, &msetextpb.ExtRequired{
248*1c12ee1eSDan Willemsen				RequiredField1: proto.Int32(1),
249*1c12ee1eSDan Willemsen			})
250*1c12ee1eSDan Willemsen			return m
251*1c12ee1eSDan Willemsen		}()},
252*1c12ee1eSDan Willemsen		wire: protopack.Message{
253*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
254*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.StartGroupType},
255*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(1002),
256*1c12ee1eSDan Willemsen				protopack.Tag{3, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
257*1c12ee1eSDan Willemsen					protopack.Tag{1, protopack.VarintType}, protopack.Varint(1),
258*1c12ee1eSDan Willemsen				}),
259*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.EndGroupType},
260*1c12ee1eSDan Willemsen			}),
261*1c12ee1eSDan Willemsen		}.Marshal(),
262*1c12ee1eSDan Willemsen	},
263*1c12ee1eSDan Willemsen	{
264*1c12ee1eSDan Willemsen		desc:          "MessageSet with required field unset",
265*1c12ee1eSDan Willemsen		checkFastInit: true,
266*1c12ee1eSDan Willemsen		partial:       true,
267*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{func() proto.Message {
268*1c12ee1eSDan Willemsen			m := &messagesetpb.MessageSetContainer{MessageSet: &messagesetpb.MessageSet{}}
269*1c12ee1eSDan Willemsen			proto.SetExtension(m.MessageSet, msetextpb.E_ExtRequired_MessageSetExtension, &msetextpb.ExtRequired{})
270*1c12ee1eSDan Willemsen			return m
271*1c12ee1eSDan Willemsen		}()},
272*1c12ee1eSDan Willemsen		wire: protopack.Message{
273*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
274*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.StartGroupType},
275*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Varint(1002),
276*1c12ee1eSDan Willemsen				protopack.Tag{3, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{}),
277*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.EndGroupType},
278*1c12ee1eSDan Willemsen			}),
279*1c12ee1eSDan Willemsen		}.Marshal(),
280*1c12ee1eSDan Willemsen	},
281*1c12ee1eSDan Willemsen}
282*1c12ee1eSDan Willemsen
283*1c12ee1eSDan Willemsenvar messageSetInvalidTestProtos = []testProto{
284*1c12ee1eSDan Willemsen	{
285*1c12ee1eSDan Willemsen		desc: "MessageSet with type id 0",
286*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
287*1c12ee1eSDan Willemsen			(*messagesetpb.MessageSetContainer)(nil),
288*1c12ee1eSDan Willemsen		},
289*1c12ee1eSDan Willemsen		wire: protopack.Message{
290*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
291*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.StartGroupType},
292*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Uvarint(0),
293*1c12ee1eSDan Willemsen				protopack.Tag{3, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{}),
294*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.EndGroupType},
295*1c12ee1eSDan Willemsen			}),
296*1c12ee1eSDan Willemsen		}.Marshal(),
297*1c12ee1eSDan Willemsen	},
298*1c12ee1eSDan Willemsen	{
299*1c12ee1eSDan Willemsen		desc: "MessageSet with type id overflowing int32",
300*1c12ee1eSDan Willemsen		decodeTo: []proto.Message{
301*1c12ee1eSDan Willemsen			(*messagesetpb.MessageSetContainer)(nil),
302*1c12ee1eSDan Willemsen		},
303*1c12ee1eSDan Willemsen		wire: protopack.Message{
304*1c12ee1eSDan Willemsen			protopack.Tag{1, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{
305*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.StartGroupType},
306*1c12ee1eSDan Willemsen				protopack.Tag{2, protopack.VarintType}, protopack.Uvarint(0x80000000),
307*1c12ee1eSDan Willemsen				protopack.Tag{3, protopack.BytesType}, protopack.LengthPrefix(protopack.Message{}),
308*1c12ee1eSDan Willemsen				protopack.Tag{1, protopack.EndGroupType},
309*1c12ee1eSDan Willemsen			}),
310*1c12ee1eSDan Willemsen		}.Marshal(),
311*1c12ee1eSDan Willemsen	},
312*1c12ee1eSDan Willemsen}
313