blob: 07b2d70a438113e865bc90a9459130b23cfb5973 [file] [log] [blame]
Damien Neil302cb322019-06-19 15:22:13 -07001// Copyright 2019 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style.
3// license that can be found in the LICENSE file.
4
5package proto_test
6
7import (
8 "google.golang.org/protobuf/internal/encoding/pack"
9 "google.golang.org/protobuf/internal/flags"
10 "google.golang.org/protobuf/proto"
11
12 messagesetpb "google.golang.org/protobuf/internal/testprotos/messageset/messagesetpb"
13 msetextpb "google.golang.org/protobuf/internal/testprotos/messageset/msetextpb"
14)
15
16func init() {
17 if flags.Proto1Legacy {
18 testProtos = append(testProtos, messageSetTestProtos...)
19 }
20}
21
22var messageSetTestProtos = []testProto{
23 {
24 desc: "MessageSet type_id before message content",
25 decodeTo: []proto.Message{build(
26 &messagesetpb.MessageSet{},
27 extend(msetextpb.E_Ext1_MessageSetExtension, &msetextpb.Ext1{
28 Ext1Field1: proto.Int32(10),
29 }),
30 )},
31 wire: pack.Message{
32 pack.Tag{1, pack.StartGroupType},
33 pack.Tag{2, pack.VarintType}, pack.Varint(1000),
34 pack.Tag{3, pack.BytesType}, pack.LengthPrefix(pack.Message{
35 pack.Tag{1, pack.VarintType}, pack.Varint(10),
36 }),
37 pack.Tag{1, pack.EndGroupType},
38 }.Marshal(),
39 },
40 {
41 desc: "MessageSet type_id after message content",
42 decodeTo: []proto.Message{build(
43 &messagesetpb.MessageSet{},
44 extend(msetextpb.E_Ext1_MessageSetExtension, &msetextpb.Ext1{
45 Ext1Field1: proto.Int32(10),
46 }),
47 )},
48 wire: pack.Message{
49 pack.Tag{1, pack.StartGroupType},
50 pack.Tag{3, pack.BytesType}, pack.LengthPrefix(pack.Message{
51 pack.Tag{1, pack.VarintType}, pack.Varint(10),
52 }),
53 pack.Tag{2, pack.VarintType}, pack.Varint(1000),
54 pack.Tag{1, pack.EndGroupType},
55 }.Marshal(),
56 },
57 {
58 desc: "MessageSet preserves unknown field",
59 decodeTo: []proto.Message{build(
60 &messagesetpb.MessageSet{},
61 extend(msetextpb.E_Ext1_MessageSetExtension, &msetextpb.Ext1{
62 Ext1Field1: proto.Int32(10),
63 }),
64 unknown(pack.Message{
65 pack.Tag{4, pack.VarintType}, pack.Varint(30),
66 }.Marshal()),
67 )},
68 wire: pack.Message{
69 pack.Tag{1, pack.StartGroupType},
70 pack.Tag{2, pack.VarintType}, pack.Varint(1000),
71 pack.Tag{3, pack.BytesType}, pack.LengthPrefix(pack.Message{
72 pack.Tag{1, pack.VarintType}, pack.Varint(10),
73 }),
74 pack.Tag{1, pack.EndGroupType},
75 // Unknown field
76 pack.Tag{4, pack.VarintType}, pack.Varint(30),
77 }.Marshal(),
78 },
79 {
80 desc: "MessageSet with unknown type_id",
81 decodeTo: []proto.Message{build(
82 &messagesetpb.MessageSet{},
83 unknown(pack.Message{
84 pack.Tag{1, pack.StartGroupType},
85 pack.Tag{2, pack.VarintType}, pack.Varint(1002),
86 pack.Tag{3, pack.BytesType}, pack.LengthPrefix(pack.Message{
87 pack.Tag{1, pack.VarintType}, pack.Varint(10),
88 }),
89 pack.Tag{1, pack.EndGroupType},
90 }.Marshal()),
91 )},
92 wire: pack.Message{
93 pack.Tag{1, pack.StartGroupType},
94 pack.Tag{2, pack.VarintType}, pack.Varint(1002),
95 pack.Tag{3, pack.BytesType}, pack.LengthPrefix(pack.Message{
96 pack.Tag{1, pack.VarintType}, pack.Varint(10),
97 }),
98 pack.Tag{1, pack.EndGroupType},
99 }.Marshal(),
100 },
101 {
102 desc: "MessageSet merges repeated message fields in item",
103 decodeTo: []proto.Message{build(
104 &messagesetpb.MessageSet{},
105 extend(msetextpb.E_Ext1_MessageSetExtension, &msetextpb.Ext1{
106 Ext1Field1: proto.Int32(10),
107 Ext1Field2: proto.Int32(20),
108 }),
109 )},
110 wire: pack.Message{
111 pack.Tag{1, pack.StartGroupType},
112 pack.Tag{2, pack.VarintType}, pack.Varint(1000),
113 pack.Tag{3, pack.BytesType}, pack.LengthPrefix(pack.Message{
114 pack.Tag{1, pack.VarintType}, pack.Varint(10),
115 }),
116 pack.Tag{3, pack.BytesType}, pack.LengthPrefix(pack.Message{
117 pack.Tag{2, pack.VarintType}, pack.Varint(20),
118 }),
119 pack.Tag{1, pack.EndGroupType},
120 }.Marshal(),
121 },
122 {
123 desc: "MessageSet merges message fields in repeated items",
124 decodeTo: []proto.Message{build(
125 &messagesetpb.MessageSet{},
126 extend(msetextpb.E_Ext1_MessageSetExtension, &msetextpb.Ext1{
127 Ext1Field1: proto.Int32(10),
128 Ext1Field2: proto.Int32(20),
129 }),
130 extend(msetextpb.E_Ext2_MessageSetExtension, &msetextpb.Ext2{
131 Ext2Field1: proto.Int32(30),
132 }),
133 )},
134 wire: pack.Message{
135 // Ext1, field1
136 pack.Tag{1, pack.StartGroupType},
137 pack.Tag{2, pack.VarintType}, pack.Varint(1000),
138 pack.Tag{3, pack.BytesType}, pack.LengthPrefix(pack.Message{
139 pack.Tag{1, pack.VarintType}, pack.Varint(10),
140 }),
141 pack.Tag{1, pack.EndGroupType},
142 // Ext2, field1
143 pack.Tag{1, pack.StartGroupType},
144 pack.Tag{2, pack.VarintType}, pack.Varint(1001),
145 pack.Tag{3, pack.BytesType}, pack.LengthPrefix(pack.Message{
146 pack.Tag{1, pack.VarintType}, pack.Varint(30),
147 }),
148 pack.Tag{1, pack.EndGroupType},
149 // Ext2, field2
150 pack.Tag{1, pack.StartGroupType},
151 pack.Tag{2, pack.VarintType}, pack.Varint(1000),
152 pack.Tag{3, pack.BytesType}, pack.LengthPrefix(pack.Message{
153 pack.Tag{2, pack.VarintType}, pack.Varint(20),
154 }),
155 pack.Tag{1, pack.EndGroupType},
156 }.Marshal(),
157 },
158 {
159 desc: "MessageSet with missing type_id",
160 decodeTo: []proto.Message{build(
161 &messagesetpb.MessageSet{},
162 unknown(pack.Message{
163 pack.Tag{1, pack.StartGroupType},
164 pack.Tag{3, pack.BytesType}, pack.LengthPrefix(pack.Message{
165 pack.Tag{1, pack.VarintType}, pack.Varint(10),
166 }),
167 pack.Tag{1, pack.EndGroupType},
168 }.Marshal()),
169 )},
170 wire: pack.Message{
171 pack.Tag{1, pack.StartGroupType},
172 pack.Tag{3, pack.BytesType}, pack.LengthPrefix(pack.Message{
173 pack.Tag{1, pack.VarintType}, pack.Varint(10),
174 }),
175 pack.Tag{1, pack.EndGroupType},
176 }.Marshal(),
177 },
178 {
179 desc: "MessageSet with missing message",
180 decodeTo: []proto.Message{build(
181 &messagesetpb.MessageSet{},
182 extend(msetextpb.E_Ext1_MessageSetExtension, &msetextpb.Ext1{}),
183 )},
184 wire: pack.Message{
185 pack.Tag{1, pack.StartGroupType},
186 pack.Tag{2, pack.VarintType}, pack.Varint(1000),
187 pack.Tag{1, pack.EndGroupType},
188 }.Marshal(),
189 },
190}