blob: 71b4db2b95285ce8154459026e8d5e1ea7ff2aba [file] [log] [blame]
Joe Tsai90fe9962018-10-18 11:06:29 -07001// Copyright 2018 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 impl
6
7import (
Joe Tsaie2afdc22018-10-25 14:06:56 -07008 "bytes"
9 "math"
Joe Tsai90fe9962018-10-18 11:06:29 -070010 "reflect"
11 "testing"
12
Joe Tsai95b02902018-10-31 18:23:42 -070013 protoV1 "github.com/golang/protobuf/proto"
Joe Tsaiea118132018-11-11 17:56:21 -080014 pack "github.com/golang/protobuf/v2/internal/encoding/pack"
15 pragma "github.com/golang/protobuf/v2/internal/pragma"
Joe Tsai009e0672018-11-27 18:45:07 -080016 scalar "github.com/golang/protobuf/v2/internal/scalar"
Joe Tsai90fe9962018-10-18 11:06:29 -070017 pref "github.com/golang/protobuf/v2/reflect/protoreflect"
18 ptype "github.com/golang/protobuf/v2/reflect/prototype"
Joe Tsaiea118132018-11-11 17:56:21 -080019 cmp "github.com/google/go-cmp/cmp"
20
21 proto2_20160225 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto2.v0.0.0-20160225-2fc053c5"
22 proto2_20160519 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto2.v0.0.0-20160519-a4ab9ec5"
23 proto2_20180125 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto2.v1.0.0-20180125-92554152"
24 proto2_20180430 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto2.v1.1.0-20180430-b4deda09"
25 proto2_20180814 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto2.v1.2.0-20180814-aa810b61"
26 proto3_20160225 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto3.v0.0.0-20160225-2fc053c5"
27 proto3_20160519 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto3.v0.0.0-20160519-a4ab9ec5"
28 proto3_20180125 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto3.v1.0.0-20180125-92554152"
29 proto3_20180430 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto3.v1.1.0-20180430-b4deda09"
30 proto3_20180814 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto3.v1.2.0-20180814-aa810b61"
Joe Tsai90fe9962018-10-18 11:06:29 -070031)
32
Joe Tsaiea118132018-11-11 17:56:21 -080033func mustLoadFileDesc(b []byte, _ []int) pref.FileDescriptor {
Joe Tsaif0c01e42018-11-06 13:05:20 -080034 fd, err := ptype.NewFileFromDescriptorProto(legacyLoadFileDesc(b), nil)
Joe Tsai90fe9962018-10-18 11:06:29 -070035 if err != nil {
36 panic(err)
37 }
38 return fd
39}
40
Joe Tsaie2afdc22018-10-25 14:06:56 -070041func TestLegacyDescriptor(t *testing.T) {
Joe Tsaiea118132018-11-11 17:56:21 -080042 var tests []struct{ got, want pref.Descriptor }
43
44 fileDescP2_20160225 := mustLoadFileDesc(new(proto2_20160225.Message).Descriptor())
45 tests = append(tests, []struct{ got, want pref.Descriptor }{{
Joe Tsaif0c01e42018-11-06 13:05:20 -080046 got: legacyLoadEnumDesc(reflect.TypeOf(proto2_20160225.SiblingEnum(0))),
Joe Tsaiea118132018-11-11 17:56:21 -080047 want: fileDescP2_20160225.Enums().ByName("SiblingEnum"),
Joe Tsai90fe9962018-10-18 11:06:29 -070048 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -080049 got: legacyLoadEnumDesc(reflect.TypeOf(proto2_20160225.Message_ChildEnum(0))),
Joe Tsaiea118132018-11-11 17:56:21 -080050 want: fileDescP2_20160225.Messages().ByName("Message").Enums().ByName("ChildEnum"),
Joe Tsai90fe9962018-10-18 11:06:29 -070051 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -080052 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160225.SiblingMessage))),
Joe Tsaiea118132018-11-11 17:56:21 -080053 want: fileDescP2_20160225.Messages().ByName("SiblingMessage"),
Joe Tsai90fe9962018-10-18 11:06:29 -070054 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -080055 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_ChildMessage))),
Joe Tsaiea118132018-11-11 17:56:21 -080056 want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("ChildMessage"),
Joe Tsai90fe9962018-10-18 11:06:29 -070057 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -080058 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message))),
Joe Tsaiea118132018-11-11 17:56:21 -080059 want: fileDescP2_20160225.Messages().ByName("Message"),
Joe Tsai90fe9962018-10-18 11:06:29 -070060 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -080061 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_NamedGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -080062 want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("NamedGroup"),
Joe Tsai90fe9962018-10-18 11:06:29 -070063 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -080064 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_OptionalGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -080065 want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("OptionalGroup"),
Joe Tsai90fe9962018-10-18 11:06:29 -070066 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -080067 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_RequiredGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -080068 want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("RequiredGroup"),
Joe Tsai90fe9962018-10-18 11:06:29 -070069 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -080070 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_RepeatedGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -080071 want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("RepeatedGroup"),
Joe Tsai90fe9962018-10-18 11:06:29 -070072 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -080073 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_OneofGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -080074 want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("OneofGroup"),
Joe Tsai90fe9962018-10-18 11:06:29 -070075 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -080076 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_ExtensionOptionalGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -080077 want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("ExtensionOptionalGroup"),
Joe Tsai90fe9962018-10-18 11:06:29 -070078 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -080079 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_ExtensionRepeatedGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -080080 want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("ExtensionRepeatedGroup"),
81 }}...)
82
83 fileDescP3_20160225 := mustLoadFileDesc(new(proto3_20160225.Message).Descriptor())
84 tests = append(tests, []struct{ got, want pref.Descriptor }{{
Joe Tsaif0c01e42018-11-06 13:05:20 -080085 got: legacyLoadEnumDesc(reflect.TypeOf(proto3_20160225.SiblingEnum(0))),
Joe Tsaiea118132018-11-11 17:56:21 -080086 want: fileDescP3_20160225.Enums().ByName("SiblingEnum"),
Joe Tsai90fe9962018-10-18 11:06:29 -070087 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -080088 got: legacyLoadEnumDesc(reflect.TypeOf(proto3_20160225.Message_ChildEnum(0))),
Joe Tsaiea118132018-11-11 17:56:21 -080089 want: fileDescP3_20160225.Messages().ByName("Message").Enums().ByName("ChildEnum"),
Joe Tsai90fe9962018-10-18 11:06:29 -070090 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -080091 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20160225.SiblingMessage))),
Joe Tsaiea118132018-11-11 17:56:21 -080092 want: fileDescP3_20160225.Messages().ByName("SiblingMessage"),
Joe Tsai90fe9962018-10-18 11:06:29 -070093 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -080094 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20160225.Message_ChildMessage))),
Joe Tsaiea118132018-11-11 17:56:21 -080095 want: fileDescP3_20160225.Messages().ByName("Message").Messages().ByName("ChildMessage"),
96 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -080097 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20160225.Message))),
Joe Tsaiea118132018-11-11 17:56:21 -080098 want: fileDescP3_20160225.Messages().ByName("Message"),
99 }}...)
100
101 fileDescP2_20160519 := mustLoadFileDesc(new(proto2_20160519.Message).Descriptor())
102 tests = append(tests, []struct{ got, want pref.Descriptor }{{
Joe Tsaif0c01e42018-11-06 13:05:20 -0800103 got: legacyLoadEnumDesc(reflect.TypeOf(proto2_20160519.SiblingEnum(0))),
Joe Tsaiea118132018-11-11 17:56:21 -0800104 want: fileDescP2_20160519.Enums().ByName("SiblingEnum"),
105 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800106 got: legacyLoadEnumDesc(reflect.TypeOf(proto2_20160519.Message_ChildEnum(0))),
Joe Tsaiea118132018-11-11 17:56:21 -0800107 want: fileDescP2_20160519.Messages().ByName("Message").Enums().ByName("ChildEnum"),
108 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800109 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160519.SiblingMessage))),
Joe Tsaiea118132018-11-11 17:56:21 -0800110 want: fileDescP2_20160519.Messages().ByName("SiblingMessage"),
111 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800112 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_ChildMessage))),
Joe Tsaiea118132018-11-11 17:56:21 -0800113 want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("ChildMessage"),
114 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800115 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message))),
Joe Tsaiea118132018-11-11 17:56:21 -0800116 want: fileDescP2_20160519.Messages().ByName("Message"),
117 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800118 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_NamedGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800119 want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("NamedGroup"),
120 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800121 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_OptionalGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800122 want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("OptionalGroup"),
123 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800124 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_RequiredGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800125 want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("RequiredGroup"),
126 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800127 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_RepeatedGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800128 want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("RepeatedGroup"),
129 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800130 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_OneofGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800131 want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("OneofGroup"),
132 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800133 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_ExtensionOptionalGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800134 want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("ExtensionOptionalGroup"),
135 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800136 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_ExtensionRepeatedGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800137 want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("ExtensionRepeatedGroup"),
138 }}...)
139
140 fileDescP3_20160519 := mustLoadFileDesc(new(proto3_20160519.Message).Descriptor())
141 tests = append(tests, []struct{ got, want pref.Descriptor }{{
Joe Tsaif0c01e42018-11-06 13:05:20 -0800142 got: legacyLoadEnumDesc(reflect.TypeOf(proto3_20160519.SiblingEnum(0))),
Joe Tsaiea118132018-11-11 17:56:21 -0800143 want: fileDescP3_20160519.Enums().ByName("SiblingEnum"),
144 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800145 got: legacyLoadEnumDesc(reflect.TypeOf(proto3_20160519.Message_ChildEnum(0))),
Joe Tsaiea118132018-11-11 17:56:21 -0800146 want: fileDescP3_20160519.Messages().ByName("Message").Enums().ByName("ChildEnum"),
147 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800148 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20160519.SiblingMessage))),
Joe Tsaiea118132018-11-11 17:56:21 -0800149 want: fileDescP3_20160519.Messages().ByName("SiblingMessage"),
150 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800151 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20160519.Message_ChildMessage))),
Joe Tsaiea118132018-11-11 17:56:21 -0800152 want: fileDescP3_20160519.Messages().ByName("Message").Messages().ByName("ChildMessage"),
153 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800154 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20160519.Message))),
Joe Tsaiea118132018-11-11 17:56:21 -0800155 want: fileDescP3_20160519.Messages().ByName("Message"),
156 }}...)
157
158 fileDescP2_20180125 := mustLoadFileDesc(new(proto2_20180125.Message).Descriptor())
159 tests = append(tests, []struct{ got, want pref.Descriptor }{{
Joe Tsaif0c01e42018-11-06 13:05:20 -0800160 got: legacyLoadEnumDesc(reflect.TypeOf(proto2_20180125.SiblingEnum(0))),
Joe Tsaiea118132018-11-11 17:56:21 -0800161 want: fileDescP2_20180125.Enums().ByName("SiblingEnum"),
162 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800163 got: legacyLoadEnumDesc(reflect.TypeOf(proto2_20180125.Message_ChildEnum(0))),
Joe Tsaiea118132018-11-11 17:56:21 -0800164 want: fileDescP2_20180125.Messages().ByName("Message").Enums().ByName("ChildEnum"),
165 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800166 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180125.SiblingMessage))),
Joe Tsaiea118132018-11-11 17:56:21 -0800167 want: fileDescP2_20180125.Messages().ByName("SiblingMessage"),
168 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800169 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_ChildMessage))),
Joe Tsaiea118132018-11-11 17:56:21 -0800170 want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("ChildMessage"),
171 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800172 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message))),
Joe Tsaiea118132018-11-11 17:56:21 -0800173 want: fileDescP2_20180125.Messages().ByName("Message"),
174 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800175 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_NamedGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800176 want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("NamedGroup"),
177 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800178 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_OptionalGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800179 want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("OptionalGroup"),
180 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800181 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_RequiredGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800182 want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("RequiredGroup"),
183 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800184 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_RepeatedGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800185 want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("RepeatedGroup"),
186 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800187 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_OneofGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800188 want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("OneofGroup"),
189 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800190 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_ExtensionOptionalGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800191 want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("ExtensionOptionalGroup"),
192 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800193 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_ExtensionRepeatedGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800194 want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("ExtensionRepeatedGroup"),
195 }}...)
196
197 fileDescP3_20180125 := mustLoadFileDesc(new(proto3_20180125.Message).Descriptor())
198 tests = append(tests, []struct{ got, want pref.Descriptor }{{
Joe Tsaif0c01e42018-11-06 13:05:20 -0800199 got: legacyLoadEnumDesc(reflect.TypeOf(proto3_20180125.SiblingEnum(0))),
Joe Tsaiea118132018-11-11 17:56:21 -0800200 want: fileDescP3_20180125.Enums().ByName("SiblingEnum"),
201 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800202 got: legacyLoadEnumDesc(reflect.TypeOf(proto3_20180125.Message_ChildEnum(0))),
Joe Tsaiea118132018-11-11 17:56:21 -0800203 want: fileDescP3_20180125.Messages().ByName("Message").Enums().ByName("ChildEnum"),
204 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800205 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20180125.SiblingMessage))),
Joe Tsaiea118132018-11-11 17:56:21 -0800206 want: fileDescP3_20180125.Messages().ByName("SiblingMessage"),
207 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800208 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20180125.Message_ChildMessage))),
Joe Tsaiea118132018-11-11 17:56:21 -0800209 want: fileDescP3_20180125.Messages().ByName("Message").Messages().ByName("ChildMessage"),
210 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800211 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20180125.Message))),
Joe Tsaiea118132018-11-11 17:56:21 -0800212 want: fileDescP3_20180125.Messages().ByName("Message"),
213 }}...)
214
215 fileDescP2_20180430 := mustLoadFileDesc(new(proto2_20180430.Message).Descriptor())
216 tests = append(tests, []struct{ got, want pref.Descriptor }{{
Joe Tsaif0c01e42018-11-06 13:05:20 -0800217 got: legacyLoadEnumDesc(reflect.TypeOf(proto2_20180430.SiblingEnum(0))),
Joe Tsaiea118132018-11-11 17:56:21 -0800218 want: fileDescP2_20180430.Enums().ByName("SiblingEnum"),
219 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800220 got: legacyLoadEnumDesc(reflect.TypeOf(proto2_20180430.Message_ChildEnum(0))),
Joe Tsaiea118132018-11-11 17:56:21 -0800221 want: fileDescP2_20180430.Messages().ByName("Message").Enums().ByName("ChildEnum"),
222 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800223 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180430.SiblingMessage))),
Joe Tsaiea118132018-11-11 17:56:21 -0800224 want: fileDescP2_20180430.Messages().ByName("SiblingMessage"),
225 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800226 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_ChildMessage))),
Joe Tsaiea118132018-11-11 17:56:21 -0800227 want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("ChildMessage"),
228 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800229 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message))),
Joe Tsaiea118132018-11-11 17:56:21 -0800230 want: fileDescP2_20180430.Messages().ByName("Message"),
231 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800232 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_NamedGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800233 want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("NamedGroup"),
234 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800235 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_OptionalGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800236 want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("OptionalGroup"),
237 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800238 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_RequiredGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800239 want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("RequiredGroup"),
240 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800241 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_RepeatedGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800242 want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("RepeatedGroup"),
243 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800244 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_OneofGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800245 want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("OneofGroup"),
246 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800247 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_ExtensionOptionalGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800248 want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("ExtensionOptionalGroup"),
249 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800250 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_ExtensionRepeatedGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800251 want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("ExtensionRepeatedGroup"),
252 }}...)
253
254 fileDescP3_20180430 := mustLoadFileDesc(new(proto3_20180430.Message).Descriptor())
255 tests = append(tests, []struct{ got, want pref.Descriptor }{{
Joe Tsaif0c01e42018-11-06 13:05:20 -0800256 got: legacyLoadEnumDesc(reflect.TypeOf(proto3_20180430.SiblingEnum(0))),
Joe Tsaiea118132018-11-11 17:56:21 -0800257 want: fileDescP3_20180430.Enums().ByName("SiblingEnum"),
258 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800259 got: legacyLoadEnumDesc(reflect.TypeOf(proto3_20180430.Message_ChildEnum(0))),
Joe Tsaiea118132018-11-11 17:56:21 -0800260 want: fileDescP3_20180430.Messages().ByName("Message").Enums().ByName("ChildEnum"),
261 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800262 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20180430.SiblingMessage))),
Joe Tsaiea118132018-11-11 17:56:21 -0800263 want: fileDescP3_20180430.Messages().ByName("SiblingMessage"),
264 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800265 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20180430.Message_ChildMessage))),
Joe Tsaiea118132018-11-11 17:56:21 -0800266 want: fileDescP3_20180430.Messages().ByName("Message").Messages().ByName("ChildMessage"),
267 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800268 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20180430.Message))),
Joe Tsaiea118132018-11-11 17:56:21 -0800269 want: fileDescP3_20180430.Messages().ByName("Message"),
270 }}...)
271
272 fileDescP2_20180814 := mustLoadFileDesc(new(proto2_20180814.Message).Descriptor())
273 tests = append(tests, []struct{ got, want pref.Descriptor }{{
Joe Tsaif0c01e42018-11-06 13:05:20 -0800274 got: legacyLoadEnumDesc(reflect.TypeOf(proto2_20180814.SiblingEnum(0))),
Joe Tsaiea118132018-11-11 17:56:21 -0800275 want: fileDescP2_20180814.Enums().ByName("SiblingEnum"),
276 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800277 got: legacyLoadEnumDesc(reflect.TypeOf(proto2_20180814.Message_ChildEnum(0))),
Joe Tsaiea118132018-11-11 17:56:21 -0800278 want: fileDescP2_20180814.Messages().ByName("Message").Enums().ByName("ChildEnum"),
279 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800280 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180814.SiblingMessage))),
Joe Tsaiea118132018-11-11 17:56:21 -0800281 want: fileDescP2_20180814.Messages().ByName("SiblingMessage"),
282 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800283 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_ChildMessage))),
Joe Tsaiea118132018-11-11 17:56:21 -0800284 want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("ChildMessage"),
285 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800286 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message))),
Joe Tsaiea118132018-11-11 17:56:21 -0800287 want: fileDescP2_20180814.Messages().ByName("Message"),
288 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800289 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_NamedGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800290 want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("NamedGroup"),
291 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800292 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_OptionalGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800293 want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("OptionalGroup"),
294 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800295 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_RequiredGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800296 want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("RequiredGroup"),
297 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800298 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_RepeatedGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800299 want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("RepeatedGroup"),
300 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800301 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_OneofGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800302 want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("OneofGroup"),
303 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800304 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_ExtensionOptionalGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800305 want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("ExtensionOptionalGroup"),
306 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800307 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_ExtensionRepeatedGroup))),
Joe Tsaiea118132018-11-11 17:56:21 -0800308 want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("ExtensionRepeatedGroup"),
309 }}...)
310
311 fileDescP3_20180814 := mustLoadFileDesc(new(proto3_20180814.Message).Descriptor())
312 tests = append(tests, []struct{ got, want pref.Descriptor }{{
Joe Tsaif0c01e42018-11-06 13:05:20 -0800313 got: legacyLoadEnumDesc(reflect.TypeOf(proto3_20180814.SiblingEnum(0))),
Joe Tsaiea118132018-11-11 17:56:21 -0800314 want: fileDescP3_20180814.Enums().ByName("SiblingEnum"),
315 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800316 got: legacyLoadEnumDesc(reflect.TypeOf(proto3_20180814.Message_ChildEnum(0))),
Joe Tsaiea118132018-11-11 17:56:21 -0800317 want: fileDescP3_20180814.Messages().ByName("Message").Enums().ByName("ChildEnum"),
318 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800319 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20180814.SiblingMessage))),
Joe Tsaiea118132018-11-11 17:56:21 -0800320 want: fileDescP3_20180814.Messages().ByName("SiblingMessage"),
321 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800322 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20180814.Message_ChildMessage))),
Joe Tsaiea118132018-11-11 17:56:21 -0800323 want: fileDescP3_20180814.Messages().ByName("Message").Messages().ByName("ChildMessage"),
324 }, {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800325 got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20180814.Message))),
Joe Tsaiea118132018-11-11 17:56:21 -0800326 want: fileDescP3_20180814.Messages().ByName("Message"),
327 }}...)
Joe Tsai90fe9962018-10-18 11:06:29 -0700328
329 type list interface {
330 Len() int
331 pragma.DoNotImplement
332 }
333 opts := cmp.Options{
334 cmp.Transformer("", func(x list) []interface{} {
335 out := make([]interface{}, x.Len())
336 v := reflect.ValueOf(x)
337 for i := 0; i < x.Len(); i++ {
338 m := v.MethodByName("Get")
339 out[i] = m.Call([]reflect.Value{reflect.ValueOf(i)})[0].Interface()
340 }
341 return out
342 }),
343 cmp.Transformer("", func(x pref.Descriptor) map[string]interface{} {
344 out := make(map[string]interface{})
345 v := reflect.ValueOf(x)
346 for i := 0; i < v.NumMethod(); i++ {
347 name := v.Type().Method(i).Name
348 if m := v.Method(i); m.Type().NumIn() == 0 && m.Type().NumOut() == 1 {
349 switch name {
350 case "Index":
351 // Ignore index since legacy descriptors have no parent.
Damien Neil204f1c02018-10-23 15:03:38 -0700352 case "Options":
353 // Ignore descriptor options since protos are not cmperable.
Joe Tsaiea118132018-11-11 17:56:21 -0800354 case "Enums", "Messages", "Extensions":
Joe Tsai90fe9962018-10-18 11:06:29 -0700355 // Ignore nested message and enum declarations since
356 // legacy descriptors are all created standalone.
Joe Tsaiea118132018-11-11 17:56:21 -0800357 case "OneofType", "ExtendedType", "EnumType", "MessageType":
Joe Tsai90fe9962018-10-18 11:06:29 -0700358 // Avoid descending into a dependency to avoid a cycle.
359 // Just record the full name if available.
360 //
361 // TODO: Cycle support in cmp would be useful here.
362 v := m.Call(nil)[0]
363 if !v.IsNil() {
364 out[name] = v.Interface().(pref.Descriptor).FullName()
365 }
366 default:
367 out[name] = m.Call(nil)[0].Interface()
368 }
369 }
370 }
371 return out
372 }),
373 cmp.Transformer("", func(v pref.Value) interface{} {
374 return v.Interface()
375 }),
376 }
377
378 for _, tt := range tests {
379 t.Run(string(tt.want.FullName()), func(t *testing.T) {
380 if diff := cmp.Diff(&tt.want, &tt.got, opts); diff != "" {
381 t.Errorf("descriptor mismatch (-want, +got):\n%s", diff)
382 }
383 })
384 }
385}
Joe Tsaie2afdc22018-10-25 14:06:56 -0700386
Joe Tsaif0c01e42018-11-06 13:05:20 -0800387type legacyTestMessage struct {
Joe Tsai95b02902018-10-31 18:23:42 -0700388 XXX_unrecognized []byte
389 protoV1.XXX_InternalExtensions
390}
391
Joe Tsaif0c01e42018-11-06 13:05:20 -0800392func (*legacyTestMessage) Reset() {}
393func (*legacyTestMessage) String() string { return "" }
394func (*legacyTestMessage) ProtoMessage() {}
395func (*legacyTestMessage) ExtensionRangeArray() []protoV1.ExtensionRange {
396 return []protoV1.ExtensionRange{{Start: 10, End: 20}, {Start: 40, End: 80}, {Start: 10000, End: 20000}}
Joe Tsai95b02902018-10-31 18:23:42 -0700397}
398
Joe Tsaie2afdc22018-10-25 14:06:56 -0700399func TestLegacyUnknown(t *testing.T) {
400 rawOf := func(toks ...pack.Token) pref.RawFields {
401 return pref.RawFields(pack.Message(toks).Marshal())
402 }
403 raw1a := rawOf(pack.Tag{1, pack.VarintType}, pack.Svarint(-4321)) // 08c143
404 raw1b := rawOf(pack.Tag{1, pack.Fixed32Type}, pack.Uint32(0xdeadbeef)) // 0defbeadde
405 raw1c := rawOf(pack.Tag{1, pack.Fixed64Type}, pack.Float64(math.Pi)) // 09182d4454fb210940
406 raw2a := rawOf(pack.Tag{2, pack.BytesType}, pack.String("hello, world!")) // 120d68656c6c6f2c20776f726c6421
407 raw2b := rawOf(pack.Tag{2, pack.VarintType}, pack.Uvarint(1234)) // 10d209
408 raw3a := rawOf(pack.Tag{3, pack.StartGroupType}, pack.Tag{3, pack.EndGroupType}) // 1b1c
409 raw3b := rawOf(pack.Tag{3, pack.BytesType}, pack.Bytes("\xde\xad\xbe\xef")) // 1a04deadbeef
410
Joe Tsai95b02902018-10-31 18:23:42 -0700411 raw1 := rawOf(pack.Tag{1, pack.BytesType}, pack.Bytes("1")) // 0a0131
412 raw3 := rawOf(pack.Tag{3, pack.BytesType}, pack.Bytes("3")) // 1a0133
413 raw10 := rawOf(pack.Tag{10, pack.BytesType}, pack.Bytes("10")) // 52023130 - extension
414 raw15 := rawOf(pack.Tag{15, pack.BytesType}, pack.Bytes("15")) // 7a023135 - extension
415 raw26 := rawOf(pack.Tag{26, pack.BytesType}, pack.Bytes("26")) // d201023236
416 raw32 := rawOf(pack.Tag{32, pack.BytesType}, pack.Bytes("32")) // 8202023332
417 raw45 := rawOf(pack.Tag{45, pack.BytesType}, pack.Bytes("45")) // ea02023435 - extension
418 raw46 := rawOf(pack.Tag{45, pack.BytesType}, pack.Bytes("46")) // ea02023436 - extension
419 raw47 := rawOf(pack.Tag{45, pack.BytesType}, pack.Bytes("47")) // ea02023437 - extension
420 raw99 := rawOf(pack.Tag{99, pack.BytesType}, pack.Bytes("99")) // 9a06023939
421
Joe Tsaie2afdc22018-10-25 14:06:56 -0700422 joinRaw := func(bs ...pref.RawFields) (out []byte) {
423 for _, b := range bs {
424 out = append(out, b...)
425 }
426 return out
427 }
428
Joe Tsaif0c01e42018-11-06 13:05:20 -0800429 m := new(legacyTestMessage)
430 fs := MessageOf(m).UnknownFields()
Joe Tsai95b02902018-10-31 18:23:42 -0700431
Joe Tsaie2afdc22018-10-25 14:06:56 -0700432 if got, want := fs.Len(), 0; got != want {
433 t.Errorf("Len() = %d, want %d", got, want)
434 }
Joe Tsai95b02902018-10-31 18:23:42 -0700435 if got, want := m.XXX_unrecognized, joinRaw(); !bytes.Equal(got, want) {
Joe Tsaie2afdc22018-10-25 14:06:56 -0700436 t.Errorf("data mismatch:\ngot: %x\nwant: %x", got, want)
437 }
438
439 fs.Set(1, raw1a)
440 fs.Set(1, append(fs.Get(1), raw1b...))
441 fs.Set(1, append(fs.Get(1), raw1c...))
442 if got, want := fs.Len(), 1; got != want {
443 t.Errorf("Len() = %d, want %d", got, want)
444 }
Joe Tsai95b02902018-10-31 18:23:42 -0700445 if got, want := m.XXX_unrecognized, joinRaw(raw1a, raw1b, raw1c); !bytes.Equal(got, want) {
Joe Tsaie2afdc22018-10-25 14:06:56 -0700446 t.Errorf("data mismatch:\ngot: %x\nwant: %x", got, want)
447 }
448
449 fs.Set(2, raw2a)
450 if got, want := fs.Len(), 2; got != want {
451 t.Errorf("Len() = %d, want %d", got, want)
452 }
Joe Tsai95b02902018-10-31 18:23:42 -0700453 if got, want := m.XXX_unrecognized, joinRaw(raw1a, raw1b, raw1c, raw2a); !bytes.Equal(got, want) {
Joe Tsaie2afdc22018-10-25 14:06:56 -0700454 t.Errorf("data mismatch:\ngot: %x\nwant: %x", got, want)
455 }
456
457 if got, want := fs.Get(1), joinRaw(raw1a, raw1b, raw1c); !bytes.Equal(got, want) {
458 t.Errorf("Get(%d) = %x, want %x", 1, got, want)
459 }
460 if got, want := fs.Get(2), joinRaw(raw2a); !bytes.Equal(got, want) {
461 t.Errorf("Get(%d) = %x, want %x", 2, got, want)
462 }
463 if got, want := fs.Get(3), joinRaw(); !bytes.Equal(got, want) {
464 t.Errorf("Get(%d) = %x, want %x", 3, got, want)
465 }
466
467 fs.Set(1, nil) // remove field 1
468 if got, want := fs.Len(), 1; got != want {
469 t.Errorf("Len() = %d, want %d", got, want)
470 }
Joe Tsai95b02902018-10-31 18:23:42 -0700471 if got, want := m.XXX_unrecognized, joinRaw(raw2a); !bytes.Equal(got, want) {
Joe Tsaie2afdc22018-10-25 14:06:56 -0700472 t.Errorf("data mismatch:\ngot: %x\nwant: %x", got, want)
473 }
474
475 // Simulate manual appending of raw field data.
Joe Tsai95b02902018-10-31 18:23:42 -0700476 m.XXX_unrecognized = append(m.XXX_unrecognized, joinRaw(raw3a, raw1a, raw1b, raw2b, raw3b, raw1c)...)
Joe Tsaie2afdc22018-10-25 14:06:56 -0700477 if got, want := fs.Len(), 3; got != want {
478 t.Errorf("Len() = %d, want %d", got, want)
479 }
480
481 // Verify range iteration order.
482 var i int
483 want := []struct {
484 num pref.FieldNumber
485 raw pref.RawFields
486 }{
Joe Tsaie2afdc22018-10-25 14:06:56 -0700487 {2, joinRaw(raw2a, raw2b)},
Joe Tsai2d5a1692018-10-29 02:10:42 -0700488 {3, joinRaw(raw3a, raw3b)},
Joe Tsaie2afdc22018-10-25 14:06:56 -0700489 {1, joinRaw(raw1a, raw1b, raw1c)},
490 }
491 fs.Range(func(num pref.FieldNumber, raw pref.RawFields) bool {
492 if i < len(want) {
493 if num != want[i].num || !bytes.Equal(raw, want[i].raw) {
494 t.Errorf("Range(%d) = (%d, %x), want (%d, %x)", i, num, raw, want[i].num, want[i].raw)
495 }
496 } else {
497 t.Errorf("unexpected Range iteration: %d", i)
498 }
499 i++
500 return true
501 })
502
503 fs.Set(2, fs.Get(2)) // moves field 2 to the end
504 if got, want := fs.Len(), 3; got != want {
505 t.Errorf("Len() = %d, want %d", got, want)
506 }
Joe Tsai95b02902018-10-31 18:23:42 -0700507 if got, want := m.XXX_unrecognized, joinRaw(raw3a, raw1a, raw1b, raw3b, raw1c, raw2a, raw2b); !bytes.Equal(got, want) {
Joe Tsaie2afdc22018-10-25 14:06:56 -0700508 t.Errorf("data mismatch:\ngot: %x\nwant: %x", got, want)
509 }
510 fs.Set(1, nil) // remove field 1
511 if got, want := fs.Len(), 2; got != want {
512 t.Errorf("Len() = %d, want %d", got, want)
513 }
Joe Tsai95b02902018-10-31 18:23:42 -0700514 if got, want := m.XXX_unrecognized, joinRaw(raw3a, raw3b, raw2a, raw2b); !bytes.Equal(got, want) {
Joe Tsaie2afdc22018-10-25 14:06:56 -0700515 t.Errorf("data mismatch:\ngot: %x\nwant: %x", got, want)
516 }
517
518 // Remove all fields.
519 fs.Range(func(n pref.FieldNumber, b pref.RawFields) bool {
520 fs.Set(n, nil)
521 return true
522 })
523 if got, want := fs.Len(), 0; got != want {
524 t.Errorf("Len() = %d, want %d", got, want)
525 }
Joe Tsai95b02902018-10-31 18:23:42 -0700526 if got, want := m.XXX_unrecognized, joinRaw(); !bytes.Equal(got, want) {
Joe Tsaie2afdc22018-10-25 14:06:56 -0700527 t.Errorf("data mismatch:\ngot: %x\nwant: %x", got, want)
528 }
Joe Tsai95b02902018-10-31 18:23:42 -0700529
530 fs.Set(1, raw1)
531 if got, want := fs.Len(), 1; got != want {
532 t.Errorf("Len() = %d, want %d", got, want)
533 }
534 if got, want := m.XXX_unrecognized, joinRaw(raw1); !bytes.Equal(got, want) {
535 t.Errorf("data mismatch:\ngot: %x\nwant: %x", got, want)
536 }
537
538 fs.Set(45, raw45)
539 fs.Set(10, raw10) // extension
540 fs.Set(32, raw32)
541 fs.Set(1, nil) // deletion
542 fs.Set(26, raw26)
543 fs.Set(47, raw47) // extension
544 fs.Set(46, raw46) // extension
545 if got, want := fs.Len(), 6; got != want {
546 t.Errorf("Len() = %d, want %d", got, want)
547 }
548 if got, want := m.XXX_unrecognized, joinRaw(raw32, raw26); !bytes.Equal(got, want) {
549 t.Errorf("data mismatch:\ngot: %x\nwant: %x", got, want)
550 }
551
552 // Verify iteration order.
553 i = 0
554 want = []struct {
555 num pref.FieldNumber
556 raw pref.RawFields
557 }{
558 {32, raw32},
559 {26, raw26},
560 {10, raw10}, // extension
561 {45, raw45}, // extension
562 {46, raw46}, // extension
563 {47, raw47}, // extension
564 }
565 fs.Range(func(num pref.FieldNumber, raw pref.RawFields) bool {
566 if i < len(want) {
567 if num != want[i].num || !bytes.Equal(raw, want[i].raw) {
568 t.Errorf("Range(%d) = (%d, %x), want (%d, %x)", i, num, raw, want[i].num, want[i].raw)
569 }
570 } else {
571 t.Errorf("unexpected Range iteration: %d", i)
572 }
573 i++
574 return true
575 })
576
577 // Perform partial deletion while iterating.
578 i = 0
579 fs.Range(func(num pref.FieldNumber, raw pref.RawFields) bool {
580 if i%2 == 0 {
581 fs.Set(num, nil)
582 }
583 i++
584 return true
585 })
586
587 if got, want := fs.Len(), 3; got != want {
588 t.Errorf("Len() = %d, want %d", got, want)
589 }
590 if got, want := m.XXX_unrecognized, joinRaw(raw26); !bytes.Equal(got, want) {
591 t.Errorf("data mismatch:\ngot: %x\nwant: %x", got, want)
592 }
593
594 fs.Set(15, raw15) // extension
595 fs.Set(3, raw3)
596 fs.Set(99, raw99)
597 if got, want := fs.Len(), 6; got != want {
598 t.Errorf("Len() = %d, want %d", got, want)
599 }
600 if got, want := m.XXX_unrecognized, joinRaw(raw26, raw3, raw99); !bytes.Equal(got, want) {
601 t.Errorf("data mismatch:\ngot: %x\nwant: %x", got, want)
602 }
603
604 // Perform partial iteration.
605 i = 0
606 want = []struct {
607 num pref.FieldNumber
608 raw pref.RawFields
609 }{
610 {26, raw26},
611 {3, raw3},
612 }
613 fs.Range(func(num pref.FieldNumber, raw pref.RawFields) bool {
614 if i < len(want) {
615 if num != want[i].num || !bytes.Equal(raw, want[i].raw) {
616 t.Errorf("Range(%d) = (%d, %x), want (%d, %x)", i, num, raw, want[i].num, want[i].raw)
617 }
618 } else {
619 t.Errorf("unexpected Range iteration: %d", i)
620 }
621 i++
622 return i < 2
623 })
Joe Tsaie2afdc22018-10-25 14:06:56 -0700624}
Joe Tsaif0c01e42018-11-06 13:05:20 -0800625
626func TestLegactExtensions(t *testing.T) {
627 extensions := []pref.ExtensionType{
628 legacyExtensionTypeOf(&protoV1.ExtensionDesc{
629 ExtendedType: (*legacyTestMessage)(nil),
630 ExtensionType: (*bool)(nil),
631 Field: 10000,
632 Name: "fizz.buzz.optional_bool",
633 Tag: "varint,10000,opt,name=optional_bool,json=optionalBool,def=1",
634 Filename: "fizz/buzz/test.proto",
635 }),
636 legacyExtensionTypeOf(&protoV1.ExtensionDesc{
637 ExtendedType: (*legacyTestMessage)(nil),
638 ExtensionType: (*int32)(nil),
639 Field: 10001,
640 Name: "fizz.buzz.optional_int32",
641 Tag: "varint,10001,opt,name=optional_int32,json=optionalInt32,def=-12345",
642 Filename: "fizz/buzz/test.proto",
643 }),
644 legacyExtensionTypeOf(&protoV1.ExtensionDesc{
645 ExtendedType: (*legacyTestMessage)(nil),
646 ExtensionType: (*uint32)(nil),
647 Field: 10002,
648 Name: "fizz.buzz.optional_uint32",
649 Tag: "varint,10002,opt,name=optional_uint32,json=optionalUint32,def=3200",
650 Filename: "fizz/buzz/test.proto",
651 }),
652 legacyExtensionTypeOf(&protoV1.ExtensionDesc{
653 ExtendedType: (*legacyTestMessage)(nil),
654 ExtensionType: (*float32)(nil),
655 Field: 10003,
656 Name: "fizz.buzz.optional_float",
657 Tag: "fixed32,10003,opt,name=optional_float,json=optionalFloat,def=3.14159",
658 Filename: "fizz/buzz/test.proto",
659 }),
660 legacyExtensionTypeOf(&protoV1.ExtensionDesc{
661 ExtendedType: (*legacyTestMessage)(nil),
662 ExtensionType: (*string)(nil),
663 Field: 10004,
664 Name: "fizz.buzz.optional_string",
665 Tag: "bytes,10004,opt,name=optional_string,json=optionalString,def=hello, \"world!\"\n",
666 Filename: "fizz/buzz/test.proto",
667 }),
668 legacyExtensionTypeOf(&protoV1.ExtensionDesc{
669 ExtendedType: (*legacyTestMessage)(nil),
670 ExtensionType: ([]byte)(nil),
671 Field: 10005,
672 Name: "fizz.buzz.optional_bytes",
673 Tag: "bytes,10005,opt,name=optional_bytes,json=optionalBytes,def=dead\\336\\255\\276\\357beef",
674 Filename: "fizz/buzz/test.proto",
675 }),
676 legacyExtensionTypeOf(&protoV1.ExtensionDesc{
677 ExtendedType: (*legacyTestMessage)(nil),
678 ExtensionType: (*proto2_20180125.Message_ChildEnum)(nil),
679 Field: 10006,
Joe Tsai87b955b2018-11-14 21:59:49 -0800680 Name: "fizz.buzz.optional_enum_v1",
681 Tag: "varint,10006,opt,name=optional_enum_v1,json=optionalEnumV1,enum=google.golang.org.proto2_20180125.Message_ChildEnum,def=0",
Joe Tsaif0c01e42018-11-06 13:05:20 -0800682 Filename: "fizz/buzz/test.proto",
683 }),
684 legacyExtensionTypeOf(&protoV1.ExtensionDesc{
685 ExtendedType: (*legacyTestMessage)(nil),
686 ExtensionType: (*proto2_20180125.Message_ChildMessage)(nil),
687 Field: 10007,
Joe Tsai87b955b2018-11-14 21:59:49 -0800688 Name: "fizz.buzz.optional_message_v1",
689 Tag: "bytes,10007,opt,name=optional_message_v1,json=optionalMessageV1",
Joe Tsaif0c01e42018-11-06 13:05:20 -0800690 Filename: "fizz/buzz/test.proto",
691 }),
Joe Tsai87b955b2018-11-14 21:59:49 -0800692 legacyExtensionTypeOf(&protoV1.ExtensionDesc{
693 ExtendedType: (*legacyTestMessage)(nil),
694 ExtensionType: (*EnumProto2)(nil),
695 Field: 10008,
696 Name: "fizz.buzz.optional_enum_v2",
697 Tag: "varint,10008,opt,name=optional_enum_v2,json=optionalEnumV2,enum=EnumProto2,def=57005",
698 Filename: "fizz/buzz/test.proto",
699 }),
700 legacyExtensionTypeOf(&protoV1.ExtensionDesc{
701 ExtendedType: (*legacyTestMessage)(nil),
702 ExtensionType: (*EnumMessages)(nil),
703 Field: 10009,
704 Name: "fizz.buzz.optional_message_v2",
705 Tag: "bytes,10009,opt,name=optional_message_v2,json=optionalMessageV2",
706 Filename: "fizz/buzz/test.proto",
707 }),
Joe Tsaif0c01e42018-11-06 13:05:20 -0800708 legacyExtensionTypeOf(&protoV1.ExtensionDesc{
709 ExtendedType: (*legacyTestMessage)(nil),
710 ExtensionType: ([]bool)(nil),
Joe Tsai87b955b2018-11-14 21:59:49 -0800711 Field: 10010,
Joe Tsaif0c01e42018-11-06 13:05:20 -0800712 Name: "fizz.buzz.repeated_bool",
Joe Tsai87b955b2018-11-14 21:59:49 -0800713 Tag: "varint,10010,rep,name=repeated_bool,json=repeatedBool",
Joe Tsaif0c01e42018-11-06 13:05:20 -0800714 Filename: "fizz/buzz/test.proto",
715 }),
716 legacyExtensionTypeOf(&protoV1.ExtensionDesc{
717 ExtendedType: (*legacyTestMessage)(nil),
718 ExtensionType: ([]int32)(nil),
Joe Tsai87b955b2018-11-14 21:59:49 -0800719 Field: 10011,
Joe Tsaif0c01e42018-11-06 13:05:20 -0800720 Name: "fizz.buzz.repeated_int32",
Joe Tsai87b955b2018-11-14 21:59:49 -0800721 Tag: "varint,10011,rep,name=repeated_int32,json=repeatedInt32",
Joe Tsaif0c01e42018-11-06 13:05:20 -0800722 Filename: "fizz/buzz/test.proto",
723 }),
724 legacyExtensionTypeOf(&protoV1.ExtensionDesc{
725 ExtendedType: (*legacyTestMessage)(nil),
726 ExtensionType: ([]uint32)(nil),
Joe Tsai87b955b2018-11-14 21:59:49 -0800727 Field: 10012,
Joe Tsaif0c01e42018-11-06 13:05:20 -0800728 Name: "fizz.buzz.repeated_uint32",
Joe Tsai87b955b2018-11-14 21:59:49 -0800729 Tag: "varint,10012,rep,name=repeated_uint32,json=repeatedUint32",
Joe Tsaif0c01e42018-11-06 13:05:20 -0800730 Filename: "fizz/buzz/test.proto",
731 }),
732 legacyExtensionTypeOf(&protoV1.ExtensionDesc{
733 ExtendedType: (*legacyTestMessage)(nil),
734 ExtensionType: ([]float32)(nil),
Joe Tsai87b955b2018-11-14 21:59:49 -0800735 Field: 10013,
Joe Tsaif0c01e42018-11-06 13:05:20 -0800736 Name: "fizz.buzz.repeated_float",
Joe Tsai87b955b2018-11-14 21:59:49 -0800737 Tag: "fixed32,10013,rep,name=repeated_float,json=repeatedFloat",
Joe Tsaif0c01e42018-11-06 13:05:20 -0800738 Filename: "fizz/buzz/test.proto",
739 }),
740 legacyExtensionTypeOf(&protoV1.ExtensionDesc{
741 ExtendedType: (*legacyTestMessage)(nil),
742 ExtensionType: ([]string)(nil),
Joe Tsai87b955b2018-11-14 21:59:49 -0800743 Field: 10014,
Joe Tsaif0c01e42018-11-06 13:05:20 -0800744 Name: "fizz.buzz.repeated_string",
Joe Tsai87b955b2018-11-14 21:59:49 -0800745 Tag: "bytes,10014,rep,name=repeated_string,json=repeatedString",
Joe Tsaif0c01e42018-11-06 13:05:20 -0800746 Filename: "fizz/buzz/test.proto",
747 }),
748 legacyExtensionTypeOf(&protoV1.ExtensionDesc{
749 ExtendedType: (*legacyTestMessage)(nil),
750 ExtensionType: ([][]byte)(nil),
Joe Tsai87b955b2018-11-14 21:59:49 -0800751 Field: 10015,
Joe Tsaif0c01e42018-11-06 13:05:20 -0800752 Name: "fizz.buzz.repeated_bytes",
Joe Tsai87b955b2018-11-14 21:59:49 -0800753 Tag: "bytes,10015,rep,name=repeated_bytes,json=repeatedBytes",
Joe Tsaif0c01e42018-11-06 13:05:20 -0800754 Filename: "fizz/buzz/test.proto",
755 }),
756 legacyExtensionTypeOf(&protoV1.ExtensionDesc{
757 ExtendedType: (*legacyTestMessage)(nil),
758 ExtensionType: ([]proto2_20180125.Message_ChildEnum)(nil),
Joe Tsai87b955b2018-11-14 21:59:49 -0800759 Field: 10016,
760 Name: "fizz.buzz.repeated_enum_v1",
761 Tag: "varint,10016,rep,name=repeated_enum_v1,json=repeatedEnumV1,enum=google.golang.org.proto2_20180125.Message_ChildEnum",
Joe Tsaif0c01e42018-11-06 13:05:20 -0800762 Filename: "fizz/buzz/test.proto",
763 }),
764 legacyExtensionTypeOf(&protoV1.ExtensionDesc{
765 ExtendedType: (*legacyTestMessage)(nil),
766 ExtensionType: ([]*proto2_20180125.Message_ChildMessage)(nil),
Joe Tsai87b955b2018-11-14 21:59:49 -0800767 Field: 10017,
768 Name: "fizz.buzz.repeated_message_v1",
769 Tag: "bytes,10017,rep,name=repeated_message_v1,json=repeatedMessageV1",
Joe Tsaif0c01e42018-11-06 13:05:20 -0800770 Filename: "fizz/buzz/test.proto",
771 }),
Joe Tsai87b955b2018-11-14 21:59:49 -0800772 legacyExtensionTypeOf(&protoV1.ExtensionDesc{
773 ExtendedType: (*legacyTestMessage)(nil),
774 ExtensionType: ([]EnumProto2)(nil),
775 Field: 10018,
776 Name: "fizz.buzz.repeated_enum_v2",
777 Tag: "varint,10018,rep,name=repeated_enum_v2,json=repeatedEnumV2,enum=EnumProto2",
778 Filename: "fizz/buzz/test.proto",
779 }),
780 legacyExtensionTypeOf(&protoV1.ExtensionDesc{
781 ExtendedType: (*legacyTestMessage)(nil),
782 ExtensionType: ([]*EnumMessages)(nil),
783 Field: 10019,
784 Name: "fizz.buzz.repeated_message_v2",
785 Tag: "bytes,10019,rep,name=repeated_message_v2,json=repeatedMessageV2",
786 Filename: "fizz/buzz/test.proto",
787 }),
Joe Tsaif0c01e42018-11-06 13:05:20 -0800788 }
789 opts := cmp.Options{cmp.Comparer(func(x, y *proto2_20180125.Message_ChildMessage) bool {
790 return x == y // pointer compare messages for object identity
791 })}
792
793 m := new(legacyTestMessage)
794 fs := MessageOf(m).KnownFields()
795 ts := fs.ExtensionTypes()
796
797 if n := fs.Len(); n != 0 {
798 t.Errorf("KnownFields.Len() = %v, want 0", n)
799 }
800 if n := ts.Len(); n != 0 {
801 t.Errorf("ExtensionFieldTypes.Len() = %v, want 0", n)
802 }
803
804 // Register all the extension types.
805 for _, xt := range extensions {
806 ts.Register(xt)
807 }
808
809 // Check that getting the zero value returns the default value for scalars,
Joe Tsai4b7aff62018-11-14 14:05:19 -0800810 // nil for singular messages, and an empty list for repeated fields.
Joe Tsaif0c01e42018-11-06 13:05:20 -0800811 defaultValues := []interface{}{
812 bool(true),
813 int32(-12345),
814 uint32(3200),
815 float32(3.14159),
816 string("hello, \"world!\"\n"),
817 []byte("dead\xde\xad\xbe\xefbeef"),
818 proto2_20180125.Message_ALPHA,
819 nil,
Joe Tsai87b955b2018-11-14 21:59:49 -0800820 EnumProto2(0xdead),
821 nil,
Joe Tsaif0c01e42018-11-06 13:05:20 -0800822 new([]bool),
823 new([]int32),
824 new([]uint32),
825 new([]float32),
826 new([]string),
827 new([][]byte),
828 new([]proto2_20180125.Message_ChildEnum),
829 new([]*proto2_20180125.Message_ChildMessage),
Joe Tsai87b955b2018-11-14 21:59:49 -0800830 new([]EnumProto2),
831 new([]*EnumMessages),
Joe Tsaif0c01e42018-11-06 13:05:20 -0800832 }
833 for i, xt := range extensions {
834 var got interface{}
Joe Tsaif6d4a422018-11-19 14:26:06 -0800835 if v := fs.Get(xt.Number()); v.IsValid() {
836 got = xt.InterfaceOf(v)
Joe Tsaif0c01e42018-11-06 13:05:20 -0800837 }
838 want := defaultValues[i]
839 if diff := cmp.Diff(want, got, opts); diff != "" {
840 t.Errorf("KnownFields.Get(%d) mismatch (-want +got):\n%v", xt.Number(), diff)
841 }
842 }
843
844 // All fields should be unpopulated.
845 for _, xt := range extensions {
846 if fs.Has(xt.Number()) {
847 t.Errorf("KnownFields.Has(%d) = true, want false", xt.Number())
848 }
849 }
850
Joe Tsai4b7aff62018-11-14 14:05:19 -0800851 // Set some values and append to values to the lists.
Joe Tsai009e0672018-11-27 18:45:07 -0800852 m1a := &proto2_20180125.Message_ChildMessage{F1: scalar.String("m1a")}
853 m1b := &proto2_20180125.Message_ChildMessage{F1: scalar.String("m2b")}
Joe Tsai87b955b2018-11-14 21:59:49 -0800854 m2a := &EnumMessages{EnumP2: EnumProto2(0x1b).Enum()}
855 m2b := &EnumMessages{EnumP2: EnumProto2(0x2b).Enum()}
Joe Tsaif0c01e42018-11-06 13:05:20 -0800856 setValues := []interface{}{
857 bool(false),
858 int32(-54321),
859 uint32(6400),
860 float32(2.71828),
861 string("goodbye, \"world!\"\n"),
862 []byte("live\xde\xad\xbe\xefchicken"),
863 proto2_20180125.Message_CHARLIE,
Joe Tsai87b955b2018-11-14 21:59:49 -0800864 m1a,
865 EnumProto2(0xbeef),
866 m2a,
Joe Tsaif0c01e42018-11-06 13:05:20 -0800867 &[]bool{true},
868 &[]int32{-1000},
869 &[]uint32{1280},
870 &[]float32{1.6180},
871 &[]string{"zero"},
872 &[][]byte{[]byte("zero")},
873 &[]proto2_20180125.Message_ChildEnum{proto2_20180125.Message_BRAVO},
Joe Tsai87b955b2018-11-14 21:59:49 -0800874 &[]*proto2_20180125.Message_ChildMessage{m1b},
875 &[]EnumProto2{0xdead},
876 &[]*EnumMessages{m2b},
Joe Tsaif0c01e42018-11-06 13:05:20 -0800877 }
878 for i, xt := range extensions {
879 fs.Set(xt.Number(), xt.ValueOf(setValues[i]))
880 }
881 for i, xt := range extensions[len(extensions)/2:] {
882 v := extensions[i].ValueOf(setValues[i])
Joe Tsai4b7aff62018-11-14 14:05:19 -0800883 fs.Get(xt.Number()).List().Append(v)
Joe Tsaif0c01e42018-11-06 13:05:20 -0800884 }
885
886 // Get the values and check for equality.
887 getValues := []interface{}{
888 bool(false),
889 int32(-54321),
890 uint32(6400),
891 float32(2.71828),
892 string("goodbye, \"world!\"\n"),
893 []byte("live\xde\xad\xbe\xefchicken"),
894 proto2_20180125.Message_ChildEnum(proto2_20180125.Message_CHARLIE),
Joe Tsai87b955b2018-11-14 21:59:49 -0800895 m1a,
896 EnumProto2(0xbeef),
897 m2a,
Joe Tsaif0c01e42018-11-06 13:05:20 -0800898 &[]bool{true, false},
899 &[]int32{-1000, -54321},
900 &[]uint32{1280, 6400},
901 &[]float32{1.6180, 2.71828},
902 &[]string{"zero", "goodbye, \"world!\"\n"},
903 &[][]byte{[]byte("zero"), []byte("live\xde\xad\xbe\xefchicken")},
904 &[]proto2_20180125.Message_ChildEnum{proto2_20180125.Message_BRAVO, proto2_20180125.Message_CHARLIE},
Joe Tsai87b955b2018-11-14 21:59:49 -0800905 &[]*proto2_20180125.Message_ChildMessage{m1b, m1a},
906 &[]EnumProto2{0xdead, 0xbeef},
907 &[]*EnumMessages{m2b, m2a},
Joe Tsaif0c01e42018-11-06 13:05:20 -0800908 }
909 for i, xt := range extensions {
910 got := xt.InterfaceOf(fs.Get(xt.Number()))
911 want := getValues[i]
912 if diff := cmp.Diff(want, got, opts); diff != "" {
913 t.Errorf("KnownFields.Get(%d) mismatch (-want +got):\n%v", xt.Number(), diff)
914 }
915 }
916
Joe Tsai87b955b2018-11-14 21:59:49 -0800917 if n := fs.Len(); n != 20 {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800918 t.Errorf("KnownFields.Len() = %v, want 0", n)
919 }
Joe Tsai87b955b2018-11-14 21:59:49 -0800920 if n := ts.Len(); n != 20 {
921 t.Errorf("ExtensionFieldTypes.Len() = %v, want 20", n)
Joe Tsaif0c01e42018-11-06 13:05:20 -0800922 }
923
924 // Clear the field for all extension types.
Joe Tsaif6d4a422018-11-19 14:26:06 -0800925 for _, xt := range extensions[:len(extensions)/2] {
Joe Tsaif0c01e42018-11-06 13:05:20 -0800926 fs.Clear(xt.Number())
927 }
Joe Tsaif6d4a422018-11-19 14:26:06 -0800928 for i, xt := range extensions[len(extensions)/2:] {
929 if i%2 == 0 {
930 fs.Clear(xt.Number())
931 } else {
932 fs.Get(xt.Number()).List().Truncate(0)
933 }
934 }
Joe Tsaif0c01e42018-11-06 13:05:20 -0800935 if n := fs.Len(); n != 0 {
936 t.Errorf("KnownFields.Len() = %v, want 0", n)
937 }
Joe Tsai87b955b2018-11-14 21:59:49 -0800938 if n := ts.Len(); n != 20 {
939 t.Errorf("ExtensionFieldTypes.Len() = %v, want 20", n)
Joe Tsaif0c01e42018-11-06 13:05:20 -0800940 }
941
942 // De-register all extension types.
943 for _, xt := range extensions {
944 ts.Remove(xt)
945 }
946 if n := fs.Len(); n != 0 {
947 t.Errorf("KnownFields.Len() = %v, want 0", n)
948 }
949 if n := ts.Len(); n != 0 {
950 t.Errorf("ExtensionFieldTypes.Len() = %v, want 0", n)
951 }
952
953}