decode_test.go 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459
  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 textpb_test
  5. import (
  6. "math"
  7. "testing"
  8. protoV1 "github.com/golang/protobuf/proto"
  9. "github.com/golang/protobuf/protoapi"
  10. "github.com/golang/protobuf/v2/encoding/textpb"
  11. "github.com/golang/protobuf/v2/internal/legacy"
  12. "github.com/golang/protobuf/v2/internal/scalar"
  13. "github.com/golang/protobuf/v2/proto"
  14. preg "github.com/golang/protobuf/v2/reflect/protoregistry"
  15. "github.com/golang/protobuf/v2/encoding/testprotos/pb2"
  16. "github.com/golang/protobuf/v2/encoding/testprotos/pb3"
  17. knownpb "github.com/golang/protobuf/v2/types/known"
  18. )
  19. func init() {
  20. // TODO: remove these registerExtension calls when generated code registers
  21. // to V2 global registry.
  22. registerExtension(pb2.E_OptExtBool)
  23. registerExtension(pb2.E_OptExtString)
  24. registerExtension(pb2.E_OptExtEnum)
  25. registerExtension(pb2.E_OptExtNested)
  26. registerExtension(pb2.E_RptExtFixed32)
  27. registerExtension(pb2.E_RptExtEnum)
  28. registerExtension(pb2.E_RptExtNested)
  29. registerExtension(pb2.E_ExtensionsContainer_OptExtBool)
  30. registerExtension(pb2.E_ExtensionsContainer_OptExtString)
  31. registerExtension(pb2.E_ExtensionsContainer_OptExtEnum)
  32. registerExtension(pb2.E_ExtensionsContainer_OptExtNested)
  33. registerExtension(pb2.E_ExtensionsContainer_RptExtString)
  34. registerExtension(pb2.E_ExtensionsContainer_RptExtEnum)
  35. registerExtension(pb2.E_ExtensionsContainer_RptExtNested)
  36. registerExtension(pb2.E_MessageSetExtension)
  37. registerExtension(pb2.E_MessageSetExtension_MessageSetExtension)
  38. registerExtension(pb2.E_MessageSetExtension_NotMessageSetExtension)
  39. registerExtension(pb2.E_MessageSetExtension_ExtNested)
  40. registerExtension(pb2.E_FakeMessageSetExtension_MessageSetExtension)
  41. }
  42. func registerExtension(xd *protoapi.ExtensionDesc) {
  43. xt := legacy.Export{}.ExtensionTypeFromDesc(xd)
  44. preg.GlobalTypes.Register(xt)
  45. }
  46. func TestUnmarshal(t *testing.T) {
  47. tests := []struct {
  48. desc string
  49. umo textpb.UnmarshalOptions
  50. inputMessage proto.Message
  51. inputText string
  52. wantMessage proto.Message
  53. wantErr bool
  54. }{{
  55. desc: "proto2 empty message",
  56. inputMessage: &pb2.Scalars{},
  57. wantMessage: &pb2.Scalars{},
  58. }, {
  59. desc: "proto2 optional scalars set to zero values",
  60. inputMessage: &pb2.Scalars{},
  61. inputText: `opt_bool: false
  62. opt_int32: 0
  63. opt_int64: 0
  64. opt_uint32: 0
  65. opt_uint64: 0
  66. opt_sint32: 0
  67. opt_sint64: 0
  68. opt_fixed32: 0
  69. opt_fixed64: 0
  70. opt_sfixed32: 0
  71. opt_sfixed64: 0
  72. opt_float: 0
  73. opt_double: 0
  74. opt_bytes: ""
  75. opt_string: ""
  76. `,
  77. wantMessage: &pb2.Scalars{
  78. OptBool: scalar.Bool(false),
  79. OptInt32: scalar.Int32(0),
  80. OptInt64: scalar.Int64(0),
  81. OptUint32: scalar.Uint32(0),
  82. OptUint64: scalar.Uint64(0),
  83. OptSint32: scalar.Int32(0),
  84. OptSint64: scalar.Int64(0),
  85. OptFixed32: scalar.Uint32(0),
  86. OptFixed64: scalar.Uint64(0),
  87. OptSfixed32: scalar.Int32(0),
  88. OptSfixed64: scalar.Int64(0),
  89. OptFloat: scalar.Float32(0),
  90. OptDouble: scalar.Float64(0),
  91. OptBytes: []byte{},
  92. OptString: scalar.String(""),
  93. },
  94. }, {
  95. desc: "proto3 scalars set to zero values",
  96. inputMessage: &pb3.Scalars{},
  97. inputText: `s_bool: false
  98. s_int32: 0
  99. s_int64: 0
  100. s_uint32: 0
  101. s_uint64: 0
  102. s_sint32: 0
  103. s_sint64: 0
  104. s_fixed32: 0
  105. s_fixed64: 0
  106. s_sfixed32: 0
  107. s_sfixed64: 0
  108. s_float: 0
  109. s_double: 0
  110. s_bytes: ""
  111. s_string: ""
  112. `,
  113. wantMessage: &pb3.Scalars{},
  114. }, {
  115. desc: "proto2 optional scalars",
  116. inputMessage: &pb2.Scalars{},
  117. inputText: `opt_bool: true
  118. opt_int32: 255
  119. opt_int64: 3735928559
  120. opt_uint32: 0xff
  121. opt_uint64: 0xdeadbeef
  122. opt_sint32: -1001
  123. opt_sint64: -0xffff
  124. opt_fixed64: 64
  125. opt_sfixed32: -32
  126. opt_float: 1.234
  127. opt_double: 1.23e+100
  128. opt_bytes: "\xe8\xb0\xb7\xe6\xad\x8c"
  129. opt_string: "谷歌"
  130. `,
  131. wantMessage: &pb2.Scalars{
  132. OptBool: scalar.Bool(true),
  133. OptInt32: scalar.Int32(0xff),
  134. OptInt64: scalar.Int64(0xdeadbeef),
  135. OptUint32: scalar.Uint32(0xff),
  136. OptUint64: scalar.Uint64(0xdeadbeef),
  137. OptSint32: scalar.Int32(-1001),
  138. OptSint64: scalar.Int64(-0xffff),
  139. OptFixed64: scalar.Uint64(64),
  140. OptSfixed32: scalar.Int32(-32),
  141. OptFloat: scalar.Float32(1.234),
  142. OptDouble: scalar.Float64(1.23e100),
  143. OptBytes: []byte("\xe8\xb0\xb7\xe6\xad\x8c"),
  144. OptString: scalar.String("谷歌"),
  145. },
  146. }, {
  147. desc: "proto3 scalars",
  148. inputMessage: &pb3.Scalars{},
  149. inputText: `s_bool: true
  150. s_int32: 255
  151. s_int64: 3735928559
  152. s_uint32: 0xff
  153. s_uint64: 0xdeadbeef
  154. s_sint32: -1001
  155. s_sint64: -0xffff
  156. s_fixed64: 64
  157. s_sfixed32: -32
  158. s_float: 1.234
  159. s_double: 1.23e+100
  160. s_bytes: "\xe8\xb0\xb7\xe6\xad\x8c"
  161. s_string: "谷歌"
  162. `,
  163. wantMessage: &pb3.Scalars{
  164. SBool: true,
  165. SInt32: 0xff,
  166. SInt64: 0xdeadbeef,
  167. SUint32: 0xff,
  168. SUint64: 0xdeadbeef,
  169. SSint32: -1001,
  170. SSint64: -0xffff,
  171. SFixed64: 64,
  172. SSfixed32: -32,
  173. SFloat: 1.234,
  174. SDouble: 1.23e100,
  175. SBytes: []byte("\xe8\xb0\xb7\xe6\xad\x8c"),
  176. SString: "谷歌",
  177. },
  178. }, {
  179. desc: "proto2 message contains unknown field",
  180. inputMessage: &pb2.Scalars{},
  181. inputText: "unknown_field: 123",
  182. wantErr: true,
  183. }, {
  184. desc: "proto3 message contains unknown field",
  185. inputMessage: &pb3.Scalars{},
  186. inputText: "unknown_field: 456",
  187. wantErr: true,
  188. }, {
  189. desc: "proto2 numeric key field",
  190. inputMessage: &pb2.Scalars{},
  191. inputText: "1: true",
  192. wantErr: true,
  193. }, {
  194. desc: "proto3 numeric key field",
  195. inputMessage: &pb3.Scalars{},
  196. inputText: "1: true",
  197. wantErr: true,
  198. }, {
  199. desc: "invalid bool value",
  200. inputMessage: &pb3.Scalars{},
  201. inputText: "s_bool: 123",
  202. wantErr: true,
  203. }, {
  204. desc: "invalid int32 value",
  205. inputMessage: &pb3.Scalars{},
  206. inputText: "s_int32: not_a_num",
  207. wantErr: true,
  208. }, {
  209. desc: "invalid int64 value",
  210. inputMessage: &pb3.Scalars{},
  211. inputText: "s_int64: 'not a num either'",
  212. wantErr: true,
  213. }, {
  214. desc: "invalid uint32 value",
  215. inputMessage: &pb3.Scalars{},
  216. inputText: "s_fixed32: -42",
  217. wantErr: true,
  218. }, {
  219. desc: "invalid uint64 value",
  220. inputMessage: &pb3.Scalars{},
  221. inputText: "s_uint64: -47",
  222. wantErr: true,
  223. }, {
  224. desc: "invalid sint32 value",
  225. inputMessage: &pb3.Scalars{},
  226. inputText: "s_sint32: '42'",
  227. wantErr: true,
  228. }, {
  229. desc: "invalid sint64 value",
  230. inputMessage: &pb3.Scalars{},
  231. inputText: "s_sint64: '-47'",
  232. wantErr: true,
  233. }, {
  234. desc: "invalid fixed32 value",
  235. inputMessage: &pb3.Scalars{},
  236. inputText: "s_fixed32: -42",
  237. wantErr: true,
  238. }, {
  239. desc: "invalid fixed64 value",
  240. inputMessage: &pb3.Scalars{},
  241. inputText: "s_fixed64: -42",
  242. wantErr: true,
  243. }, {
  244. desc: "invalid sfixed32 value",
  245. inputMessage: &pb3.Scalars{},
  246. inputText: "s_sfixed32: 'not valid'",
  247. wantErr: true,
  248. }, {
  249. desc: "invalid sfixed64 value",
  250. inputMessage: &pb3.Scalars{},
  251. inputText: "s_sfixed64: bad",
  252. wantErr: true,
  253. }, {
  254. desc: "float positive infinity",
  255. inputMessage: &pb3.Scalars{},
  256. inputText: "s_float: inf",
  257. wantMessage: &pb3.Scalars{
  258. SFloat: float32(math.Inf(1)),
  259. },
  260. }, {
  261. desc: "float negative infinity",
  262. inputMessage: &pb3.Scalars{},
  263. inputText: "s_float: -inf",
  264. wantMessage: &pb3.Scalars{
  265. SFloat: float32(math.Inf(-1)),
  266. },
  267. }, {
  268. desc: "double positive infinity",
  269. inputMessage: &pb3.Scalars{},
  270. inputText: "s_double: inf",
  271. wantMessage: &pb3.Scalars{
  272. SDouble: math.Inf(1),
  273. },
  274. }, {
  275. desc: "double negative infinity",
  276. inputMessage: &pb3.Scalars{},
  277. inputText: "s_double: -inf",
  278. wantMessage: &pb3.Scalars{
  279. SDouble: math.Inf(-1),
  280. },
  281. }, {
  282. desc: "invalid string value",
  283. inputMessage: &pb3.Scalars{},
  284. inputText: "s_string: invalid_string",
  285. wantErr: true,
  286. }, {
  287. desc: "proto2 bytes set to empty string",
  288. inputMessage: &pb2.Scalars{},
  289. inputText: "opt_bytes: ''",
  290. wantMessage: &pb2.Scalars{
  291. OptBytes: []byte(""),
  292. },
  293. }, {
  294. desc: "proto3 bytes set to empty string",
  295. inputMessage: &pb3.Scalars{},
  296. inputText: "s_bytes: ''",
  297. wantMessage: &pb3.Scalars{},
  298. }, {
  299. desc: "proto2 duplicate singular field",
  300. inputMessage: &pb2.Scalars{},
  301. inputText: `
  302. opt_bool: true
  303. opt_bool: false
  304. `,
  305. wantErr: true,
  306. }, {
  307. desc: "proto2 more duplicate singular field",
  308. inputMessage: &pb2.Scalars{},
  309. inputText: `
  310. opt_bool: true
  311. opt_string: "hello"
  312. opt_bool: false
  313. `,
  314. wantErr: true,
  315. }, {
  316. desc: "proto2 invalid singular field",
  317. inputMessage: &pb2.Scalars{},
  318. inputText: `
  319. opt_bool: [true, false]
  320. `,
  321. wantErr: true,
  322. }, {
  323. desc: "proto3 duplicate singular field",
  324. inputMessage: &pb3.Scalars{},
  325. inputText: `
  326. s_bool: false
  327. s_bool: true
  328. `,
  329. wantErr: true,
  330. }, {
  331. desc: "proto3 more duplicate singular field",
  332. inputMessage: &pb3.Scalars{},
  333. inputText: `
  334. s_bool: false
  335. s_string: ""
  336. s_bool: true
  337. `,
  338. wantErr: true,
  339. }, {
  340. desc: "proto2 enum",
  341. inputMessage: &pb2.Enums{},
  342. inputText: `
  343. opt_enum: ONE
  344. opt_nested_enum: UNO
  345. `,
  346. wantMessage: &pb2.Enums{
  347. OptEnum: pb2.Enum_ONE.Enum(),
  348. OptNestedEnum: pb2.Enums_UNO.Enum(),
  349. },
  350. }, {
  351. desc: "proto2 enum set to numeric values",
  352. inputMessage: &pb2.Enums{},
  353. inputText: `
  354. opt_enum: 2
  355. opt_nested_enum: 2
  356. `,
  357. wantMessage: &pb2.Enums{
  358. OptEnum: pb2.Enum_TWO.Enum(),
  359. OptNestedEnum: pb2.Enums_DOS.Enum(),
  360. },
  361. }, {
  362. desc: "proto2 enum set to unnamed numeric values",
  363. inputMessage: &pb2.Enums{},
  364. inputText: `
  365. opt_enum: 101
  366. opt_nested_enum: -101
  367. `,
  368. wantMessage: &pb2.Enums{
  369. OptEnum: pb2Enum(101),
  370. OptNestedEnum: pb2Enums_NestedEnum(-101),
  371. },
  372. }, {
  373. desc: "proto2 enum set to invalid named",
  374. inputMessage: &pb2.Enums{},
  375. inputText: `
  376. opt_enum: UNNAMED
  377. opt_nested_enum: UNNAMED_TOO
  378. `,
  379. wantErr: true,
  380. }, {
  381. desc: "proto3 enum name value",
  382. inputMessage: &pb3.Enums{},
  383. inputText: `
  384. s_enum: ONE
  385. s_nested_enum: DIEZ
  386. `,
  387. wantMessage: &pb3.Enums{
  388. SEnum: pb3.Enum_ONE,
  389. SNestedEnum: pb3.Enums_DIEZ,
  390. },
  391. }, {
  392. desc: "proto3 enum numeric value",
  393. inputMessage: &pb3.Enums{},
  394. inputText: `
  395. s_enum: 2
  396. s_nested_enum: 2
  397. `,
  398. wantMessage: &pb3.Enums{
  399. SEnum: pb3.Enum_TWO,
  400. SNestedEnum: pb3.Enums_DOS,
  401. },
  402. }, {
  403. desc: "proto3 enum unnamed numeric value",
  404. inputMessage: &pb3.Enums{},
  405. inputText: `
  406. s_enum: 0x7fffffff
  407. s_nested_enum: -0x80000000
  408. `,
  409. wantMessage: &pb3.Enums{
  410. SEnum: 0x7fffffff,
  411. SNestedEnum: -0x80000000,
  412. },
  413. }, {
  414. desc: "proto2 nested empty messages",
  415. inputMessage: &pb2.Nests{},
  416. inputText: `
  417. opt_nested: {}
  418. OptGroup: {}
  419. `,
  420. wantMessage: &pb2.Nests{
  421. OptNested: &pb2.Nested{},
  422. Optgroup: &pb2.Nests_OptGroup{},
  423. },
  424. }, {
  425. desc: "proto2 nested messages",
  426. inputMessage: &pb2.Nests{},
  427. inputText: `
  428. opt_nested: {
  429. opt_string: "nested message"
  430. opt_nested: {
  431. opt_string: "another nested message"
  432. }
  433. }
  434. `,
  435. wantMessage: &pb2.Nests{
  436. OptNested: &pb2.Nested{
  437. OptString: scalar.String("nested message"),
  438. OptNested: &pb2.Nested{
  439. OptString: scalar.String("another nested message"),
  440. },
  441. },
  442. },
  443. }, {
  444. desc: "proto3 nested empty message",
  445. inputMessage: &pb3.Nests{},
  446. inputText: "s_nested: {}",
  447. wantMessage: &pb3.Nests{
  448. SNested: &pb3.Nested{},
  449. },
  450. }, {
  451. desc: "proto3 nested message",
  452. inputMessage: &pb3.Nests{},
  453. inputText: `
  454. s_nested: {
  455. s_string: "nested message"
  456. s_nested: {
  457. s_string: "another nested message"
  458. }
  459. }
  460. `,
  461. wantMessage: &pb3.Nests{
  462. SNested: &pb3.Nested{
  463. SString: "nested message",
  464. SNested: &pb3.Nested{
  465. SString: "another nested message",
  466. },
  467. },
  468. },
  469. }, {
  470. desc: "oneof set to empty string",
  471. inputMessage: &pb3.Oneofs{},
  472. inputText: "oneof_string: ''",
  473. wantMessage: &pb3.Oneofs{
  474. Union: &pb3.Oneofs_OneofString{},
  475. },
  476. }, {
  477. desc: "oneof set to string",
  478. inputMessage: &pb3.Oneofs{},
  479. inputText: "oneof_string: 'hello'",
  480. wantMessage: &pb3.Oneofs{
  481. Union: &pb3.Oneofs_OneofString{
  482. OneofString: "hello",
  483. },
  484. },
  485. }, {
  486. desc: "oneof set to enum",
  487. inputMessage: &pb3.Oneofs{},
  488. inputText: "oneof_enum: TEN",
  489. wantMessage: &pb3.Oneofs{
  490. Union: &pb3.Oneofs_OneofEnum{
  491. OneofEnum: pb3.Enum_TEN,
  492. },
  493. },
  494. }, {
  495. desc: "oneof set to empty message",
  496. inputMessage: &pb3.Oneofs{},
  497. inputText: "oneof_nested: {}",
  498. wantMessage: &pb3.Oneofs{
  499. Union: &pb3.Oneofs_OneofNested{
  500. OneofNested: &pb3.Nested{},
  501. },
  502. },
  503. }, {
  504. desc: "oneof set to message",
  505. inputMessage: &pb3.Oneofs{},
  506. inputText: `
  507. oneof_nested: {
  508. s_string: "nested message"
  509. }
  510. `,
  511. wantMessage: &pb3.Oneofs{
  512. Union: &pb3.Oneofs_OneofNested{
  513. OneofNested: &pb3.Nested{
  514. SString: "nested message",
  515. },
  516. },
  517. },
  518. }, {
  519. desc: "oneof set to last value",
  520. inputMessage: &pb3.Oneofs{},
  521. inputText: `
  522. oneof_nested: {
  523. s_string: "nested message"
  524. }
  525. oneof_enum: TEN
  526. oneof_string: "wins"
  527. `,
  528. wantMessage: &pb3.Oneofs{
  529. Union: &pb3.Oneofs_OneofString{
  530. OneofString: "wins",
  531. },
  532. },
  533. }, {
  534. desc: "repeated scalar using same field name",
  535. inputMessage: &pb2.Repeats{},
  536. inputText: `
  537. rpt_string: "a"
  538. rpt_string: "b"
  539. rpt_int32: 0xff
  540. rpt_float: 1.23
  541. rpt_bytes: "bytes"
  542. `,
  543. wantMessage: &pb2.Repeats{
  544. RptString: []string{"a", "b"},
  545. RptInt32: []int32{0xff},
  546. RptFloat: []float32{1.23},
  547. RptBytes: [][]byte{[]byte("bytes")},
  548. },
  549. }, {
  550. desc: "repeated using mix of [] and repeated field name",
  551. inputMessage: &pb2.Repeats{},
  552. inputText: `
  553. rpt_string: "a"
  554. rpt_bool: true
  555. rpt_string: ["x", "y"]
  556. rpt_bool: [ false, true ]
  557. rpt_string: "b"
  558. `,
  559. wantMessage: &pb2.Repeats{
  560. RptString: []string{"a", "x", "y", "b"},
  561. RptBool: []bool{true, false, true},
  562. },
  563. }, {
  564. desc: "repeated enums",
  565. inputMessage: &pb2.Enums{},
  566. inputText: `
  567. rpt_enum: TEN
  568. rpt_enum: 1
  569. rpt_nested_enum: [DOS, 2]
  570. rpt_enum: 42
  571. rpt_nested_enum: -47
  572. `,
  573. wantMessage: &pb2.Enums{
  574. RptEnum: []pb2.Enum{pb2.Enum_TEN, pb2.Enum_ONE, 42},
  575. RptNestedEnum: []pb2.Enums_NestedEnum{pb2.Enums_DOS, pb2.Enums_DOS, -47},
  576. },
  577. }, {
  578. desc: "repeated nested messages",
  579. inputMessage: &pb2.Nests{},
  580. inputText: `
  581. rpt_nested: {
  582. opt_string: "repeat nested one"
  583. }
  584. rpt_nested: {
  585. opt_string: "repeat nested two"
  586. opt_nested: {
  587. opt_string: "inside repeat nested two"
  588. }
  589. }
  590. rpt_nested: {}
  591. `,
  592. wantMessage: &pb2.Nests{
  593. RptNested: []*pb2.Nested{
  594. {
  595. OptString: scalar.String("repeat nested one"),
  596. },
  597. {
  598. OptString: scalar.String("repeat nested two"),
  599. OptNested: &pb2.Nested{
  600. OptString: scalar.String("inside repeat nested two"),
  601. },
  602. },
  603. {},
  604. },
  605. },
  606. }, {
  607. desc: "repeated group fields",
  608. inputMessage: &pb2.Nests{},
  609. inputText: `
  610. RptGroup: {
  611. rpt_string: "hello"
  612. rpt_string: "world"
  613. }
  614. RptGroup: {}
  615. `,
  616. wantMessage: &pb2.Nests{
  617. Rptgroup: []*pb2.Nests_RptGroup{
  618. {
  619. RptString: []string{"hello", "world"},
  620. },
  621. {},
  622. },
  623. },
  624. }, {
  625. desc: "map fields 1",
  626. inputMessage: &pb3.Maps{},
  627. inputText: `
  628. int32_to_str: {
  629. key: -101
  630. value: "-101"
  631. }
  632. int32_to_str: {
  633. key: 0
  634. value: "zero"
  635. }
  636. bool_to_uint32: {
  637. key: false
  638. value: 101
  639. }
  640. int32_to_str: {
  641. key: 255
  642. value: "0xff"
  643. }
  644. bool_to_uint32: {
  645. key: true
  646. value: 42
  647. }
  648. `,
  649. wantMessage: &pb3.Maps{
  650. Int32ToStr: map[int32]string{
  651. -101: "-101",
  652. 0xff: "0xff",
  653. 0: "zero",
  654. },
  655. BoolToUint32: map[bool]uint32{
  656. true: 42,
  657. false: 101,
  658. },
  659. },
  660. }, {
  661. desc: "map fields 2",
  662. inputMessage: &pb3.Maps{},
  663. inputText: `
  664. uint64_to_enum: {
  665. key: 1
  666. value: ONE
  667. }
  668. uint64_to_enum: {
  669. key: 2
  670. value: 2
  671. }
  672. uint64_to_enum: {
  673. key: 10
  674. value: 101
  675. }
  676. `,
  677. wantMessage: &pb3.Maps{
  678. Uint64ToEnum: map[uint64]pb3.Enum{
  679. 1: pb3.Enum_ONE,
  680. 2: pb3.Enum_TWO,
  681. 10: 101,
  682. },
  683. },
  684. }, {
  685. desc: "map fields 3",
  686. inputMessage: &pb3.Maps{},
  687. inputText: `
  688. str_to_nested: {
  689. key: "nested_one"
  690. value: {
  691. s_string: "nested in a map"
  692. }
  693. }
  694. `,
  695. wantMessage: &pb3.Maps{
  696. StrToNested: map[string]*pb3.Nested{
  697. "nested_one": &pb3.Nested{
  698. SString: "nested in a map",
  699. },
  700. },
  701. },
  702. }, {
  703. desc: "map fields 4",
  704. inputMessage: &pb3.Maps{},
  705. inputText: `
  706. str_to_oneofs: {
  707. key: "nested"
  708. value: {
  709. oneof_nested: {
  710. s_string: "nested oneof in map field value"
  711. }
  712. }
  713. }
  714. str_to_oneofs: {
  715. key: "string"
  716. value: {
  717. oneof_string: "hello"
  718. }
  719. }
  720. `,
  721. wantMessage: &pb3.Maps{
  722. StrToOneofs: map[string]*pb3.Oneofs{
  723. "string": &pb3.Oneofs{
  724. Union: &pb3.Oneofs_OneofString{
  725. OneofString: "hello",
  726. },
  727. },
  728. "nested": &pb3.Oneofs{
  729. Union: &pb3.Oneofs_OneofNested{
  730. OneofNested: &pb3.Nested{
  731. SString: "nested oneof in map field value",
  732. },
  733. },
  734. },
  735. },
  736. },
  737. }, {
  738. desc: "map contains duplicate keys",
  739. inputMessage: &pb3.Maps{},
  740. inputText: `
  741. int32_to_str: {
  742. key: 0
  743. value: "cero"
  744. }
  745. int32_to_str: {
  746. key: 0
  747. value: "zero"
  748. }
  749. `,
  750. wantMessage: &pb3.Maps{
  751. Int32ToStr: map[int32]string{
  752. 0: "zero",
  753. },
  754. },
  755. }, {
  756. desc: "map contains duplicate key fields",
  757. inputMessage: &pb3.Maps{},
  758. inputText: `
  759. int32_to_str: {
  760. key: 0
  761. key: 1
  762. value: "cero"
  763. }
  764. `,
  765. wantErr: true,
  766. }, {
  767. desc: "map contains duplicate value fields",
  768. inputMessage: &pb3.Maps{},
  769. inputText: `
  770. int32_to_str: {
  771. key: 1
  772. value: "cero"
  773. value: "uno"
  774. }
  775. `,
  776. wantErr: true,
  777. }, {
  778. desc: "map contains missing key",
  779. inputMessage: &pb3.Maps{},
  780. inputText: `
  781. int32_to_str: {
  782. value: "zero"
  783. }
  784. bool_to_uint32: {
  785. value: 47
  786. }
  787. str_to_nested: {
  788. value: {}
  789. }
  790. `,
  791. wantMessage: &pb3.Maps{
  792. Int32ToStr: map[int32]string{
  793. 0: "zero",
  794. },
  795. BoolToUint32: map[bool]uint32{
  796. false: 47,
  797. },
  798. StrToNested: map[string]*pb3.Nested{
  799. "": {},
  800. },
  801. },
  802. }, {
  803. desc: "map contains missing value",
  804. inputMessage: &pb3.Maps{},
  805. inputText: `
  806. int32_to_str: {
  807. key: 100
  808. }
  809. bool_to_uint32: {
  810. key: true
  811. }
  812. uint64_to_enum: {
  813. key: 101
  814. }
  815. str_to_nested: {
  816. key: "hello"
  817. }
  818. `,
  819. wantMessage: &pb3.Maps{
  820. Int32ToStr: map[int32]string{
  821. 100: "",
  822. },
  823. BoolToUint32: map[bool]uint32{
  824. true: 0,
  825. },
  826. Uint64ToEnum: map[uint64]pb3.Enum{
  827. 101: pb3.Enum_ZERO,
  828. },
  829. StrToNested: map[string]*pb3.Nested{
  830. "hello": {},
  831. },
  832. },
  833. }, {
  834. desc: "map contains missing key and value",
  835. inputMessage: &pb3.Maps{},
  836. inputText: `
  837. int32_to_str: {}
  838. bool_to_uint32: {}
  839. uint64_to_enum: {}
  840. str_to_nested: {}
  841. `,
  842. wantMessage: &pb3.Maps{
  843. Int32ToStr: map[int32]string{
  844. 0: "",
  845. },
  846. BoolToUint32: map[bool]uint32{
  847. false: 0,
  848. },
  849. Uint64ToEnum: map[uint64]pb3.Enum{
  850. 0: pb3.Enum_ZERO,
  851. },
  852. StrToNested: map[string]*pb3.Nested{
  853. "": {},
  854. },
  855. },
  856. }, {
  857. desc: "map contains overriding entries",
  858. inputMessage: &pb3.Maps{},
  859. inputText: `
  860. int32_to_str: {
  861. key: 0
  862. }
  863. int32_to_str: {
  864. value: "empty"
  865. }
  866. int32_to_str: {}
  867. `,
  868. wantMessage: &pb3.Maps{
  869. Int32ToStr: map[int32]string{
  870. 0: "",
  871. },
  872. },
  873. }, {
  874. desc: "map contains unknown field",
  875. inputMessage: &pb3.Maps{},
  876. inputText: `
  877. int32_to_str: {
  878. key: 0
  879. value: "cero"
  880. unknown: "bad"
  881. }
  882. `,
  883. wantErr: true,
  884. }, {
  885. desc: "map contains extension-like key field",
  886. inputMessage: &pb3.Maps{},
  887. inputText: `
  888. int32_to_str: {
  889. [key]: 10
  890. value: "ten"
  891. }
  892. `,
  893. wantErr: true,
  894. }, {
  895. desc: "map contains invalid key",
  896. inputMessage: &pb3.Maps{},
  897. inputText: `
  898. int32_to_str: {
  899. key: "invalid"
  900. value: "cero"
  901. }
  902. `,
  903. wantErr: true,
  904. }, {
  905. desc: "map contains invalid value",
  906. inputMessage: &pb3.Maps{},
  907. inputText: `
  908. int32_to_str: {
  909. key: 100
  910. value: 101
  911. }
  912. `,
  913. wantErr: true,
  914. }, {
  915. desc: "map using mix of [] and repeated",
  916. inputMessage: &pb3.Maps{},
  917. inputText: `
  918. int32_to_str: {
  919. key: 1
  920. value: "one"
  921. }
  922. int32_to_str: [
  923. {
  924. key: 2
  925. value: "not this"
  926. },
  927. {
  928. },
  929. {
  930. key: 3
  931. value: "three"
  932. }
  933. ]
  934. int32_to_str: {
  935. key: 2
  936. value: "two"
  937. }
  938. `,
  939. wantMessage: &pb3.Maps{
  940. Int32ToStr: map[int32]string{
  941. 0: "",
  942. 1: "one",
  943. 2: "two",
  944. 3: "three",
  945. },
  946. },
  947. }, {
  948. desc: "proto2 required fields not set",
  949. inputMessage: &pb2.Requireds{},
  950. wantErr: true,
  951. }, {
  952. desc: "proto2 required field set",
  953. inputMessage: &pb2.PartialRequired{},
  954. inputText: "req_string: 'this is required'",
  955. wantMessage: &pb2.PartialRequired{
  956. ReqString: scalar.String("this is required"),
  957. },
  958. }, {
  959. desc: "proto2 required fields partially set",
  960. inputMessage: &pb2.Requireds{},
  961. inputText: `
  962. req_bool: false
  963. req_sfixed64: 3203386110
  964. req_string: "hello"
  965. req_enum: ONE
  966. `,
  967. wantMessage: &pb2.Requireds{
  968. ReqBool: scalar.Bool(false),
  969. ReqSfixed64: scalar.Int64(0xbeefcafe),
  970. ReqString: scalar.String("hello"),
  971. ReqEnum: pb2.Enum_ONE.Enum(),
  972. },
  973. wantErr: true,
  974. }, {
  975. desc: "proto2 required fields all set",
  976. inputMessage: &pb2.Requireds{},
  977. inputText: `
  978. req_bool: false
  979. req_sfixed64: 0
  980. req_double: 0
  981. req_string: ""
  982. req_enum: ONE
  983. req_nested: {}
  984. `,
  985. wantMessage: &pb2.Requireds{
  986. ReqBool: scalar.Bool(false),
  987. ReqSfixed64: scalar.Int64(0),
  988. ReqDouble: scalar.Float64(0),
  989. ReqString: scalar.String(""),
  990. ReqEnum: pb2.Enum_ONE.Enum(),
  991. ReqNested: &pb2.Nested{},
  992. },
  993. }, {
  994. desc: "indirect required field",
  995. inputMessage: &pb2.IndirectRequired{},
  996. inputText: "opt_nested: {}",
  997. wantMessage: &pb2.IndirectRequired{
  998. OptNested: &pb2.NestedWithRequired{},
  999. },
  1000. wantErr: true,
  1001. }, {
  1002. desc: "indirect required field in repeated",
  1003. inputMessage: &pb2.IndirectRequired{},
  1004. inputText: `
  1005. rpt_nested: {
  1006. req_string: "one"
  1007. }
  1008. rpt_nested: {}
  1009. rpt_nested: {
  1010. req_string: "three"
  1011. }
  1012. `,
  1013. wantMessage: &pb2.IndirectRequired{
  1014. RptNested: []*pb2.NestedWithRequired{
  1015. {
  1016. ReqString: scalar.String("one"),
  1017. },
  1018. {},
  1019. {
  1020. ReqString: scalar.String("three"),
  1021. },
  1022. },
  1023. },
  1024. wantErr: true,
  1025. }, {
  1026. desc: "indirect required field in map",
  1027. inputMessage: &pb2.IndirectRequired{},
  1028. inputText: `
  1029. str_to_nested: {
  1030. key: "missing"
  1031. }
  1032. str_to_nested: {
  1033. key: "contains"
  1034. value: {
  1035. req_string: "here"
  1036. }
  1037. }
  1038. `,
  1039. wantMessage: &pb2.IndirectRequired{
  1040. StrToNested: map[string]*pb2.NestedWithRequired{
  1041. "missing": &pb2.NestedWithRequired{},
  1042. "contains": &pb2.NestedWithRequired{
  1043. ReqString: scalar.String("here"),
  1044. },
  1045. },
  1046. },
  1047. wantErr: true,
  1048. }, {
  1049. desc: "indirect required field in oneof",
  1050. inputMessage: &pb2.IndirectRequired{},
  1051. inputText: `oneof_nested: {}
  1052. `,
  1053. wantMessage: &pb2.IndirectRequired{
  1054. Union: &pb2.IndirectRequired_OneofNested{
  1055. OneofNested: &pb2.NestedWithRequired{},
  1056. },
  1057. },
  1058. wantErr: true,
  1059. }, {
  1060. desc: "ignore reserved field",
  1061. inputMessage: &pb2.Nests{},
  1062. inputText: "reserved_field: 'ignore this'",
  1063. wantMessage: &pb2.Nests{},
  1064. }, {
  1065. desc: "extensions of non-repeated fields",
  1066. inputMessage: &pb2.Extensions{},
  1067. inputText: `opt_string: "non-extension field"
  1068. [pb2.opt_ext_bool]: true
  1069. opt_bool: true
  1070. [pb2.opt_ext_nested]: {
  1071. opt_string: "nested in an extension"
  1072. opt_nested: {
  1073. opt_string: "another nested in an extension"
  1074. }
  1075. }
  1076. [pb2.opt_ext_string]: "extension field"
  1077. opt_int32: 42
  1078. [pb2.opt_ext_enum]: TEN
  1079. `,
  1080. wantMessage: func() proto.Message {
  1081. m := &pb2.Extensions{
  1082. OptString: scalar.String("non-extension field"),
  1083. OptBool: scalar.Bool(true),
  1084. OptInt32: scalar.Int32(42),
  1085. }
  1086. setExtension(m, pb2.E_OptExtBool, true)
  1087. setExtension(m, pb2.E_OptExtString, "extension field")
  1088. setExtension(m, pb2.E_OptExtEnum, pb2.Enum_TEN)
  1089. setExtension(m, pb2.E_OptExtNested, &pb2.Nested{
  1090. OptString: scalar.String("nested in an extension"),
  1091. OptNested: &pb2.Nested{
  1092. OptString: scalar.String("another nested in an extension"),
  1093. },
  1094. })
  1095. return m
  1096. }(),
  1097. }, {
  1098. desc: "extensions of repeated fields",
  1099. inputMessage: &pb2.Extensions{},
  1100. inputText: `[pb2.rpt_ext_enum]: TEN
  1101. [pb2.rpt_ext_enum]: 101
  1102. [pb2.rpt_ext_fixed32]: 42
  1103. [pb2.rpt_ext_enum]: ONE
  1104. [pb2.rpt_ext_nested]: {
  1105. opt_string: "one"
  1106. }
  1107. [pb2.rpt_ext_nested]: {
  1108. opt_string: "two"
  1109. }
  1110. [pb2.rpt_ext_fixed32]: 47
  1111. [pb2.rpt_ext_nested]: {
  1112. opt_string: "three"
  1113. }
  1114. `,
  1115. wantMessage: func() proto.Message {
  1116. m := &pb2.Extensions{}
  1117. setExtension(m, pb2.E_RptExtEnum, &[]pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
  1118. setExtension(m, pb2.E_RptExtFixed32, &[]uint32{42, 47})
  1119. setExtension(m, pb2.E_RptExtNested, &[]*pb2.Nested{
  1120. &pb2.Nested{OptString: scalar.String("one")},
  1121. &pb2.Nested{OptString: scalar.String("two")},
  1122. &pb2.Nested{OptString: scalar.String("three")},
  1123. })
  1124. return m
  1125. }(),
  1126. }, {
  1127. desc: "extensions of non-repeated fields in another message",
  1128. inputMessage: &pb2.Extensions{},
  1129. inputText: `[pb2.ExtensionsContainer.opt_ext_bool]: true
  1130. [pb2.ExtensionsContainer.opt_ext_enum]: TEN
  1131. [pb2.ExtensionsContainer.opt_ext_nested]: {
  1132. opt_string: "nested in an extension"
  1133. opt_nested: {
  1134. opt_string: "another nested in an extension"
  1135. }
  1136. }
  1137. [pb2.ExtensionsContainer.opt_ext_string]: "extension field"
  1138. `,
  1139. wantMessage: func() proto.Message {
  1140. m := &pb2.Extensions{}
  1141. setExtension(m, pb2.E_ExtensionsContainer_OptExtBool, true)
  1142. setExtension(m, pb2.E_ExtensionsContainer_OptExtString, "extension field")
  1143. setExtension(m, pb2.E_ExtensionsContainer_OptExtEnum, pb2.Enum_TEN)
  1144. setExtension(m, pb2.E_ExtensionsContainer_OptExtNested, &pb2.Nested{
  1145. OptString: scalar.String("nested in an extension"),
  1146. OptNested: &pb2.Nested{
  1147. OptString: scalar.String("another nested in an extension"),
  1148. },
  1149. })
  1150. return m
  1151. }(),
  1152. }, {
  1153. desc: "extensions of repeated fields in another message",
  1154. inputMessage: &pb2.Extensions{},
  1155. inputText: `opt_string: "non-extension field"
  1156. opt_bool: true
  1157. opt_int32: 42
  1158. [pb2.ExtensionsContainer.rpt_ext_nested]: {
  1159. opt_string: "one"
  1160. }
  1161. [pb2.ExtensionsContainer.rpt_ext_enum]: TEN
  1162. [pb2.ExtensionsContainer.rpt_ext_nested]: {
  1163. opt_string: "two"
  1164. }
  1165. [pb2.ExtensionsContainer.rpt_ext_enum]: 101
  1166. [pb2.ExtensionsContainer.rpt_ext_string]: "hello"
  1167. [pb2.ExtensionsContainer.rpt_ext_enum]: ONE
  1168. [pb2.ExtensionsContainer.rpt_ext_nested]: {
  1169. opt_string: "three"
  1170. }
  1171. [pb2.ExtensionsContainer.rpt_ext_string]: "world"
  1172. `,
  1173. wantMessage: func() proto.Message {
  1174. m := &pb2.Extensions{
  1175. OptString: scalar.String("non-extension field"),
  1176. OptBool: scalar.Bool(true),
  1177. OptInt32: scalar.Int32(42),
  1178. }
  1179. setExtension(m, pb2.E_ExtensionsContainer_RptExtEnum, &[]pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
  1180. setExtension(m, pb2.E_ExtensionsContainer_RptExtString, &[]string{"hello", "world"})
  1181. setExtension(m, pb2.E_ExtensionsContainer_RptExtNested, &[]*pb2.Nested{
  1182. &pb2.Nested{OptString: scalar.String("one")},
  1183. &pb2.Nested{OptString: scalar.String("two")},
  1184. &pb2.Nested{OptString: scalar.String("three")},
  1185. })
  1186. return m
  1187. }(),
  1188. }, {
  1189. desc: "invalid extension field name",
  1190. inputMessage: &pb2.Extensions{},
  1191. inputText: "[pb2.invalid_message_field]: true",
  1192. wantErr: true,
  1193. }, {
  1194. desc: "MessageSet",
  1195. inputMessage: &pb2.MessageSet{},
  1196. inputText: `
  1197. [pb2.MessageSetExtension]: {
  1198. opt_string: "a messageset extension"
  1199. }
  1200. [pb2.MessageSetExtension.ext_nested]: {
  1201. opt_string: "just a regular extension"
  1202. }
  1203. [pb2.MessageSetExtension.not_message_set_extension]: {
  1204. opt_string: "not a messageset extension"
  1205. }
  1206. `,
  1207. wantMessage: func() proto.Message {
  1208. m := &pb2.MessageSet{}
  1209. setExtension(m, pb2.E_MessageSetExtension_MessageSetExtension, &pb2.MessageSetExtension{
  1210. OptString: scalar.String("a messageset extension"),
  1211. })
  1212. setExtension(m, pb2.E_MessageSetExtension_NotMessageSetExtension, &pb2.MessageSetExtension{
  1213. OptString: scalar.String("not a messageset extension"),
  1214. })
  1215. setExtension(m, pb2.E_MessageSetExtension_ExtNested, &pb2.Nested{
  1216. OptString: scalar.String("just a regular extension"),
  1217. })
  1218. return m
  1219. }(),
  1220. }, {
  1221. desc: "not real MessageSet 1",
  1222. inputMessage: &pb2.FakeMessageSet{},
  1223. inputText: `
  1224. [pb2.FakeMessageSetExtension.message_set_extension]: {
  1225. opt_string: "not a messageset extension"
  1226. }
  1227. `,
  1228. wantMessage: func() proto.Message {
  1229. m := &pb2.FakeMessageSet{}
  1230. setExtension(m, pb2.E_FakeMessageSetExtension_MessageSetExtension, &pb2.FakeMessageSetExtension{
  1231. OptString: scalar.String("not a messageset extension"),
  1232. })
  1233. return m
  1234. }(),
  1235. }, {
  1236. desc: "not real MessageSet 2",
  1237. inputMessage: &pb2.FakeMessageSet{},
  1238. inputText: `
  1239. [pb2.FakeMessageSetExtension]: {
  1240. opt_string: "not a messageset extension"
  1241. }
  1242. `,
  1243. wantErr: true,
  1244. }, {
  1245. desc: "not real MessageSet 3",
  1246. inputMessage: &pb2.MessageSet{},
  1247. inputText: `
  1248. [pb2.message_set_extension]: {
  1249. opt_string: "another not a messageset extension"
  1250. }
  1251. `,
  1252. wantMessage: func() proto.Message {
  1253. m := &pb2.MessageSet{}
  1254. setExtension(m, pb2.E_MessageSetExtension, &pb2.FakeMessageSetExtension{
  1255. OptString: scalar.String("another not a messageset extension"),
  1256. })
  1257. return m
  1258. }(),
  1259. }, {
  1260. // TODO: Change these tests to directly use knownpb.Any type instead once
  1261. // type has been regenerated with V2 compiler.
  1262. desc: "Any not expanded",
  1263. inputMessage: &pb2.KnownTypes{},
  1264. inputText: `opt_any: {
  1265. type_url: "pb2.Nested"
  1266. value: "some bytes"
  1267. }
  1268. `,
  1269. wantMessage: &pb2.KnownTypes{
  1270. OptAny: &knownpb.Any{
  1271. TypeUrl: "pb2.Nested",
  1272. Value: []byte("some bytes"),
  1273. },
  1274. },
  1275. }, {
  1276. desc: "Any not expanded missing value",
  1277. inputMessage: &pb2.KnownTypes{},
  1278. inputText: `opt_any: {
  1279. type_url: "pb2.Nested"
  1280. }
  1281. `,
  1282. wantMessage: &pb2.KnownTypes{
  1283. OptAny: &knownpb.Any{
  1284. TypeUrl: "pb2.Nested",
  1285. },
  1286. },
  1287. }, {
  1288. desc: "Any not expanded missing type_url",
  1289. inputMessage: &pb2.KnownTypes{},
  1290. inputText: `opt_any: {
  1291. value: "some bytes"
  1292. }
  1293. `,
  1294. wantMessage: &pb2.KnownTypes{
  1295. OptAny: &knownpb.Any{
  1296. Value: []byte("some bytes"),
  1297. },
  1298. },
  1299. }, {
  1300. desc: "Any expanded",
  1301. umo: func() textpb.UnmarshalOptions {
  1302. m := &pb2.Nested{}
  1303. resolver := preg.NewTypes(m.ProtoReflect().Type())
  1304. return textpb.UnmarshalOptions{Resolver: resolver}
  1305. }(),
  1306. inputMessage: &pb2.KnownTypes{},
  1307. inputText: `opt_any: {
  1308. [foobar/pb2.Nested]: {
  1309. opt_string: "embedded inside Any"
  1310. opt_nested: {
  1311. opt_string: "inception"
  1312. }
  1313. }
  1314. }
  1315. `,
  1316. wantMessage: func() proto.Message {
  1317. m := &pb2.Nested{
  1318. OptString: scalar.String("embedded inside Any"),
  1319. OptNested: &pb2.Nested{
  1320. OptString: scalar.String("inception"),
  1321. },
  1322. }
  1323. // TODO: Switch to V2 marshal when ready.
  1324. b, err := protoV1.Marshal(m)
  1325. if err != nil {
  1326. t.Fatalf("error in binary marshaling message for Any.value: %v", err)
  1327. }
  1328. return &pb2.KnownTypes{
  1329. OptAny: &knownpb.Any{
  1330. TypeUrl: "foobar/pb2.Nested",
  1331. Value: b,
  1332. },
  1333. }
  1334. }(),
  1335. }, {
  1336. desc: "Any expanded with empty value",
  1337. umo: func() textpb.UnmarshalOptions {
  1338. m := &pb2.Nested{}
  1339. resolver := preg.NewTypes(m.ProtoReflect().Type())
  1340. return textpb.UnmarshalOptions{Resolver: resolver}
  1341. }(),
  1342. inputMessage: &pb2.KnownTypes{},
  1343. inputText: `opt_any: {
  1344. [foo.com/pb2.Nested]: {}
  1345. }
  1346. `,
  1347. wantMessage: &pb2.KnownTypes{
  1348. OptAny: &knownpb.Any{
  1349. TypeUrl: "foo.com/pb2.Nested",
  1350. },
  1351. },
  1352. }, {
  1353. desc: "Any expanded with missing required error",
  1354. umo: func() textpb.UnmarshalOptions {
  1355. m := &pb2.PartialRequired{}
  1356. resolver := preg.NewTypes(m.ProtoReflect().Type())
  1357. return textpb.UnmarshalOptions{Resolver: resolver}
  1358. }(),
  1359. inputMessage: &pb2.KnownTypes{},
  1360. inputText: `opt_any: {
  1361. [pb2.PartialRequired]: {
  1362. opt_string: "embedded inside Any"
  1363. }
  1364. }
  1365. `,
  1366. wantMessage: func() proto.Message {
  1367. m := &pb2.PartialRequired{
  1368. OptString: scalar.String("embedded inside Any"),
  1369. }
  1370. // TODO: Switch to V2 marshal when ready.
  1371. b, err := protoV1.Marshal(m)
  1372. // Ignore required not set error.
  1373. if _, ok := err.(*protoV1.RequiredNotSetError); !ok {
  1374. t.Fatalf("error in binary marshaling message for Any.value: %v", err)
  1375. }
  1376. return &pb2.KnownTypes{
  1377. OptAny: &knownpb.Any{
  1378. TypeUrl: "pb2.PartialRequired",
  1379. Value: b,
  1380. },
  1381. }
  1382. }(),
  1383. wantErr: true,
  1384. }, {
  1385. desc: "Any expanded with unregistered type",
  1386. umo: textpb.UnmarshalOptions{Resolver: preg.NewTypes()},
  1387. inputMessage: &pb2.KnownTypes{},
  1388. inputText: `opt_any: {
  1389. [SomeMessage]: {}
  1390. }
  1391. `,
  1392. wantErr: true,
  1393. }, {
  1394. desc: "Any expanded with invalid value",
  1395. umo: func() textpb.UnmarshalOptions {
  1396. m := &pb2.Nested{}
  1397. resolver := preg.NewTypes(m.ProtoReflect().Type())
  1398. return textpb.UnmarshalOptions{Resolver: resolver}
  1399. }(),
  1400. inputMessage: &pb2.KnownTypes{},
  1401. inputText: `opt_any: {
  1402. [pb2.Nested]: 123
  1403. }
  1404. `,
  1405. wantErr: true,
  1406. }, {
  1407. desc: "Any expanded with unknown fields",
  1408. umo: func() textpb.UnmarshalOptions {
  1409. m := &pb2.Nested{}
  1410. resolver := preg.NewTypes(m.ProtoReflect().Type())
  1411. return textpb.UnmarshalOptions{Resolver: resolver}
  1412. }(),
  1413. inputMessage: &pb2.KnownTypes{},
  1414. inputText: `opt_any: {
  1415. [pb2.Nested]: {}
  1416. unknown: ""
  1417. }
  1418. `,
  1419. wantErr: true,
  1420. }, {
  1421. desc: "Any contains expanded and unexpanded fields",
  1422. umo: func() textpb.UnmarshalOptions {
  1423. m := &pb2.Nested{}
  1424. resolver := preg.NewTypes(m.ProtoReflect().Type())
  1425. return textpb.UnmarshalOptions{Resolver: resolver}
  1426. }(),
  1427. inputMessage: &pb2.KnownTypes{},
  1428. inputText: `opt_any: {
  1429. [pb2.Nested]: {}
  1430. type_url: "pb2.Nested"
  1431. }
  1432. `,
  1433. wantErr: true,
  1434. }}
  1435. for _, tt := range tests {
  1436. tt := tt
  1437. t.Run(tt.desc, func(t *testing.T) {
  1438. t.Parallel()
  1439. err := tt.umo.Unmarshal(tt.inputMessage, []byte(tt.inputText))
  1440. if err != nil && !tt.wantErr {
  1441. t.Errorf("Unmarshal() returned error: %v\n\n", err)
  1442. }
  1443. if err == nil && tt.wantErr {
  1444. t.Error("Unmarshal() got nil error, want error\n\n")
  1445. }
  1446. if tt.wantMessage != nil && !protoV1.Equal(tt.inputMessage.(protoV1.Message), tt.wantMessage.(protoV1.Message)) {
  1447. t.Errorf("Unmarshal()\n<got>\n%v\n<want>\n%v\n", tt.inputMessage, tt.wantMessage)
  1448. }
  1449. })
  1450. }
  1451. }