legacy_test.go 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953
  1. // 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. package impl
  5. import (
  6. "bytes"
  7. "math"
  8. "reflect"
  9. "testing"
  10. protoV1 "github.com/golang/protobuf/proto"
  11. pack "github.com/golang/protobuf/v2/internal/encoding/pack"
  12. pragma "github.com/golang/protobuf/v2/internal/pragma"
  13. scalar "github.com/golang/protobuf/v2/internal/scalar"
  14. pref "github.com/golang/protobuf/v2/reflect/protoreflect"
  15. ptype "github.com/golang/protobuf/v2/reflect/prototype"
  16. cmp "github.com/google/go-cmp/cmp"
  17. proto2_20160225 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto2.v0.0.0-20160225-2fc053c5"
  18. proto2_20160519 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto2.v0.0.0-20160519-a4ab9ec5"
  19. proto2_20180125 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto2.v1.0.0-20180125-92554152"
  20. proto2_20180430 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto2.v1.1.0-20180430-b4deda09"
  21. proto2_20180814 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto2.v1.2.0-20180814-aa810b61"
  22. proto3_20160225 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto3.v0.0.0-20160225-2fc053c5"
  23. proto3_20160519 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto3.v0.0.0-20160519-a4ab9ec5"
  24. proto3_20180125 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto3.v1.0.0-20180125-92554152"
  25. proto3_20180430 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto3.v1.1.0-20180430-b4deda09"
  26. proto3_20180814 "github.com/golang/protobuf/v2/internal/testprotos/legacy/proto3.v1.2.0-20180814-aa810b61"
  27. )
  28. func mustLoadFileDesc(b []byte, _ []int) pref.FileDescriptor {
  29. fd, err := ptype.NewFileFromDescriptorProto(legacyLoadFileDesc(b), nil)
  30. if err != nil {
  31. panic(err)
  32. }
  33. return fd
  34. }
  35. func TestLegacyDescriptor(t *testing.T) {
  36. var tests []struct{ got, want pref.Descriptor }
  37. fileDescP2_20160225 := mustLoadFileDesc(new(proto2_20160225.Message).Descriptor())
  38. tests = append(tests, []struct{ got, want pref.Descriptor }{{
  39. got: legacyLoadEnumDesc(reflect.TypeOf(proto2_20160225.SiblingEnum(0))),
  40. want: fileDescP2_20160225.Enums().ByName("SiblingEnum"),
  41. }, {
  42. got: legacyLoadEnumDesc(reflect.TypeOf(proto2_20160225.Message_ChildEnum(0))),
  43. want: fileDescP2_20160225.Messages().ByName("Message").Enums().ByName("ChildEnum"),
  44. }, {
  45. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160225.SiblingMessage))),
  46. want: fileDescP2_20160225.Messages().ByName("SiblingMessage"),
  47. }, {
  48. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_ChildMessage))),
  49. want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("ChildMessage"),
  50. }, {
  51. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message))),
  52. want: fileDescP2_20160225.Messages().ByName("Message"),
  53. }, {
  54. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_NamedGroup))),
  55. want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("NamedGroup"),
  56. }, {
  57. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_OptionalGroup))),
  58. want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("OptionalGroup"),
  59. }, {
  60. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_RequiredGroup))),
  61. want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("RequiredGroup"),
  62. }, {
  63. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_RepeatedGroup))),
  64. want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("RepeatedGroup"),
  65. }, {
  66. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_OneofGroup))),
  67. want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("OneofGroup"),
  68. }, {
  69. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_ExtensionOptionalGroup))),
  70. want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("ExtensionOptionalGroup"),
  71. }, {
  72. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160225.Message_ExtensionRepeatedGroup))),
  73. want: fileDescP2_20160225.Messages().ByName("Message").Messages().ByName("ExtensionRepeatedGroup"),
  74. }}...)
  75. fileDescP3_20160225 := mustLoadFileDesc(new(proto3_20160225.Message).Descriptor())
  76. tests = append(tests, []struct{ got, want pref.Descriptor }{{
  77. got: legacyLoadEnumDesc(reflect.TypeOf(proto3_20160225.SiblingEnum(0))),
  78. want: fileDescP3_20160225.Enums().ByName("SiblingEnum"),
  79. }, {
  80. got: legacyLoadEnumDesc(reflect.TypeOf(proto3_20160225.Message_ChildEnum(0))),
  81. want: fileDescP3_20160225.Messages().ByName("Message").Enums().ByName("ChildEnum"),
  82. }, {
  83. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20160225.SiblingMessage))),
  84. want: fileDescP3_20160225.Messages().ByName("SiblingMessage"),
  85. }, {
  86. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20160225.Message_ChildMessage))),
  87. want: fileDescP3_20160225.Messages().ByName("Message").Messages().ByName("ChildMessage"),
  88. }, {
  89. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20160225.Message))),
  90. want: fileDescP3_20160225.Messages().ByName("Message"),
  91. }}...)
  92. fileDescP2_20160519 := mustLoadFileDesc(new(proto2_20160519.Message).Descriptor())
  93. tests = append(tests, []struct{ got, want pref.Descriptor }{{
  94. got: legacyLoadEnumDesc(reflect.TypeOf(proto2_20160519.SiblingEnum(0))),
  95. want: fileDescP2_20160519.Enums().ByName("SiblingEnum"),
  96. }, {
  97. got: legacyLoadEnumDesc(reflect.TypeOf(proto2_20160519.Message_ChildEnum(0))),
  98. want: fileDescP2_20160519.Messages().ByName("Message").Enums().ByName("ChildEnum"),
  99. }, {
  100. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160519.SiblingMessage))),
  101. want: fileDescP2_20160519.Messages().ByName("SiblingMessage"),
  102. }, {
  103. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_ChildMessage))),
  104. want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("ChildMessage"),
  105. }, {
  106. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message))),
  107. want: fileDescP2_20160519.Messages().ByName("Message"),
  108. }, {
  109. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_NamedGroup))),
  110. want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("NamedGroup"),
  111. }, {
  112. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_OptionalGroup))),
  113. want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("OptionalGroup"),
  114. }, {
  115. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_RequiredGroup))),
  116. want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("RequiredGroup"),
  117. }, {
  118. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_RepeatedGroup))),
  119. want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("RepeatedGroup"),
  120. }, {
  121. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_OneofGroup))),
  122. want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("OneofGroup"),
  123. }, {
  124. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_ExtensionOptionalGroup))),
  125. want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("ExtensionOptionalGroup"),
  126. }, {
  127. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20160519.Message_ExtensionRepeatedGroup))),
  128. want: fileDescP2_20160519.Messages().ByName("Message").Messages().ByName("ExtensionRepeatedGroup"),
  129. }}...)
  130. fileDescP3_20160519 := mustLoadFileDesc(new(proto3_20160519.Message).Descriptor())
  131. tests = append(tests, []struct{ got, want pref.Descriptor }{{
  132. got: legacyLoadEnumDesc(reflect.TypeOf(proto3_20160519.SiblingEnum(0))),
  133. want: fileDescP3_20160519.Enums().ByName("SiblingEnum"),
  134. }, {
  135. got: legacyLoadEnumDesc(reflect.TypeOf(proto3_20160519.Message_ChildEnum(0))),
  136. want: fileDescP3_20160519.Messages().ByName("Message").Enums().ByName("ChildEnum"),
  137. }, {
  138. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20160519.SiblingMessage))),
  139. want: fileDescP3_20160519.Messages().ByName("SiblingMessage"),
  140. }, {
  141. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20160519.Message_ChildMessage))),
  142. want: fileDescP3_20160519.Messages().ByName("Message").Messages().ByName("ChildMessage"),
  143. }, {
  144. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20160519.Message))),
  145. want: fileDescP3_20160519.Messages().ByName("Message"),
  146. }}...)
  147. fileDescP2_20180125 := mustLoadFileDesc(new(proto2_20180125.Message).Descriptor())
  148. tests = append(tests, []struct{ got, want pref.Descriptor }{{
  149. got: legacyLoadEnumDesc(reflect.TypeOf(proto2_20180125.SiblingEnum(0))),
  150. want: fileDescP2_20180125.Enums().ByName("SiblingEnum"),
  151. }, {
  152. got: legacyLoadEnumDesc(reflect.TypeOf(proto2_20180125.Message_ChildEnum(0))),
  153. want: fileDescP2_20180125.Messages().ByName("Message").Enums().ByName("ChildEnum"),
  154. }, {
  155. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180125.SiblingMessage))),
  156. want: fileDescP2_20180125.Messages().ByName("SiblingMessage"),
  157. }, {
  158. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_ChildMessage))),
  159. want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("ChildMessage"),
  160. }, {
  161. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message))),
  162. want: fileDescP2_20180125.Messages().ByName("Message"),
  163. }, {
  164. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_NamedGroup))),
  165. want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("NamedGroup"),
  166. }, {
  167. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_OptionalGroup))),
  168. want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("OptionalGroup"),
  169. }, {
  170. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_RequiredGroup))),
  171. want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("RequiredGroup"),
  172. }, {
  173. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_RepeatedGroup))),
  174. want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("RepeatedGroup"),
  175. }, {
  176. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_OneofGroup))),
  177. want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("OneofGroup"),
  178. }, {
  179. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_ExtensionOptionalGroup))),
  180. want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("ExtensionOptionalGroup"),
  181. }, {
  182. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180125.Message_ExtensionRepeatedGroup))),
  183. want: fileDescP2_20180125.Messages().ByName("Message").Messages().ByName("ExtensionRepeatedGroup"),
  184. }}...)
  185. fileDescP3_20180125 := mustLoadFileDesc(new(proto3_20180125.Message).Descriptor())
  186. tests = append(tests, []struct{ got, want pref.Descriptor }{{
  187. got: legacyLoadEnumDesc(reflect.TypeOf(proto3_20180125.SiblingEnum(0))),
  188. want: fileDescP3_20180125.Enums().ByName("SiblingEnum"),
  189. }, {
  190. got: legacyLoadEnumDesc(reflect.TypeOf(proto3_20180125.Message_ChildEnum(0))),
  191. want: fileDescP3_20180125.Messages().ByName("Message").Enums().ByName("ChildEnum"),
  192. }, {
  193. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20180125.SiblingMessage))),
  194. want: fileDescP3_20180125.Messages().ByName("SiblingMessage"),
  195. }, {
  196. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20180125.Message_ChildMessage))),
  197. want: fileDescP3_20180125.Messages().ByName("Message").Messages().ByName("ChildMessage"),
  198. }, {
  199. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20180125.Message))),
  200. want: fileDescP3_20180125.Messages().ByName("Message"),
  201. }}...)
  202. fileDescP2_20180430 := mustLoadFileDesc(new(proto2_20180430.Message).Descriptor())
  203. tests = append(tests, []struct{ got, want pref.Descriptor }{{
  204. got: legacyLoadEnumDesc(reflect.TypeOf(proto2_20180430.SiblingEnum(0))),
  205. want: fileDescP2_20180430.Enums().ByName("SiblingEnum"),
  206. }, {
  207. got: legacyLoadEnumDesc(reflect.TypeOf(proto2_20180430.Message_ChildEnum(0))),
  208. want: fileDescP2_20180430.Messages().ByName("Message").Enums().ByName("ChildEnum"),
  209. }, {
  210. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180430.SiblingMessage))),
  211. want: fileDescP2_20180430.Messages().ByName("SiblingMessage"),
  212. }, {
  213. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_ChildMessage))),
  214. want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("ChildMessage"),
  215. }, {
  216. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message))),
  217. want: fileDescP2_20180430.Messages().ByName("Message"),
  218. }, {
  219. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_NamedGroup))),
  220. want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("NamedGroup"),
  221. }, {
  222. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_OptionalGroup))),
  223. want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("OptionalGroup"),
  224. }, {
  225. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_RequiredGroup))),
  226. want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("RequiredGroup"),
  227. }, {
  228. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_RepeatedGroup))),
  229. want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("RepeatedGroup"),
  230. }, {
  231. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_OneofGroup))),
  232. want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("OneofGroup"),
  233. }, {
  234. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_ExtensionOptionalGroup))),
  235. want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("ExtensionOptionalGroup"),
  236. }, {
  237. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180430.Message_ExtensionRepeatedGroup))),
  238. want: fileDescP2_20180430.Messages().ByName("Message").Messages().ByName("ExtensionRepeatedGroup"),
  239. }}...)
  240. fileDescP3_20180430 := mustLoadFileDesc(new(proto3_20180430.Message).Descriptor())
  241. tests = append(tests, []struct{ got, want pref.Descriptor }{{
  242. got: legacyLoadEnumDesc(reflect.TypeOf(proto3_20180430.SiblingEnum(0))),
  243. want: fileDescP3_20180430.Enums().ByName("SiblingEnum"),
  244. }, {
  245. got: legacyLoadEnumDesc(reflect.TypeOf(proto3_20180430.Message_ChildEnum(0))),
  246. want: fileDescP3_20180430.Messages().ByName("Message").Enums().ByName("ChildEnum"),
  247. }, {
  248. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20180430.SiblingMessage))),
  249. want: fileDescP3_20180430.Messages().ByName("SiblingMessage"),
  250. }, {
  251. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20180430.Message_ChildMessage))),
  252. want: fileDescP3_20180430.Messages().ByName("Message").Messages().ByName("ChildMessage"),
  253. }, {
  254. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20180430.Message))),
  255. want: fileDescP3_20180430.Messages().ByName("Message"),
  256. }}...)
  257. fileDescP2_20180814 := mustLoadFileDesc(new(proto2_20180814.Message).Descriptor())
  258. tests = append(tests, []struct{ got, want pref.Descriptor }{{
  259. got: legacyLoadEnumDesc(reflect.TypeOf(proto2_20180814.SiblingEnum(0))),
  260. want: fileDescP2_20180814.Enums().ByName("SiblingEnum"),
  261. }, {
  262. got: legacyLoadEnumDesc(reflect.TypeOf(proto2_20180814.Message_ChildEnum(0))),
  263. want: fileDescP2_20180814.Messages().ByName("Message").Enums().ByName("ChildEnum"),
  264. }, {
  265. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180814.SiblingMessage))),
  266. want: fileDescP2_20180814.Messages().ByName("SiblingMessage"),
  267. }, {
  268. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_ChildMessage))),
  269. want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("ChildMessage"),
  270. }, {
  271. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message))),
  272. want: fileDescP2_20180814.Messages().ByName("Message"),
  273. }, {
  274. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_NamedGroup))),
  275. want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("NamedGroup"),
  276. }, {
  277. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_OptionalGroup))),
  278. want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("OptionalGroup"),
  279. }, {
  280. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_RequiredGroup))),
  281. want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("RequiredGroup"),
  282. }, {
  283. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_RepeatedGroup))),
  284. want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("RepeatedGroup"),
  285. }, {
  286. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_OneofGroup))),
  287. want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("OneofGroup"),
  288. }, {
  289. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_ExtensionOptionalGroup))),
  290. want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("ExtensionOptionalGroup"),
  291. }, {
  292. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto2_20180814.Message_ExtensionRepeatedGroup))),
  293. want: fileDescP2_20180814.Messages().ByName("Message").Messages().ByName("ExtensionRepeatedGroup"),
  294. }}...)
  295. fileDescP3_20180814 := mustLoadFileDesc(new(proto3_20180814.Message).Descriptor())
  296. tests = append(tests, []struct{ got, want pref.Descriptor }{{
  297. got: legacyLoadEnumDesc(reflect.TypeOf(proto3_20180814.SiblingEnum(0))),
  298. want: fileDescP3_20180814.Enums().ByName("SiblingEnum"),
  299. }, {
  300. got: legacyLoadEnumDesc(reflect.TypeOf(proto3_20180814.Message_ChildEnum(0))),
  301. want: fileDescP3_20180814.Messages().ByName("Message").Enums().ByName("ChildEnum"),
  302. }, {
  303. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20180814.SiblingMessage))),
  304. want: fileDescP3_20180814.Messages().ByName("SiblingMessage"),
  305. }, {
  306. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20180814.Message_ChildMessage))),
  307. want: fileDescP3_20180814.Messages().ByName("Message").Messages().ByName("ChildMessage"),
  308. }, {
  309. got: legacyLoadMessageDesc(reflect.TypeOf(new(proto3_20180814.Message))),
  310. want: fileDescP3_20180814.Messages().ByName("Message"),
  311. }}...)
  312. type list interface {
  313. Len() int
  314. pragma.DoNotImplement
  315. }
  316. opts := cmp.Options{
  317. cmp.Transformer("", func(x list) []interface{} {
  318. out := make([]interface{}, x.Len())
  319. v := reflect.ValueOf(x)
  320. for i := 0; i < x.Len(); i++ {
  321. m := v.MethodByName("Get")
  322. out[i] = m.Call([]reflect.Value{reflect.ValueOf(i)})[0].Interface()
  323. }
  324. return out
  325. }),
  326. cmp.Transformer("", func(x pref.Descriptor) map[string]interface{} {
  327. out := make(map[string]interface{})
  328. v := reflect.ValueOf(x)
  329. for i := 0; i < v.NumMethod(); i++ {
  330. name := v.Type().Method(i).Name
  331. if m := v.Method(i); m.Type().NumIn() == 0 && m.Type().NumOut() == 1 {
  332. switch name {
  333. case "Index":
  334. // Ignore index since legacy descriptors have no parent.
  335. case "Options":
  336. // Ignore descriptor options since protos are not cmperable.
  337. case "Enums", "Messages", "Extensions":
  338. // Ignore nested message and enum declarations since
  339. // legacy descriptors are all created standalone.
  340. case "OneofType", "ExtendedType", "EnumType", "MessageType":
  341. // Avoid descending into a dependency to avoid a cycle.
  342. // Just record the full name if available.
  343. //
  344. // TODO: Cycle support in cmp would be useful here.
  345. v := m.Call(nil)[0]
  346. if !v.IsNil() {
  347. out[name] = v.Interface().(pref.Descriptor).FullName()
  348. }
  349. default:
  350. out[name] = m.Call(nil)[0].Interface()
  351. }
  352. }
  353. }
  354. return out
  355. }),
  356. cmp.Transformer("", func(v pref.Value) interface{} {
  357. return v.Interface()
  358. }),
  359. }
  360. for _, tt := range tests {
  361. t.Run(string(tt.want.FullName()), func(t *testing.T) {
  362. if diff := cmp.Diff(&tt.want, &tt.got, opts); diff != "" {
  363. t.Errorf("descriptor mismatch (-want, +got):\n%s", diff)
  364. }
  365. })
  366. }
  367. }
  368. type legacyTestMessage struct {
  369. XXX_unrecognized []byte
  370. protoV1.XXX_InternalExtensions
  371. }
  372. func (*legacyTestMessage) Reset() {}
  373. func (*legacyTestMessage) String() string { return "" }
  374. func (*legacyTestMessage) ProtoMessage() {}
  375. func (*legacyTestMessage) ExtensionRangeArray() []protoV1.ExtensionRange {
  376. return []protoV1.ExtensionRange{{Start: 10, End: 20}, {Start: 40, End: 80}, {Start: 10000, End: 20000}}
  377. }
  378. func TestLegacyUnknown(t *testing.T) {
  379. rawOf := func(toks ...pack.Token) pref.RawFields {
  380. return pref.RawFields(pack.Message(toks).Marshal())
  381. }
  382. raw1a := rawOf(pack.Tag{1, pack.VarintType}, pack.Svarint(-4321)) // 08c143
  383. raw1b := rawOf(pack.Tag{1, pack.Fixed32Type}, pack.Uint32(0xdeadbeef)) // 0defbeadde
  384. raw1c := rawOf(pack.Tag{1, pack.Fixed64Type}, pack.Float64(math.Pi)) // 09182d4454fb210940
  385. raw2a := rawOf(pack.Tag{2, pack.BytesType}, pack.String("hello, world!")) // 120d68656c6c6f2c20776f726c6421
  386. raw2b := rawOf(pack.Tag{2, pack.VarintType}, pack.Uvarint(1234)) // 10d209
  387. raw3a := rawOf(pack.Tag{3, pack.StartGroupType}, pack.Tag{3, pack.EndGroupType}) // 1b1c
  388. raw3b := rawOf(pack.Tag{3, pack.BytesType}, pack.Bytes("\xde\xad\xbe\xef")) // 1a04deadbeef
  389. raw1 := rawOf(pack.Tag{1, pack.BytesType}, pack.Bytes("1")) // 0a0131
  390. raw3 := rawOf(pack.Tag{3, pack.BytesType}, pack.Bytes("3")) // 1a0133
  391. raw10 := rawOf(pack.Tag{10, pack.BytesType}, pack.Bytes("10")) // 52023130 - extension
  392. raw15 := rawOf(pack.Tag{15, pack.BytesType}, pack.Bytes("15")) // 7a023135 - extension
  393. raw26 := rawOf(pack.Tag{26, pack.BytesType}, pack.Bytes("26")) // d201023236
  394. raw32 := rawOf(pack.Tag{32, pack.BytesType}, pack.Bytes("32")) // 8202023332
  395. raw45 := rawOf(pack.Tag{45, pack.BytesType}, pack.Bytes("45")) // ea02023435 - extension
  396. raw46 := rawOf(pack.Tag{45, pack.BytesType}, pack.Bytes("46")) // ea02023436 - extension
  397. raw47 := rawOf(pack.Tag{45, pack.BytesType}, pack.Bytes("47")) // ea02023437 - extension
  398. raw99 := rawOf(pack.Tag{99, pack.BytesType}, pack.Bytes("99")) // 9a06023939
  399. joinRaw := func(bs ...pref.RawFields) (out []byte) {
  400. for _, b := range bs {
  401. out = append(out, b...)
  402. }
  403. return out
  404. }
  405. m := new(legacyTestMessage)
  406. fs := MessageOf(m).UnknownFields()
  407. if got, want := fs.Len(), 0; got != want {
  408. t.Errorf("Len() = %d, want %d", got, want)
  409. }
  410. if got, want := m.XXX_unrecognized, joinRaw(); !bytes.Equal(got, want) {
  411. t.Errorf("data mismatch:\ngot: %x\nwant: %x", got, want)
  412. }
  413. fs.Set(1, raw1a)
  414. fs.Set(1, append(fs.Get(1), raw1b...))
  415. fs.Set(1, append(fs.Get(1), raw1c...))
  416. if got, want := fs.Len(), 1; got != want {
  417. t.Errorf("Len() = %d, want %d", got, want)
  418. }
  419. if got, want := m.XXX_unrecognized, joinRaw(raw1a, raw1b, raw1c); !bytes.Equal(got, want) {
  420. t.Errorf("data mismatch:\ngot: %x\nwant: %x", got, want)
  421. }
  422. fs.Set(2, raw2a)
  423. if got, want := fs.Len(), 2; got != want {
  424. t.Errorf("Len() = %d, want %d", got, want)
  425. }
  426. if got, want := m.XXX_unrecognized, joinRaw(raw1a, raw1b, raw1c, raw2a); !bytes.Equal(got, want) {
  427. t.Errorf("data mismatch:\ngot: %x\nwant: %x", got, want)
  428. }
  429. if got, want := fs.Get(1), joinRaw(raw1a, raw1b, raw1c); !bytes.Equal(got, want) {
  430. t.Errorf("Get(%d) = %x, want %x", 1, got, want)
  431. }
  432. if got, want := fs.Get(2), joinRaw(raw2a); !bytes.Equal(got, want) {
  433. t.Errorf("Get(%d) = %x, want %x", 2, got, want)
  434. }
  435. if got, want := fs.Get(3), joinRaw(); !bytes.Equal(got, want) {
  436. t.Errorf("Get(%d) = %x, want %x", 3, got, want)
  437. }
  438. fs.Set(1, nil) // remove field 1
  439. if got, want := fs.Len(), 1; got != want {
  440. t.Errorf("Len() = %d, want %d", got, want)
  441. }
  442. if got, want := m.XXX_unrecognized, joinRaw(raw2a); !bytes.Equal(got, want) {
  443. t.Errorf("data mismatch:\ngot: %x\nwant: %x", got, want)
  444. }
  445. // Simulate manual appending of raw field data.
  446. m.XXX_unrecognized = append(m.XXX_unrecognized, joinRaw(raw3a, raw1a, raw1b, raw2b, raw3b, raw1c)...)
  447. if got, want := fs.Len(), 3; got != want {
  448. t.Errorf("Len() = %d, want %d", got, want)
  449. }
  450. // Verify range iteration order.
  451. var i int
  452. want := []struct {
  453. num pref.FieldNumber
  454. raw pref.RawFields
  455. }{
  456. {2, joinRaw(raw2a, raw2b)},
  457. {3, joinRaw(raw3a, raw3b)},
  458. {1, joinRaw(raw1a, raw1b, raw1c)},
  459. }
  460. fs.Range(func(num pref.FieldNumber, raw pref.RawFields) bool {
  461. if i < len(want) {
  462. if num != want[i].num || !bytes.Equal(raw, want[i].raw) {
  463. t.Errorf("Range(%d) = (%d, %x), want (%d, %x)", i, num, raw, want[i].num, want[i].raw)
  464. }
  465. } else {
  466. t.Errorf("unexpected Range iteration: %d", i)
  467. }
  468. i++
  469. return true
  470. })
  471. fs.Set(2, fs.Get(2)) // moves field 2 to the end
  472. if got, want := fs.Len(), 3; got != want {
  473. t.Errorf("Len() = %d, want %d", got, want)
  474. }
  475. if got, want := m.XXX_unrecognized, joinRaw(raw3a, raw1a, raw1b, raw3b, raw1c, raw2a, raw2b); !bytes.Equal(got, want) {
  476. t.Errorf("data mismatch:\ngot: %x\nwant: %x", got, want)
  477. }
  478. fs.Set(1, nil) // remove field 1
  479. if got, want := fs.Len(), 2; got != want {
  480. t.Errorf("Len() = %d, want %d", got, want)
  481. }
  482. if got, want := m.XXX_unrecognized, joinRaw(raw3a, raw3b, raw2a, raw2b); !bytes.Equal(got, want) {
  483. t.Errorf("data mismatch:\ngot: %x\nwant: %x", got, want)
  484. }
  485. // Remove all fields.
  486. fs.Range(func(n pref.FieldNumber, b pref.RawFields) bool {
  487. fs.Set(n, nil)
  488. return true
  489. })
  490. if got, want := fs.Len(), 0; got != want {
  491. t.Errorf("Len() = %d, want %d", got, want)
  492. }
  493. if got, want := m.XXX_unrecognized, joinRaw(); !bytes.Equal(got, want) {
  494. t.Errorf("data mismatch:\ngot: %x\nwant: %x", got, want)
  495. }
  496. fs.Set(1, raw1)
  497. if got, want := fs.Len(), 1; got != want {
  498. t.Errorf("Len() = %d, want %d", got, want)
  499. }
  500. if got, want := m.XXX_unrecognized, joinRaw(raw1); !bytes.Equal(got, want) {
  501. t.Errorf("data mismatch:\ngot: %x\nwant: %x", got, want)
  502. }
  503. fs.Set(45, raw45)
  504. fs.Set(10, raw10) // extension
  505. fs.Set(32, raw32)
  506. fs.Set(1, nil) // deletion
  507. fs.Set(26, raw26)
  508. fs.Set(47, raw47) // extension
  509. fs.Set(46, raw46) // extension
  510. if got, want := fs.Len(), 6; got != want {
  511. t.Errorf("Len() = %d, want %d", got, want)
  512. }
  513. if got, want := m.XXX_unrecognized, joinRaw(raw32, raw26); !bytes.Equal(got, want) {
  514. t.Errorf("data mismatch:\ngot: %x\nwant: %x", got, want)
  515. }
  516. // Verify iteration order.
  517. i = 0
  518. want = []struct {
  519. num pref.FieldNumber
  520. raw pref.RawFields
  521. }{
  522. {32, raw32},
  523. {26, raw26},
  524. {10, raw10}, // extension
  525. {45, raw45}, // extension
  526. {46, raw46}, // extension
  527. {47, raw47}, // extension
  528. }
  529. fs.Range(func(num pref.FieldNumber, raw pref.RawFields) bool {
  530. if i < len(want) {
  531. if num != want[i].num || !bytes.Equal(raw, want[i].raw) {
  532. t.Errorf("Range(%d) = (%d, %x), want (%d, %x)", i, num, raw, want[i].num, want[i].raw)
  533. }
  534. } else {
  535. t.Errorf("unexpected Range iteration: %d", i)
  536. }
  537. i++
  538. return true
  539. })
  540. // Perform partial deletion while iterating.
  541. i = 0
  542. fs.Range(func(num pref.FieldNumber, raw pref.RawFields) bool {
  543. if i%2 == 0 {
  544. fs.Set(num, nil)
  545. }
  546. i++
  547. return true
  548. })
  549. if got, want := fs.Len(), 3; got != want {
  550. t.Errorf("Len() = %d, want %d", got, want)
  551. }
  552. if got, want := m.XXX_unrecognized, joinRaw(raw26); !bytes.Equal(got, want) {
  553. t.Errorf("data mismatch:\ngot: %x\nwant: %x", got, want)
  554. }
  555. fs.Set(15, raw15) // extension
  556. fs.Set(3, raw3)
  557. fs.Set(99, raw99)
  558. if got, want := fs.Len(), 6; got != want {
  559. t.Errorf("Len() = %d, want %d", got, want)
  560. }
  561. if got, want := m.XXX_unrecognized, joinRaw(raw26, raw3, raw99); !bytes.Equal(got, want) {
  562. t.Errorf("data mismatch:\ngot: %x\nwant: %x", got, want)
  563. }
  564. // Perform partial iteration.
  565. i = 0
  566. want = []struct {
  567. num pref.FieldNumber
  568. raw pref.RawFields
  569. }{
  570. {26, raw26},
  571. {3, raw3},
  572. }
  573. fs.Range(func(num pref.FieldNumber, raw pref.RawFields) bool {
  574. if i < len(want) {
  575. if num != want[i].num || !bytes.Equal(raw, want[i].raw) {
  576. t.Errorf("Range(%d) = (%d, %x), want (%d, %x)", i, num, raw, want[i].num, want[i].raw)
  577. }
  578. } else {
  579. t.Errorf("unexpected Range iteration: %d", i)
  580. }
  581. i++
  582. return i < 2
  583. })
  584. }
  585. func TestLegactExtensions(t *testing.T) {
  586. extensions := []pref.ExtensionType{
  587. legacyExtensionTypeOf(&protoV1.ExtensionDesc{
  588. ExtendedType: (*legacyTestMessage)(nil),
  589. ExtensionType: (*bool)(nil),
  590. Field: 10000,
  591. Name: "fizz.buzz.optional_bool",
  592. Tag: "varint,10000,opt,name=optional_bool,json=optionalBool,def=1",
  593. Filename: "fizz/buzz/test.proto",
  594. }),
  595. legacyExtensionTypeOf(&protoV1.ExtensionDesc{
  596. ExtendedType: (*legacyTestMessage)(nil),
  597. ExtensionType: (*int32)(nil),
  598. Field: 10001,
  599. Name: "fizz.buzz.optional_int32",
  600. Tag: "varint,10001,opt,name=optional_int32,json=optionalInt32,def=-12345",
  601. Filename: "fizz/buzz/test.proto",
  602. }),
  603. legacyExtensionTypeOf(&protoV1.ExtensionDesc{
  604. ExtendedType: (*legacyTestMessage)(nil),
  605. ExtensionType: (*uint32)(nil),
  606. Field: 10002,
  607. Name: "fizz.buzz.optional_uint32",
  608. Tag: "varint,10002,opt,name=optional_uint32,json=optionalUint32,def=3200",
  609. Filename: "fizz/buzz/test.proto",
  610. }),
  611. legacyExtensionTypeOf(&protoV1.ExtensionDesc{
  612. ExtendedType: (*legacyTestMessage)(nil),
  613. ExtensionType: (*float32)(nil),
  614. Field: 10003,
  615. Name: "fizz.buzz.optional_float",
  616. Tag: "fixed32,10003,opt,name=optional_float,json=optionalFloat,def=3.14159",
  617. Filename: "fizz/buzz/test.proto",
  618. }),
  619. legacyExtensionTypeOf(&protoV1.ExtensionDesc{
  620. ExtendedType: (*legacyTestMessage)(nil),
  621. ExtensionType: (*string)(nil),
  622. Field: 10004,
  623. Name: "fizz.buzz.optional_string",
  624. Tag: "bytes,10004,opt,name=optional_string,json=optionalString,def=hello, \"world!\"\n",
  625. Filename: "fizz/buzz/test.proto",
  626. }),
  627. legacyExtensionTypeOf(&protoV1.ExtensionDesc{
  628. ExtendedType: (*legacyTestMessage)(nil),
  629. ExtensionType: ([]byte)(nil),
  630. Field: 10005,
  631. Name: "fizz.buzz.optional_bytes",
  632. Tag: "bytes,10005,opt,name=optional_bytes,json=optionalBytes,def=dead\\336\\255\\276\\357beef",
  633. Filename: "fizz/buzz/test.proto",
  634. }),
  635. legacyExtensionTypeOf(&protoV1.ExtensionDesc{
  636. ExtendedType: (*legacyTestMessage)(nil),
  637. ExtensionType: (*proto2_20180125.Message_ChildEnum)(nil),
  638. Field: 10006,
  639. Name: "fizz.buzz.optional_enum_v1",
  640. Tag: "varint,10006,opt,name=optional_enum_v1,json=optionalEnumV1,enum=google.golang.org.proto2_20180125.Message_ChildEnum,def=0",
  641. Filename: "fizz/buzz/test.proto",
  642. }),
  643. legacyExtensionTypeOf(&protoV1.ExtensionDesc{
  644. ExtendedType: (*legacyTestMessage)(nil),
  645. ExtensionType: (*proto2_20180125.Message_ChildMessage)(nil),
  646. Field: 10007,
  647. Name: "fizz.buzz.optional_message_v1",
  648. Tag: "bytes,10007,opt,name=optional_message_v1,json=optionalMessageV1",
  649. Filename: "fizz/buzz/test.proto",
  650. }),
  651. legacyExtensionTypeOf(&protoV1.ExtensionDesc{
  652. ExtendedType: (*legacyTestMessage)(nil),
  653. ExtensionType: (*EnumProto2)(nil),
  654. Field: 10008,
  655. Name: "fizz.buzz.optional_enum_v2",
  656. Tag: "varint,10008,opt,name=optional_enum_v2,json=optionalEnumV2,enum=EnumProto2,def=57005",
  657. Filename: "fizz/buzz/test.proto",
  658. }),
  659. legacyExtensionTypeOf(&protoV1.ExtensionDesc{
  660. ExtendedType: (*legacyTestMessage)(nil),
  661. ExtensionType: (*EnumMessages)(nil),
  662. Field: 10009,
  663. Name: "fizz.buzz.optional_message_v2",
  664. Tag: "bytes,10009,opt,name=optional_message_v2,json=optionalMessageV2",
  665. Filename: "fizz/buzz/test.proto",
  666. }),
  667. legacyExtensionTypeOf(&protoV1.ExtensionDesc{
  668. ExtendedType: (*legacyTestMessage)(nil),
  669. ExtensionType: ([]bool)(nil),
  670. Field: 10010,
  671. Name: "fizz.buzz.repeated_bool",
  672. Tag: "varint,10010,rep,name=repeated_bool,json=repeatedBool",
  673. Filename: "fizz/buzz/test.proto",
  674. }),
  675. legacyExtensionTypeOf(&protoV1.ExtensionDesc{
  676. ExtendedType: (*legacyTestMessage)(nil),
  677. ExtensionType: ([]int32)(nil),
  678. Field: 10011,
  679. Name: "fizz.buzz.repeated_int32",
  680. Tag: "varint,10011,rep,name=repeated_int32,json=repeatedInt32",
  681. Filename: "fizz/buzz/test.proto",
  682. }),
  683. legacyExtensionTypeOf(&protoV1.ExtensionDesc{
  684. ExtendedType: (*legacyTestMessage)(nil),
  685. ExtensionType: ([]uint32)(nil),
  686. Field: 10012,
  687. Name: "fizz.buzz.repeated_uint32",
  688. Tag: "varint,10012,rep,name=repeated_uint32,json=repeatedUint32",
  689. Filename: "fizz/buzz/test.proto",
  690. }),
  691. legacyExtensionTypeOf(&protoV1.ExtensionDesc{
  692. ExtendedType: (*legacyTestMessage)(nil),
  693. ExtensionType: ([]float32)(nil),
  694. Field: 10013,
  695. Name: "fizz.buzz.repeated_float",
  696. Tag: "fixed32,10013,rep,name=repeated_float,json=repeatedFloat",
  697. Filename: "fizz/buzz/test.proto",
  698. }),
  699. legacyExtensionTypeOf(&protoV1.ExtensionDesc{
  700. ExtendedType: (*legacyTestMessage)(nil),
  701. ExtensionType: ([]string)(nil),
  702. Field: 10014,
  703. Name: "fizz.buzz.repeated_string",
  704. Tag: "bytes,10014,rep,name=repeated_string,json=repeatedString",
  705. Filename: "fizz/buzz/test.proto",
  706. }),
  707. legacyExtensionTypeOf(&protoV1.ExtensionDesc{
  708. ExtendedType: (*legacyTestMessage)(nil),
  709. ExtensionType: ([][]byte)(nil),
  710. Field: 10015,
  711. Name: "fizz.buzz.repeated_bytes",
  712. Tag: "bytes,10015,rep,name=repeated_bytes,json=repeatedBytes",
  713. Filename: "fizz/buzz/test.proto",
  714. }),
  715. legacyExtensionTypeOf(&protoV1.ExtensionDesc{
  716. ExtendedType: (*legacyTestMessage)(nil),
  717. ExtensionType: ([]proto2_20180125.Message_ChildEnum)(nil),
  718. Field: 10016,
  719. Name: "fizz.buzz.repeated_enum_v1",
  720. Tag: "varint,10016,rep,name=repeated_enum_v1,json=repeatedEnumV1,enum=google.golang.org.proto2_20180125.Message_ChildEnum",
  721. Filename: "fizz/buzz/test.proto",
  722. }),
  723. legacyExtensionTypeOf(&protoV1.ExtensionDesc{
  724. ExtendedType: (*legacyTestMessage)(nil),
  725. ExtensionType: ([]*proto2_20180125.Message_ChildMessage)(nil),
  726. Field: 10017,
  727. Name: "fizz.buzz.repeated_message_v1",
  728. Tag: "bytes,10017,rep,name=repeated_message_v1,json=repeatedMessageV1",
  729. Filename: "fizz/buzz/test.proto",
  730. }),
  731. legacyExtensionTypeOf(&protoV1.ExtensionDesc{
  732. ExtendedType: (*legacyTestMessage)(nil),
  733. ExtensionType: ([]EnumProto2)(nil),
  734. Field: 10018,
  735. Name: "fizz.buzz.repeated_enum_v2",
  736. Tag: "varint,10018,rep,name=repeated_enum_v2,json=repeatedEnumV2,enum=EnumProto2",
  737. Filename: "fizz/buzz/test.proto",
  738. }),
  739. legacyExtensionTypeOf(&protoV1.ExtensionDesc{
  740. ExtendedType: (*legacyTestMessage)(nil),
  741. ExtensionType: ([]*EnumMessages)(nil),
  742. Field: 10019,
  743. Name: "fizz.buzz.repeated_message_v2",
  744. Tag: "bytes,10019,rep,name=repeated_message_v2,json=repeatedMessageV2",
  745. Filename: "fizz/buzz/test.proto",
  746. }),
  747. }
  748. opts := cmp.Options{cmp.Comparer(func(x, y *proto2_20180125.Message_ChildMessage) bool {
  749. return x == y // pointer compare messages for object identity
  750. })}
  751. m := new(legacyTestMessage)
  752. fs := MessageOf(m).KnownFields()
  753. ts := fs.ExtensionTypes()
  754. if n := fs.Len(); n != 0 {
  755. t.Errorf("KnownFields.Len() = %v, want 0", n)
  756. }
  757. if n := ts.Len(); n != 0 {
  758. t.Errorf("ExtensionFieldTypes.Len() = %v, want 0", n)
  759. }
  760. // Register all the extension types.
  761. for _, xt := range extensions {
  762. ts.Register(xt)
  763. }
  764. // Check that getting the zero value returns the default value for scalars,
  765. // nil for singular messages, and an empty list for repeated fields.
  766. defaultValues := []interface{}{
  767. bool(true),
  768. int32(-12345),
  769. uint32(3200),
  770. float32(3.14159),
  771. string("hello, \"world!\"\n"),
  772. []byte("dead\xde\xad\xbe\xefbeef"),
  773. proto2_20180125.Message_ALPHA,
  774. nil,
  775. EnumProto2(0xdead),
  776. nil,
  777. new([]bool),
  778. new([]int32),
  779. new([]uint32),
  780. new([]float32),
  781. new([]string),
  782. new([][]byte),
  783. new([]proto2_20180125.Message_ChildEnum),
  784. new([]*proto2_20180125.Message_ChildMessage),
  785. new([]EnumProto2),
  786. new([]*EnumMessages),
  787. }
  788. for i, xt := range extensions {
  789. var got interface{}
  790. if v := fs.Get(xt.Number()); v.IsValid() {
  791. got = xt.InterfaceOf(v)
  792. }
  793. want := defaultValues[i]
  794. if diff := cmp.Diff(want, got, opts); diff != "" {
  795. t.Errorf("KnownFields.Get(%d) mismatch (-want +got):\n%v", xt.Number(), diff)
  796. }
  797. }
  798. // All fields should be unpopulated.
  799. for _, xt := range extensions {
  800. if fs.Has(xt.Number()) {
  801. t.Errorf("KnownFields.Has(%d) = true, want false", xt.Number())
  802. }
  803. }
  804. // Set some values and append to values to the lists.
  805. m1a := &proto2_20180125.Message_ChildMessage{F1: scalar.String("m1a")}
  806. m1b := &proto2_20180125.Message_ChildMessage{F1: scalar.String("m2b")}
  807. m2a := &EnumMessages{EnumP2: EnumProto2(0x1b).Enum()}
  808. m2b := &EnumMessages{EnumP2: EnumProto2(0x2b).Enum()}
  809. setValues := []interface{}{
  810. bool(false),
  811. int32(-54321),
  812. uint32(6400),
  813. float32(2.71828),
  814. string("goodbye, \"world!\"\n"),
  815. []byte("live\xde\xad\xbe\xefchicken"),
  816. proto2_20180125.Message_CHARLIE,
  817. m1a,
  818. EnumProto2(0xbeef),
  819. m2a,
  820. &[]bool{true},
  821. &[]int32{-1000},
  822. &[]uint32{1280},
  823. &[]float32{1.6180},
  824. &[]string{"zero"},
  825. &[][]byte{[]byte("zero")},
  826. &[]proto2_20180125.Message_ChildEnum{proto2_20180125.Message_BRAVO},
  827. &[]*proto2_20180125.Message_ChildMessage{m1b},
  828. &[]EnumProto2{0xdead},
  829. &[]*EnumMessages{m2b},
  830. }
  831. for i, xt := range extensions {
  832. fs.Set(xt.Number(), xt.ValueOf(setValues[i]))
  833. }
  834. for i, xt := range extensions[len(extensions)/2:] {
  835. v := extensions[i].ValueOf(setValues[i])
  836. fs.Get(xt.Number()).List().Append(v)
  837. }
  838. // Get the values and check for equality.
  839. getValues := []interface{}{
  840. bool(false),
  841. int32(-54321),
  842. uint32(6400),
  843. float32(2.71828),
  844. string("goodbye, \"world!\"\n"),
  845. []byte("live\xde\xad\xbe\xefchicken"),
  846. proto2_20180125.Message_ChildEnum(proto2_20180125.Message_CHARLIE),
  847. m1a,
  848. EnumProto2(0xbeef),
  849. m2a,
  850. &[]bool{true, false},
  851. &[]int32{-1000, -54321},
  852. &[]uint32{1280, 6400},
  853. &[]float32{1.6180, 2.71828},
  854. &[]string{"zero", "goodbye, \"world!\"\n"},
  855. &[][]byte{[]byte("zero"), []byte("live\xde\xad\xbe\xefchicken")},
  856. &[]proto2_20180125.Message_ChildEnum{proto2_20180125.Message_BRAVO, proto2_20180125.Message_CHARLIE},
  857. &[]*proto2_20180125.Message_ChildMessage{m1b, m1a},
  858. &[]EnumProto2{0xdead, 0xbeef},
  859. &[]*EnumMessages{m2b, m2a},
  860. }
  861. for i, xt := range extensions {
  862. got := xt.InterfaceOf(fs.Get(xt.Number()))
  863. want := getValues[i]
  864. if diff := cmp.Diff(want, got, opts); diff != "" {
  865. t.Errorf("KnownFields.Get(%d) mismatch (-want +got):\n%v", xt.Number(), diff)
  866. }
  867. }
  868. if n := fs.Len(); n != 20 {
  869. t.Errorf("KnownFields.Len() = %v, want 0", n)
  870. }
  871. if n := ts.Len(); n != 20 {
  872. t.Errorf("ExtensionFieldTypes.Len() = %v, want 20", n)
  873. }
  874. // Clear the field for all extension types.
  875. for _, xt := range extensions[:len(extensions)/2] {
  876. fs.Clear(xt.Number())
  877. }
  878. for i, xt := range extensions[len(extensions)/2:] {
  879. if i%2 == 0 {
  880. fs.Clear(xt.Number())
  881. } else {
  882. fs.Get(xt.Number()).List().Truncate(0)
  883. }
  884. }
  885. if n := fs.Len(); n != 0 {
  886. t.Errorf("KnownFields.Len() = %v, want 0", n)
  887. }
  888. if n := ts.Len(); n != 20 {
  889. t.Errorf("ExtensionFieldTypes.Len() = %v, want 20", n)
  890. }
  891. // De-register all extension types.
  892. for _, xt := range extensions {
  893. ts.Remove(xt)
  894. }
  895. if n := fs.Len(); n != 0 {
  896. t.Errorf("KnownFields.Len() = %v, want 0", n)
  897. }
  898. if n := ts.Len(); n != 0 {
  899. t.Errorf("ExtensionFieldTypes.Len() = %v, want 0", n)
  900. }
  901. }