decode_test.go 63 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466
  1. // Copyright 2019 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package jsonpb_test
  5. import (
  6. "math"
  7. "testing"
  8. protoV1 "github.com/golang/protobuf/proto"
  9. "github.com/golang/protobuf/v2/encoding/jsonpb"
  10. "github.com/golang/protobuf/v2/encoding/testprotos/pb2"
  11. "github.com/golang/protobuf/v2/encoding/testprotos/pb3"
  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/runtime/protoiface"
  16. knownpb "github.com/golang/protobuf/v2/types/known"
  17. )
  18. func init() {
  19. // TODO: remove these registerExtension calls when generated code registers
  20. // to V2 global registry.
  21. registerExtension(pb2.E_OptExtBool)
  22. registerExtension(pb2.E_OptExtString)
  23. registerExtension(pb2.E_OptExtEnum)
  24. registerExtension(pb2.E_OptExtNested)
  25. registerExtension(pb2.E_RptExtFixed32)
  26. registerExtension(pb2.E_RptExtEnum)
  27. registerExtension(pb2.E_RptExtNested)
  28. registerExtension(pb2.E_ExtensionsContainer_OptExtBool)
  29. registerExtension(pb2.E_ExtensionsContainer_OptExtString)
  30. registerExtension(pb2.E_ExtensionsContainer_OptExtEnum)
  31. registerExtension(pb2.E_ExtensionsContainer_OptExtNested)
  32. registerExtension(pb2.E_ExtensionsContainer_RptExtString)
  33. registerExtension(pb2.E_ExtensionsContainer_RptExtEnum)
  34. registerExtension(pb2.E_ExtensionsContainer_RptExtNested)
  35. registerExtension(pb2.E_MessageSetExtension)
  36. registerExtension(pb2.E_MessageSetExtension_MessageSetExtension)
  37. registerExtension(pb2.E_MessageSetExtension_NotMessageSetExtension)
  38. registerExtension(pb2.E_MessageSetExtension_ExtNested)
  39. registerExtension(pb2.E_FakeMessageSetExtension_MessageSetExtension)
  40. }
  41. func registerExtension(xd *protoiface.ExtensionDescV1) {
  42. preg.GlobalTypes.Register(xd.Type)
  43. }
  44. func TestUnmarshal(t *testing.T) {
  45. tests := []struct {
  46. desc string
  47. umo jsonpb.UnmarshalOptions
  48. inputMessage proto.Message
  49. inputText string
  50. wantMessage proto.Message
  51. // TODO: verify expected error message substring.
  52. wantErr bool
  53. }{{
  54. desc: "proto2 empty message",
  55. inputMessage: &pb2.Scalars{},
  56. inputText: "{}",
  57. wantMessage: &pb2.Scalars{},
  58. }, {
  59. desc: "unexpected value instead of EOF",
  60. inputMessage: &pb2.Scalars{},
  61. inputText: "{} {}",
  62. wantErr: true,
  63. }, {
  64. desc: "proto2 optional scalars set to zero values",
  65. inputMessage: &pb2.Scalars{},
  66. inputText: `{
  67. "optBool": false,
  68. "optInt32": 0,
  69. "optInt64": 0,
  70. "optUint32": 0,
  71. "optUint64": 0,
  72. "optSint32": 0,
  73. "optSint64": 0,
  74. "optFixed32": 0,
  75. "optFixed64": 0,
  76. "optSfixed32": 0,
  77. "optSfixed64": 0,
  78. "optFloat": 0,
  79. "optDouble": 0,
  80. "optBytes": "",
  81. "optString": ""
  82. }`,
  83. wantMessage: &pb2.Scalars{
  84. OptBool: scalar.Bool(false),
  85. OptInt32: scalar.Int32(0),
  86. OptInt64: scalar.Int64(0),
  87. OptUint32: scalar.Uint32(0),
  88. OptUint64: scalar.Uint64(0),
  89. OptSint32: scalar.Int32(0),
  90. OptSint64: scalar.Int64(0),
  91. OptFixed32: scalar.Uint32(0),
  92. OptFixed64: scalar.Uint64(0),
  93. OptSfixed32: scalar.Int32(0),
  94. OptSfixed64: scalar.Int64(0),
  95. OptFloat: scalar.Float32(0),
  96. OptDouble: scalar.Float64(0),
  97. OptBytes: []byte{},
  98. OptString: scalar.String(""),
  99. },
  100. }, {
  101. desc: "proto3 scalars set to zero values",
  102. inputMessage: &pb3.Scalars{},
  103. inputText: `{
  104. "sBool": false,
  105. "sInt32": 0,
  106. "sInt64": 0,
  107. "sUint32": 0,
  108. "sUint64": 0,
  109. "sSint32": 0,
  110. "sSint64": 0,
  111. "sFixed32": 0,
  112. "sFixed64": 0,
  113. "sSfixed32": 0,
  114. "sSfixed64": 0,
  115. "sFloat": 0,
  116. "sDouble": 0,
  117. "sBytes": "",
  118. "sString": ""
  119. }`,
  120. wantMessage: &pb3.Scalars{},
  121. }, {
  122. desc: "proto2 optional scalars set to null",
  123. inputMessage: &pb2.Scalars{},
  124. inputText: `{
  125. "optBool": null,
  126. "optInt32": null,
  127. "optInt64": null,
  128. "optUint32": null,
  129. "optUint64": null,
  130. "optSint32": null,
  131. "optSint64": null,
  132. "optFixed32": null,
  133. "optFixed64": null,
  134. "optSfixed32": null,
  135. "optSfixed64": null,
  136. "optFloat": null,
  137. "optDouble": null,
  138. "optBytes": null,
  139. "optString": null
  140. }`,
  141. wantMessage: &pb2.Scalars{},
  142. }, {
  143. desc: "proto3 scalars set to null",
  144. inputMessage: &pb3.Scalars{},
  145. inputText: `{
  146. "sBool": null,
  147. "sInt32": null,
  148. "sInt64": null,
  149. "sUint32": null,
  150. "sUint64": null,
  151. "sSint32": null,
  152. "sSint64": null,
  153. "sFixed32": null,
  154. "sFixed64": null,
  155. "sSfixed32": null,
  156. "sSfixed64": null,
  157. "sFloat": null,
  158. "sDouble": null,
  159. "sBytes": null,
  160. "sString": null
  161. }`,
  162. wantMessage: &pb3.Scalars{},
  163. }, {
  164. desc: "boolean",
  165. inputMessage: &pb3.Scalars{},
  166. inputText: `{"sBool": true}`,
  167. wantMessage: &pb3.Scalars{
  168. SBool: true,
  169. },
  170. }, {
  171. desc: "not boolean",
  172. inputMessage: &pb3.Scalars{},
  173. inputText: `{"sBool": "true"}`,
  174. wantErr: true,
  175. }, {
  176. desc: "float and double",
  177. inputMessage: &pb3.Scalars{},
  178. inputText: `{
  179. "sFloat": 1.234,
  180. "sDouble": 5.678
  181. }`,
  182. wantMessage: &pb3.Scalars{
  183. SFloat: 1.234,
  184. SDouble: 5.678,
  185. },
  186. }, {
  187. desc: "float and double in string",
  188. inputMessage: &pb3.Scalars{},
  189. inputText: `{
  190. "sFloat": "1.234",
  191. "sDouble": "5.678"
  192. }`,
  193. wantMessage: &pb3.Scalars{
  194. SFloat: 1.234,
  195. SDouble: 5.678,
  196. },
  197. }, {
  198. desc: "float and double in E notation",
  199. inputMessage: &pb3.Scalars{},
  200. inputText: `{
  201. "sFloat": 12.34E-1,
  202. "sDouble": 5.678e4
  203. }`,
  204. wantMessage: &pb3.Scalars{
  205. SFloat: 1.234,
  206. SDouble: 56780,
  207. },
  208. }, {
  209. desc: "float and double in string E notation",
  210. inputMessage: &pb3.Scalars{},
  211. inputText: `{
  212. "sFloat": "12.34E-1",
  213. "sDouble": "5.678e4"
  214. }`,
  215. wantMessage: &pb3.Scalars{
  216. SFloat: 1.234,
  217. SDouble: 56780,
  218. },
  219. }, {
  220. desc: "float exceeds limit",
  221. inputMessage: &pb3.Scalars{},
  222. inputText: `{"sFloat": 3.4e39}`,
  223. wantErr: true,
  224. }, {
  225. desc: "float in string exceeds limit",
  226. inputMessage: &pb3.Scalars{},
  227. inputText: `{"sFloat": "-3.4e39"}`,
  228. wantErr: true,
  229. }, {
  230. desc: "double exceeds limit",
  231. inputMessage: &pb3.Scalars{},
  232. inputText: `{"sFloat": -1.79e+309}`,
  233. wantErr: true,
  234. }, {
  235. desc: "double in string exceeds limit",
  236. inputMessage: &pb3.Scalars{},
  237. inputText: `{"sFloat": "1.79e+309"}`,
  238. wantErr: true,
  239. }, {
  240. desc: "infinites",
  241. inputMessage: &pb3.Scalars{},
  242. inputText: `{"sFloat": "Infinity", "sDouble": "-Infinity"}`,
  243. wantMessage: &pb3.Scalars{
  244. SFloat: float32(math.Inf(+1)),
  245. SDouble: math.Inf(-1),
  246. },
  247. }, {
  248. desc: "not float",
  249. inputMessage: &pb3.Scalars{},
  250. inputText: `{"sFloat": true}`,
  251. wantErr: true,
  252. }, {
  253. desc: "not double",
  254. inputMessage: &pb3.Scalars{},
  255. inputText: `{"sDouble": "not a number"}`,
  256. wantErr: true,
  257. }, {
  258. desc: "integers",
  259. inputMessage: &pb3.Scalars{},
  260. inputText: `{
  261. "sInt32": 1234,
  262. "sInt64": -1234,
  263. "sUint32": 1e2,
  264. "sUint64": 100E-2,
  265. "sSint32": 1.0,
  266. "sSint64": -1.0,
  267. "sFixed32": 1.234e+5,
  268. "sFixed64": 1200E-2,
  269. "sSfixed32": -1.234e05,
  270. "sSfixed64": -1200e-02
  271. }`,
  272. wantMessage: &pb3.Scalars{
  273. SInt32: 1234,
  274. SInt64: -1234,
  275. SUint32: 100,
  276. SUint64: 1,
  277. SSint32: 1,
  278. SSint64: -1,
  279. SFixed32: 123400,
  280. SFixed64: 12,
  281. SSfixed32: -123400,
  282. SSfixed64: -12,
  283. },
  284. }, {
  285. desc: "integers in string",
  286. inputMessage: &pb3.Scalars{},
  287. inputText: `{
  288. "sInt32": "1234",
  289. "sInt64": "-1234",
  290. "sUint32": "1e2",
  291. "sUint64": "100E-2",
  292. "sSint32": "1.0",
  293. "sSint64": "-1.0",
  294. "sFixed32": "1.234e+5",
  295. "sFixed64": "1200E-2",
  296. "sSfixed32": "-1.234e05",
  297. "sSfixed64": "-1200e-02"
  298. }`,
  299. wantMessage: &pb3.Scalars{
  300. SInt32: 1234,
  301. SInt64: -1234,
  302. SUint32: 100,
  303. SUint64: 1,
  304. SSint32: 1,
  305. SSint64: -1,
  306. SFixed32: 123400,
  307. SFixed64: 12,
  308. SSfixed32: -123400,
  309. SSfixed64: -12,
  310. },
  311. }, {
  312. desc: "integers in escaped string",
  313. inputMessage: &pb3.Scalars{},
  314. inputText: `{"sInt32": "\u0031\u0032"}`,
  315. wantMessage: &pb3.Scalars{
  316. SInt32: 12,
  317. },
  318. }, {
  319. desc: "number is not an integer",
  320. inputMessage: &pb3.Scalars{},
  321. inputText: `{"sInt32": 1.001}`,
  322. wantErr: true,
  323. }, {
  324. desc: "32-bit int exceeds limit",
  325. inputMessage: &pb3.Scalars{},
  326. inputText: `{"sInt32": 2e10}`,
  327. wantErr: true,
  328. }, {
  329. desc: "64-bit int exceeds limit",
  330. inputMessage: &pb3.Scalars{},
  331. inputText: `{"sSfixed64": -9e19}`,
  332. wantErr: true,
  333. }, {
  334. desc: "not integer",
  335. inputMessage: &pb3.Scalars{},
  336. inputText: `{"sInt32": "not a number"}`,
  337. wantErr: true,
  338. }, {
  339. desc: "not unsigned integer",
  340. inputMessage: &pb3.Scalars{},
  341. inputText: `{"sUint32": "not a number"}`,
  342. wantErr: true,
  343. }, {
  344. desc: "number is not an unsigned integer",
  345. inputMessage: &pb3.Scalars{},
  346. inputText: `{"sUint32": -1}`,
  347. wantErr: true,
  348. }, {
  349. desc: "string",
  350. inputMessage: &pb2.Scalars{},
  351. inputText: `{"optString": "谷歌"}`,
  352. wantMessage: &pb2.Scalars{
  353. OptString: scalar.String("谷歌"),
  354. },
  355. }, {
  356. desc: "string with invalid UTF-8",
  357. inputMessage: &pb3.Scalars{},
  358. inputText: "{\"sString\": \"\xff\"}",
  359. wantMessage: &pb3.Scalars{
  360. SString: "\xff",
  361. },
  362. wantErr: true,
  363. }, {
  364. desc: "not string",
  365. inputMessage: &pb2.Scalars{},
  366. inputText: `{"optString": 42}`,
  367. wantErr: true,
  368. }, {
  369. desc: "bytes",
  370. inputMessage: &pb3.Scalars{},
  371. inputText: `{"sBytes": "aGVsbG8gd29ybGQ"}`,
  372. wantMessage: &pb3.Scalars{
  373. SBytes: []byte("hello world"),
  374. },
  375. }, {
  376. desc: "bytes padded",
  377. inputMessage: &pb3.Scalars{},
  378. inputText: `{"sBytes": "aGVsbG8gd29ybGQ="}`,
  379. wantMessage: &pb3.Scalars{
  380. SBytes: []byte("hello world"),
  381. },
  382. }, {
  383. desc: "not bytes",
  384. inputMessage: &pb3.Scalars{},
  385. inputText: `{"sBytes": true}`,
  386. wantErr: true,
  387. }, {
  388. desc: "proto2 enum",
  389. inputMessage: &pb2.Enums{},
  390. inputText: `{
  391. "optEnum": "ONE",
  392. "optNestedEnum": "UNO"
  393. }`,
  394. wantMessage: &pb2.Enums{
  395. OptEnum: pb2.Enum_ONE.Enum(),
  396. OptNestedEnum: pb2.Enums_UNO.Enum(),
  397. },
  398. }, {
  399. desc: "proto3 enum",
  400. inputMessage: &pb3.Enums{},
  401. inputText: `{
  402. "sEnum": "ONE",
  403. "sNestedEnum": "DIEZ"
  404. }`,
  405. wantMessage: &pb3.Enums{
  406. SEnum: pb3.Enum_ONE,
  407. SNestedEnum: pb3.Enums_DIEZ,
  408. },
  409. }, {
  410. desc: "enum numeric value",
  411. inputMessage: &pb3.Enums{},
  412. inputText: `{
  413. "sEnum": 2,
  414. "sNestedEnum": 2
  415. }`,
  416. wantMessage: &pb3.Enums{
  417. SEnum: pb3.Enum_TWO,
  418. SNestedEnum: pb3.Enums_DOS,
  419. },
  420. }, {
  421. desc: "enum unnamed numeric value",
  422. inputMessage: &pb3.Enums{},
  423. inputText: `{
  424. "sEnum": 101,
  425. "sNestedEnum": -101
  426. }`,
  427. wantMessage: &pb3.Enums{
  428. SEnum: 101,
  429. SNestedEnum: -101,
  430. },
  431. }, {
  432. desc: "enum set to number string",
  433. inputMessage: &pb3.Enums{},
  434. inputText: `{
  435. "sEnum": "1"
  436. }`,
  437. wantErr: true,
  438. }, {
  439. desc: "enum set to invalid named",
  440. inputMessage: &pb3.Enums{},
  441. inputText: `{
  442. "sEnum": "UNNAMED"
  443. }`,
  444. wantErr: true,
  445. }, {
  446. desc: "enum set to not enum",
  447. inputMessage: &pb3.Enums{},
  448. inputText: `{
  449. "sEnum": true
  450. }`,
  451. wantErr: true,
  452. }, {
  453. desc: "enum set to JSON null",
  454. inputMessage: &pb3.Enums{},
  455. inputText: `{
  456. "sEnum": null
  457. }`,
  458. wantMessage: &pb3.Enums{},
  459. }, {
  460. desc: "proto name",
  461. inputMessage: &pb3.JSONNames{},
  462. inputText: `{
  463. "s_string": "proto name used"
  464. }`,
  465. wantMessage: &pb3.JSONNames{
  466. SString: "proto name used",
  467. },
  468. }, {
  469. desc: "json_name",
  470. inputMessage: &pb3.JSONNames{},
  471. inputText: `{
  472. "foo_bar": "json_name used"
  473. }`,
  474. wantMessage: &pb3.JSONNames{
  475. SString: "json_name used",
  476. },
  477. }, {
  478. desc: "camelCase name",
  479. inputMessage: &pb3.JSONNames{},
  480. inputText: `{
  481. "sString": "camelcase used"
  482. }`,
  483. wantErr: true,
  484. }, {
  485. desc: "proto name and json_name",
  486. inputMessage: &pb3.JSONNames{},
  487. inputText: `{
  488. "foo_bar": "json_name used",
  489. "s_string": "proto name used"
  490. }`,
  491. wantErr: true,
  492. }, {
  493. desc: "duplicate field names",
  494. inputMessage: &pb3.JSONNames{},
  495. inputText: `{
  496. "foo_bar": "one",
  497. "foo_bar": "two",
  498. }`,
  499. wantErr: true,
  500. }, {
  501. desc: "null message",
  502. inputMessage: &pb2.Nests{},
  503. inputText: "null",
  504. wantErr: true,
  505. }, {
  506. desc: "proto2 nested message not set",
  507. inputMessage: &pb2.Nests{},
  508. inputText: "{}",
  509. wantMessage: &pb2.Nests{},
  510. }, {
  511. desc: "proto2 nested message set to null",
  512. inputMessage: &pb2.Nests{},
  513. inputText: `{
  514. "optNested": null,
  515. "optgroup": null
  516. }`,
  517. wantMessage: &pb2.Nests{},
  518. }, {
  519. desc: "proto2 nested message set to empty",
  520. inputMessage: &pb2.Nests{},
  521. inputText: `{
  522. "optNested": {},
  523. "optgroup": {}
  524. }`,
  525. wantMessage: &pb2.Nests{
  526. OptNested: &pb2.Nested{},
  527. Optgroup: &pb2.Nests_OptGroup{},
  528. },
  529. }, {
  530. desc: "proto2 nested messages",
  531. inputMessage: &pb2.Nests{},
  532. inputText: `{
  533. "optNested": {
  534. "optString": "nested message",
  535. "optNested": {
  536. "optString": "another nested message"
  537. }
  538. }
  539. }`,
  540. wantMessage: &pb2.Nests{
  541. OptNested: &pb2.Nested{
  542. OptString: scalar.String("nested message"),
  543. OptNested: &pb2.Nested{
  544. OptString: scalar.String("another nested message"),
  545. },
  546. },
  547. },
  548. }, {
  549. desc: "proto2 groups",
  550. inputMessage: &pb2.Nests{},
  551. inputText: `{
  552. "optgroup": {
  553. "optString": "inside a group",
  554. "optNested": {
  555. "optString": "nested message inside a group"
  556. },
  557. "optnestedgroup": {
  558. "optFixed32": 47
  559. }
  560. }
  561. }`,
  562. wantMessage: &pb2.Nests{
  563. Optgroup: &pb2.Nests_OptGroup{
  564. OptString: scalar.String("inside a group"),
  565. OptNested: &pb2.Nested{
  566. OptString: scalar.String("nested message inside a group"),
  567. },
  568. Optnestedgroup: &pb2.Nests_OptGroup_OptNestedGroup{
  569. OptFixed32: scalar.Uint32(47),
  570. },
  571. },
  572. },
  573. }, {
  574. desc: "proto3 nested message not set",
  575. inputMessage: &pb3.Nests{},
  576. inputText: "{}",
  577. wantMessage: &pb3.Nests{},
  578. }, {
  579. desc: "proto3 nested message set to null",
  580. inputMessage: &pb3.Nests{},
  581. inputText: `{"sNested": null}`,
  582. wantMessage: &pb3.Nests{},
  583. }, {
  584. desc: "proto3 nested message set to empty",
  585. inputMessage: &pb3.Nests{},
  586. inputText: `{"sNested": {}}`,
  587. wantMessage: &pb3.Nests{
  588. SNested: &pb3.Nested{},
  589. },
  590. }, {
  591. desc: "proto3 nested message",
  592. inputMessage: &pb3.Nests{},
  593. inputText: `{
  594. "sNested": {
  595. "sString": "nested message",
  596. "sNested": {
  597. "sString": "another nested message"
  598. }
  599. }
  600. }`,
  601. wantMessage: &pb3.Nests{
  602. SNested: &pb3.Nested{
  603. SString: "nested message",
  604. SNested: &pb3.Nested{
  605. SString: "another nested message",
  606. },
  607. },
  608. },
  609. }, {
  610. desc: "message set to non-message",
  611. inputMessage: &pb3.Nests{},
  612. inputText: `"not valid"`,
  613. wantErr: true,
  614. }, {
  615. desc: "nested message set to non-message",
  616. inputMessage: &pb3.Nests{},
  617. inputText: `{"sNested": true}`,
  618. wantErr: true,
  619. }, {
  620. desc: "oneof not set",
  621. inputMessage: &pb3.Oneofs{},
  622. inputText: "{}",
  623. wantMessage: &pb3.Oneofs{},
  624. }, {
  625. desc: "oneof set to empty string",
  626. inputMessage: &pb3.Oneofs{},
  627. inputText: `{"oneofString": ""}`,
  628. wantMessage: &pb3.Oneofs{
  629. Union: &pb3.Oneofs_OneofString{},
  630. },
  631. }, {
  632. desc: "oneof set to string",
  633. inputMessage: &pb3.Oneofs{},
  634. inputText: `{"oneofString": "hello"}`,
  635. wantMessage: &pb3.Oneofs{
  636. Union: &pb3.Oneofs_OneofString{
  637. OneofString: "hello",
  638. },
  639. },
  640. }, {
  641. desc: "oneof set to enum",
  642. inputMessage: &pb3.Oneofs{},
  643. inputText: `{"oneofEnum": "ZERO"}`,
  644. wantMessage: &pb3.Oneofs{
  645. Union: &pb3.Oneofs_OneofEnum{
  646. OneofEnum: pb3.Enum_ZERO,
  647. },
  648. },
  649. }, {
  650. desc: "oneof set to empty message",
  651. inputMessage: &pb3.Oneofs{},
  652. inputText: `{"oneofNested": {}}`,
  653. wantMessage: &pb3.Oneofs{
  654. Union: &pb3.Oneofs_OneofNested{
  655. OneofNested: &pb3.Nested{},
  656. },
  657. },
  658. }, {
  659. desc: "oneof set to message",
  660. inputMessage: &pb3.Oneofs{},
  661. inputText: `{
  662. "oneofNested": {
  663. "sString": "nested message"
  664. }
  665. }`,
  666. wantMessage: &pb3.Oneofs{
  667. Union: &pb3.Oneofs_OneofNested{
  668. OneofNested: &pb3.Nested{
  669. SString: "nested message",
  670. },
  671. },
  672. },
  673. }, {
  674. desc: "repeated null fields",
  675. inputMessage: &pb2.Repeats{},
  676. inputText: `{
  677. "rptString": null,
  678. "rptInt32" : null,
  679. "rptFloat" : null,
  680. "rptBytes" : null
  681. }`,
  682. wantMessage: &pb2.Repeats{},
  683. }, {
  684. desc: "repeated scalars",
  685. inputMessage: &pb2.Repeats{},
  686. inputText: `{
  687. "rptString": ["hello", "world"],
  688. "rptInt32" : [-1, 0, 1],
  689. "rptBool" : [false, true]
  690. }`,
  691. wantMessage: &pb2.Repeats{
  692. RptString: []string{"hello", "world"},
  693. RptInt32: []int32{-1, 0, 1},
  694. RptBool: []bool{false, true},
  695. },
  696. }, {
  697. desc: "repeated enums",
  698. inputMessage: &pb2.Enums{},
  699. inputText: `{
  700. "rptEnum" : ["TEN", 1, 42],
  701. "rptNestedEnum": ["DOS", 2, -47]
  702. }`,
  703. wantMessage: &pb2.Enums{
  704. RptEnum: []pb2.Enum{pb2.Enum_TEN, pb2.Enum_ONE, 42},
  705. RptNestedEnum: []pb2.Enums_NestedEnum{pb2.Enums_DOS, pb2.Enums_DOS, -47},
  706. },
  707. }, {
  708. desc: "repeated messages",
  709. inputMessage: &pb2.Nests{},
  710. inputText: `{
  711. "rptNested": [
  712. {
  713. "optString": "repeat nested one"
  714. },
  715. {
  716. "optString": "repeat nested two",
  717. "optNested": {
  718. "optString": "inside repeat nested two"
  719. }
  720. },
  721. {}
  722. ]
  723. }`,
  724. wantMessage: &pb2.Nests{
  725. RptNested: []*pb2.Nested{
  726. {
  727. OptString: scalar.String("repeat nested one"),
  728. },
  729. {
  730. OptString: scalar.String("repeat nested two"),
  731. OptNested: &pb2.Nested{
  732. OptString: scalar.String("inside repeat nested two"),
  733. },
  734. },
  735. {},
  736. },
  737. },
  738. }, {
  739. desc: "repeated groups",
  740. inputMessage: &pb2.Nests{},
  741. inputText: `{
  742. "rptgroup": [
  743. {
  744. "rptString": ["hello", "world"]
  745. },
  746. {}
  747. ]
  748. }
  749. `,
  750. wantMessage: &pb2.Nests{
  751. Rptgroup: []*pb2.Nests_RptGroup{
  752. {
  753. RptString: []string{"hello", "world"},
  754. },
  755. {},
  756. },
  757. },
  758. }, {
  759. desc: "repeated string contains invalid UTF8",
  760. inputMessage: &pb2.Repeats{},
  761. inputText: `{"rptString": ["` + "abc\xff" + `"]}`,
  762. wantMessage: &pb2.Repeats{
  763. RptString: []string{"abc\xff"},
  764. },
  765. wantErr: true,
  766. }, {
  767. desc: "repeated messages contain invalid UTF8",
  768. inputMessage: &pb2.Nests{},
  769. inputText: `{"rptNested": [{"optString": "` + "abc\xff" + `"}]}`,
  770. wantMessage: &pb2.Nests{
  771. RptNested: []*pb2.Nested{{OptString: scalar.String("abc\xff")}},
  772. },
  773. wantErr: true,
  774. }, {
  775. desc: "repeated scalars contain invalid type",
  776. inputMessage: &pb2.Repeats{},
  777. inputText: `{"rptString": ["hello", null, "world"]}`,
  778. wantErr: true,
  779. }, {
  780. desc: "repeated messages contain invalid type",
  781. inputMessage: &pb2.Nests{},
  782. inputText: `{"rptNested": [{}, null]}`,
  783. wantErr: true,
  784. }, {
  785. desc: "map fields 1",
  786. inputMessage: &pb3.Maps{},
  787. inputText: `{
  788. "int32ToStr": {
  789. "-101": "-101",
  790. "0" : "zero",
  791. "255" : "0xff"
  792. },
  793. "boolToUint32": {
  794. "false": 101,
  795. "true" : "42"
  796. }
  797. }`,
  798. wantMessage: &pb3.Maps{
  799. Int32ToStr: map[int32]string{
  800. -101: "-101",
  801. 0xff: "0xff",
  802. 0: "zero",
  803. },
  804. BoolToUint32: map[bool]uint32{
  805. true: 42,
  806. false: 101,
  807. },
  808. },
  809. }, {
  810. desc: "map fields 2",
  811. inputMessage: &pb3.Maps{},
  812. inputText: `{
  813. "uint64ToEnum": {
  814. "1" : "ONE",
  815. "2" : 2,
  816. "10": 101
  817. }
  818. }`,
  819. wantMessage: &pb3.Maps{
  820. Uint64ToEnum: map[uint64]pb3.Enum{
  821. 1: pb3.Enum_ONE,
  822. 2: pb3.Enum_TWO,
  823. 10: 101,
  824. },
  825. },
  826. }, {
  827. desc: "map fields 3",
  828. inputMessage: &pb3.Maps{},
  829. inputText: `{
  830. "strToNested": {
  831. "nested_one": {
  832. "sString": "nested in a map"
  833. },
  834. "nested_two": {}
  835. }
  836. }`,
  837. wantMessage: &pb3.Maps{
  838. StrToNested: map[string]*pb3.Nested{
  839. "nested_one": {
  840. SString: "nested in a map",
  841. },
  842. "nested_two": {},
  843. },
  844. },
  845. }, {
  846. desc: "map fields 4",
  847. inputMessage: &pb3.Maps{},
  848. inputText: `{
  849. "strToOneofs": {
  850. "nested": {
  851. "oneofNested": {
  852. "sString": "nested oneof in map field value"
  853. }
  854. },
  855. "string": {
  856. "oneofString": "hello"
  857. }
  858. }
  859. }`,
  860. wantMessage: &pb3.Maps{
  861. StrToOneofs: map[string]*pb3.Oneofs{
  862. "string": {
  863. Union: &pb3.Oneofs_OneofString{
  864. OneofString: "hello",
  865. },
  866. },
  867. "nested": {
  868. Union: &pb3.Oneofs_OneofNested{
  869. OneofNested: &pb3.Nested{
  870. SString: "nested oneof in map field value",
  871. },
  872. },
  873. },
  874. },
  875. },
  876. }, {
  877. desc: "map contains duplicate keys",
  878. inputMessage: &pb3.Maps{},
  879. inputText: `{
  880. "int32ToStr": {
  881. "0": "cero",
  882. "0": "zero"
  883. }
  884. }
  885. `,
  886. wantErr: true,
  887. }, {
  888. desc: "map key empty string",
  889. inputMessage: &pb3.Maps{},
  890. inputText: `{
  891. "strToNested": {
  892. "": {}
  893. }
  894. }`,
  895. wantMessage: &pb3.Maps{
  896. StrToNested: map[string]*pb3.Nested{
  897. "": {},
  898. },
  899. },
  900. }, {
  901. desc: "map contains invalid key 1",
  902. inputMessage: &pb3.Maps{},
  903. inputText: `{
  904. "int32ToStr": {
  905. "invalid": "cero"
  906. }`,
  907. wantErr: true,
  908. }, {
  909. desc: "map contains invalid key 2",
  910. inputMessage: &pb3.Maps{},
  911. inputText: `{
  912. "int32ToStr": {
  913. "1.02": "float"
  914. }`,
  915. wantErr: true,
  916. }, {
  917. desc: "map contains invalid key 3",
  918. inputMessage: &pb3.Maps{},
  919. inputText: `{
  920. "int32ToStr": {
  921. "2147483648": "exceeds 32-bit integer max limit"
  922. }`,
  923. wantErr: true,
  924. }, {
  925. desc: "map contains invalid key 4",
  926. inputMessage: &pb3.Maps{},
  927. inputText: `{
  928. "uint64ToEnum": {
  929. "-1": 0
  930. }
  931. }`,
  932. wantErr: true,
  933. }, {
  934. desc: "map contains invalid value",
  935. inputMessage: &pb3.Maps{},
  936. inputText: `{
  937. "int32ToStr": {
  938. "101": true
  939. }`,
  940. wantErr: true,
  941. }, {
  942. desc: "map contains null for scalar value",
  943. inputMessage: &pb3.Maps{},
  944. inputText: `{
  945. "int32ToStr": {
  946. "101": null
  947. }`,
  948. wantErr: true,
  949. }, {
  950. desc: "map contains null for message value",
  951. inputMessage: &pb3.Maps{},
  952. inputText: `{
  953. "strToNested": {
  954. "hello": null
  955. }
  956. }`,
  957. wantErr: true,
  958. }, {
  959. desc: "map contains contains message value with invalid UTF8",
  960. inputMessage: &pb3.Maps{},
  961. inputText: `{
  962. "strToNested": {
  963. "hello": {
  964. "sString": "` + "abc\xff" + `"
  965. }
  966. }
  967. }`,
  968. wantMessage: &pb3.Maps{
  969. StrToNested: map[string]*pb3.Nested{
  970. "hello": {SString: "abc\xff"},
  971. },
  972. },
  973. wantErr: true,
  974. }, {
  975. desc: "map key contains invalid UTF8",
  976. inputMessage: &pb3.Maps{},
  977. inputText: `{
  978. "strToNested": {
  979. "` + "abc\xff" + `": {}
  980. }
  981. }`,
  982. wantMessage: &pb3.Maps{
  983. StrToNested: map[string]*pb3.Nested{
  984. "abc\xff": {},
  985. },
  986. },
  987. wantErr: true,
  988. }, {
  989. desc: "required fields not set",
  990. inputMessage: &pb2.Requireds{},
  991. wantErr: true,
  992. }, {
  993. desc: "required field set",
  994. inputMessage: &pb2.PartialRequired{},
  995. inputText: `{
  996. "reqString": "this is required"
  997. }`,
  998. wantMessage: &pb2.PartialRequired{
  999. ReqString: scalar.String("this is required"),
  1000. },
  1001. }, {
  1002. desc: "required fields partially set",
  1003. inputMessage: &pb2.Requireds{},
  1004. inputText: `{
  1005. "reqBool": false,
  1006. "reqSfixed64": 42,
  1007. "reqString": "hello",
  1008. "reqEnum": "ONE"
  1009. }`,
  1010. wantMessage: &pb2.Requireds{
  1011. ReqBool: scalar.Bool(false),
  1012. ReqSfixed64: scalar.Int64(42),
  1013. ReqString: scalar.String("hello"),
  1014. ReqEnum: pb2.Enum_ONE.Enum(),
  1015. },
  1016. wantErr: true,
  1017. }, {
  1018. desc: "required fields partially set with AllowPartial",
  1019. umo: jsonpb.UnmarshalOptions{AllowPartial: true},
  1020. inputMessage: &pb2.Requireds{},
  1021. inputText: `{
  1022. "reqBool": false,
  1023. "reqSfixed64": 42,
  1024. "reqString": "hello",
  1025. "reqEnum": "ONE"
  1026. }`,
  1027. wantMessage: &pb2.Requireds{
  1028. ReqBool: scalar.Bool(false),
  1029. ReqSfixed64: scalar.Int64(42),
  1030. ReqString: scalar.String("hello"),
  1031. ReqEnum: pb2.Enum_ONE.Enum(),
  1032. },
  1033. }, {
  1034. desc: "required fields all set",
  1035. inputMessage: &pb2.Requireds{},
  1036. inputText: `{
  1037. "reqBool": false,
  1038. "reqSfixed64": 42,
  1039. "reqDouble": 1.23,
  1040. "reqString": "hello",
  1041. "reqEnum": "ONE",
  1042. "reqNested": {}
  1043. }`,
  1044. wantMessage: &pb2.Requireds{
  1045. ReqBool: scalar.Bool(false),
  1046. ReqSfixed64: scalar.Int64(42),
  1047. ReqDouble: scalar.Float64(1.23),
  1048. ReqString: scalar.String("hello"),
  1049. ReqEnum: pb2.Enum_ONE.Enum(),
  1050. ReqNested: &pb2.Nested{},
  1051. },
  1052. }, {
  1053. desc: "indirect required field",
  1054. inputMessage: &pb2.IndirectRequired{},
  1055. inputText: `{
  1056. "optNested": {}
  1057. }`,
  1058. wantMessage: &pb2.IndirectRequired{
  1059. OptNested: &pb2.NestedWithRequired{},
  1060. },
  1061. wantErr: true,
  1062. }, {
  1063. desc: "indirect required field with AllowPartial",
  1064. umo: jsonpb.UnmarshalOptions{AllowPartial: true},
  1065. inputMessage: &pb2.IndirectRequired{},
  1066. inputText: `{
  1067. "optNested": {}
  1068. }`,
  1069. wantMessage: &pb2.IndirectRequired{
  1070. OptNested: &pb2.NestedWithRequired{},
  1071. },
  1072. }, {
  1073. desc: "indirect required field in repeated",
  1074. inputMessage: &pb2.IndirectRequired{},
  1075. inputText: `{
  1076. "rptNested": [
  1077. {"reqString": "one"},
  1078. {}
  1079. ]
  1080. }`,
  1081. wantMessage: &pb2.IndirectRequired{
  1082. RptNested: []*pb2.NestedWithRequired{
  1083. {
  1084. ReqString: scalar.String("one"),
  1085. },
  1086. {},
  1087. },
  1088. },
  1089. wantErr: true,
  1090. }, {
  1091. desc: "indirect required field in repeated with AllowPartial",
  1092. umo: jsonpb.UnmarshalOptions{AllowPartial: true},
  1093. inputMessage: &pb2.IndirectRequired{},
  1094. inputText: `{
  1095. "rptNested": [
  1096. {"reqString": "one"},
  1097. {}
  1098. ]
  1099. }`,
  1100. wantMessage: &pb2.IndirectRequired{
  1101. RptNested: []*pb2.NestedWithRequired{
  1102. {
  1103. ReqString: scalar.String("one"),
  1104. },
  1105. {},
  1106. },
  1107. },
  1108. }, {
  1109. desc: "indirect required field in map",
  1110. inputMessage: &pb2.IndirectRequired{},
  1111. inputText: `{
  1112. "strToNested": {
  1113. "missing": {},
  1114. "contains": {
  1115. "reqString": "here"
  1116. }
  1117. }
  1118. }`,
  1119. wantMessage: &pb2.IndirectRequired{
  1120. StrToNested: map[string]*pb2.NestedWithRequired{
  1121. "missing": &pb2.NestedWithRequired{},
  1122. "contains": &pb2.NestedWithRequired{
  1123. ReqString: scalar.String("here"),
  1124. },
  1125. },
  1126. },
  1127. wantErr: true,
  1128. }, {
  1129. desc: "indirect required field in map with AllowPartial",
  1130. umo: jsonpb.UnmarshalOptions{AllowPartial: true},
  1131. inputMessage: &pb2.IndirectRequired{},
  1132. inputText: `{
  1133. "strToNested": {
  1134. "missing": {},
  1135. "contains": {
  1136. "reqString": "here"
  1137. }
  1138. }
  1139. }`,
  1140. wantMessage: &pb2.IndirectRequired{
  1141. StrToNested: map[string]*pb2.NestedWithRequired{
  1142. "missing": &pb2.NestedWithRequired{},
  1143. "contains": &pb2.NestedWithRequired{
  1144. ReqString: scalar.String("here"),
  1145. },
  1146. },
  1147. },
  1148. }, {
  1149. desc: "indirect required field in oneof",
  1150. inputMessage: &pb2.IndirectRequired{},
  1151. inputText: `{
  1152. "oneofNested": {}
  1153. }`,
  1154. wantMessage: &pb2.IndirectRequired{
  1155. Union: &pb2.IndirectRequired_OneofNested{
  1156. OneofNested: &pb2.NestedWithRequired{},
  1157. },
  1158. },
  1159. wantErr: true,
  1160. }, {
  1161. desc: "indirect required field in oneof with AllowPartial",
  1162. umo: jsonpb.UnmarshalOptions{AllowPartial: true},
  1163. inputMessage: &pb2.IndirectRequired{},
  1164. inputText: `{
  1165. "oneofNested": {}
  1166. }`,
  1167. wantMessage: &pb2.IndirectRequired{
  1168. Union: &pb2.IndirectRequired_OneofNested{
  1169. OneofNested: &pb2.NestedWithRequired{},
  1170. },
  1171. },
  1172. }, {
  1173. desc: "extensions of non-repeated fields",
  1174. inputMessage: &pb2.Extensions{},
  1175. inputText: `{
  1176. "optString": "non-extension field",
  1177. "optBool": true,
  1178. "optInt32": 42,
  1179. "[pb2.opt_ext_bool]": true,
  1180. "[pb2.opt_ext_nested]": {
  1181. "optString": "nested in an extension",
  1182. "optNested": {
  1183. "optString": "another nested in an extension"
  1184. }
  1185. },
  1186. "[pb2.opt_ext_string]": "extension field",
  1187. "[pb2.opt_ext_enum]": "TEN"
  1188. }`,
  1189. wantMessage: func() proto.Message {
  1190. m := &pb2.Extensions{
  1191. OptString: scalar.String("non-extension field"),
  1192. OptBool: scalar.Bool(true),
  1193. OptInt32: scalar.Int32(42),
  1194. }
  1195. setExtension(m, pb2.E_OptExtBool, true)
  1196. setExtension(m, pb2.E_OptExtString, "extension field")
  1197. setExtension(m, pb2.E_OptExtEnum, pb2.Enum_TEN)
  1198. setExtension(m, pb2.E_OptExtNested, &pb2.Nested{
  1199. OptString: scalar.String("nested in an extension"),
  1200. OptNested: &pb2.Nested{
  1201. OptString: scalar.String("another nested in an extension"),
  1202. },
  1203. })
  1204. return m
  1205. }(),
  1206. }, {
  1207. desc: "extensions of repeated fields",
  1208. inputMessage: &pb2.Extensions{},
  1209. inputText: `{
  1210. "[pb2.rpt_ext_enum]": ["TEN", 101, "ONE"],
  1211. "[pb2.rpt_ext_fixed32]": [42, 47],
  1212. "[pb2.rpt_ext_nested]": [
  1213. {"optString": "one"},
  1214. {"optString": "two"},
  1215. {"optString": "three"}
  1216. ]
  1217. }`,
  1218. wantMessage: func() proto.Message {
  1219. m := &pb2.Extensions{}
  1220. setExtension(m, pb2.E_RptExtEnum, &[]pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
  1221. setExtension(m, pb2.E_RptExtFixed32, &[]uint32{42, 47})
  1222. setExtension(m, pb2.E_RptExtNested, &[]*pb2.Nested{
  1223. &pb2.Nested{OptString: scalar.String("one")},
  1224. &pb2.Nested{OptString: scalar.String("two")},
  1225. &pb2.Nested{OptString: scalar.String("three")},
  1226. })
  1227. return m
  1228. }(),
  1229. }, {
  1230. desc: "extensions of non-repeated fields in another message",
  1231. inputMessage: &pb2.Extensions{},
  1232. inputText: `{
  1233. "[pb2.ExtensionsContainer.opt_ext_bool]": true,
  1234. "[pb2.ExtensionsContainer.opt_ext_enum]": "TEN",
  1235. "[pb2.ExtensionsContainer.opt_ext_nested]": {
  1236. "optString": "nested in an extension",
  1237. "optNested": {
  1238. "optString": "another nested in an extension"
  1239. }
  1240. },
  1241. "[pb2.ExtensionsContainer.opt_ext_string]": "extension field"
  1242. }`,
  1243. wantMessage: func() proto.Message {
  1244. m := &pb2.Extensions{}
  1245. setExtension(m, pb2.E_ExtensionsContainer_OptExtBool, true)
  1246. setExtension(m, pb2.E_ExtensionsContainer_OptExtString, "extension field")
  1247. setExtension(m, pb2.E_ExtensionsContainer_OptExtEnum, pb2.Enum_TEN)
  1248. setExtension(m, pb2.E_ExtensionsContainer_OptExtNested, &pb2.Nested{
  1249. OptString: scalar.String("nested in an extension"),
  1250. OptNested: &pb2.Nested{
  1251. OptString: scalar.String("another nested in an extension"),
  1252. },
  1253. })
  1254. return m
  1255. }(),
  1256. }, {
  1257. desc: "extensions of repeated fields in another message",
  1258. inputMessage: &pb2.Extensions{},
  1259. inputText: `{
  1260. "optString": "non-extension field",
  1261. "optBool": true,
  1262. "optInt32": 42,
  1263. "[pb2.ExtensionsContainer.rpt_ext_nested]": [
  1264. {"optString": "one"},
  1265. {"optString": "two"},
  1266. {"optString": "three"}
  1267. ],
  1268. "[pb2.ExtensionsContainer.rpt_ext_enum]": ["TEN", 101, "ONE"],
  1269. "[pb2.ExtensionsContainer.rpt_ext_string]": ["hello", "world"]
  1270. }`,
  1271. wantMessage: func() proto.Message {
  1272. m := &pb2.Extensions{
  1273. OptString: scalar.String("non-extension field"),
  1274. OptBool: scalar.Bool(true),
  1275. OptInt32: scalar.Int32(42),
  1276. }
  1277. setExtension(m, pb2.E_ExtensionsContainer_RptExtEnum, &[]pb2.Enum{pb2.Enum_TEN, 101, pb2.Enum_ONE})
  1278. setExtension(m, pb2.E_ExtensionsContainer_RptExtString, &[]string{"hello", "world"})
  1279. setExtension(m, pb2.E_ExtensionsContainer_RptExtNested, &[]*pb2.Nested{
  1280. &pb2.Nested{OptString: scalar.String("one")},
  1281. &pb2.Nested{OptString: scalar.String("two")},
  1282. &pb2.Nested{OptString: scalar.String("three")},
  1283. })
  1284. return m
  1285. }(),
  1286. }, {
  1287. desc: "invalid extension field name",
  1288. inputMessage: &pb2.Extensions{},
  1289. inputText: `{ "[pb2.invalid_message_field]": true }`,
  1290. wantErr: true,
  1291. }, {
  1292. desc: "MessageSet",
  1293. inputMessage: &pb2.MessageSet{},
  1294. inputText: `{
  1295. "[pb2.MessageSetExtension]": {
  1296. "optString": "a messageset extension"
  1297. },
  1298. "[pb2.MessageSetExtension.ext_nested]": {
  1299. "optString": "just a regular extension"
  1300. },
  1301. "[pb2.MessageSetExtension.not_message_set_extension]": {
  1302. "optString": "not a messageset extension"
  1303. }
  1304. }`,
  1305. wantMessage: func() proto.Message {
  1306. m := &pb2.MessageSet{}
  1307. setExtension(m, pb2.E_MessageSetExtension_MessageSetExtension, &pb2.MessageSetExtension{
  1308. OptString: scalar.String("a messageset extension"),
  1309. })
  1310. setExtension(m, pb2.E_MessageSetExtension_NotMessageSetExtension, &pb2.MessageSetExtension{
  1311. OptString: scalar.String("not a messageset extension"),
  1312. })
  1313. setExtension(m, pb2.E_MessageSetExtension_ExtNested, &pb2.Nested{
  1314. OptString: scalar.String("just a regular extension"),
  1315. })
  1316. return m
  1317. }(),
  1318. }, {
  1319. desc: "extension field set to null",
  1320. inputMessage: &pb2.Extensions{},
  1321. inputText: `{
  1322. "[pb2.ExtensionsContainer.opt_ext_bool]": null,
  1323. "[pb2.ExtensionsContainer.opt_ext_nested]": null
  1324. }`,
  1325. wantMessage: func() proto.Message {
  1326. m := &pb2.Extensions{}
  1327. setExtension(m, pb2.E_ExtensionsContainer_OptExtBool, nil)
  1328. setExtension(m, pb2.E_ExtensionsContainer_OptExtNested, nil)
  1329. return m
  1330. }(),
  1331. }, {
  1332. desc: "extensions of repeated field contains null",
  1333. inputMessage: &pb2.Extensions{},
  1334. inputText: `{
  1335. "[pb2.ExtensionsContainer.rpt_ext_nested]": [
  1336. {"optString": "one"},
  1337. null,
  1338. {"optString": "three"}
  1339. ],
  1340. }`,
  1341. wantErr: true,
  1342. }, {
  1343. desc: "not real MessageSet 1",
  1344. inputMessage: &pb2.FakeMessageSet{},
  1345. inputText: `{
  1346. "[pb2.FakeMessageSetExtension.message_set_extension]": {
  1347. "optString": "not a messageset extension"
  1348. }
  1349. }`,
  1350. wantMessage: func() proto.Message {
  1351. m := &pb2.FakeMessageSet{}
  1352. setExtension(m, pb2.E_FakeMessageSetExtension_MessageSetExtension, &pb2.FakeMessageSetExtension{
  1353. OptString: scalar.String("not a messageset extension"),
  1354. })
  1355. return m
  1356. }(),
  1357. }, {
  1358. desc: "not real MessageSet 2",
  1359. inputMessage: &pb2.FakeMessageSet{},
  1360. inputText: `{
  1361. "[pb2.FakeMessageSetExtension]": {
  1362. "optString": "not a messageset extension"
  1363. }
  1364. }`,
  1365. wantErr: true,
  1366. }, {
  1367. desc: "not real MessageSet 3",
  1368. inputMessage: &pb2.MessageSet{},
  1369. inputText: `{
  1370. "[pb2.message_set_extension]": {
  1371. "optString": "another not a messageset extension"
  1372. }
  1373. }`,
  1374. wantMessage: func() proto.Message {
  1375. m := &pb2.MessageSet{}
  1376. setExtension(m, pb2.E_MessageSetExtension, &pb2.FakeMessageSetExtension{
  1377. OptString: scalar.String("another not a messageset extension"),
  1378. })
  1379. return m
  1380. }(),
  1381. }, {
  1382. desc: "Empty",
  1383. inputMessage: &knownpb.Empty{},
  1384. inputText: `{}`,
  1385. wantMessage: &knownpb.Empty{},
  1386. }, {
  1387. desc: "Empty contains unknown",
  1388. inputMessage: &knownpb.Empty{},
  1389. inputText: `{"unknown": null}`,
  1390. wantErr: true,
  1391. }, {
  1392. desc: "BoolValue false",
  1393. inputMessage: &knownpb.BoolValue{},
  1394. inputText: `false`,
  1395. wantMessage: &knownpb.BoolValue{},
  1396. }, {
  1397. desc: "BoolValue true",
  1398. inputMessage: &knownpb.BoolValue{},
  1399. inputText: `true`,
  1400. wantMessage: &knownpb.BoolValue{Value: true},
  1401. }, {
  1402. desc: "BoolValue invalid value",
  1403. inputMessage: &knownpb.BoolValue{},
  1404. inputText: `{}`,
  1405. wantErr: true,
  1406. }, {
  1407. desc: "Int32Value",
  1408. inputMessage: &knownpb.Int32Value{},
  1409. inputText: `42`,
  1410. wantMessage: &knownpb.Int32Value{Value: 42},
  1411. }, {
  1412. desc: "Int32Value in JSON string",
  1413. inputMessage: &knownpb.Int32Value{},
  1414. inputText: `"1.23e3"`,
  1415. wantMessage: &knownpb.Int32Value{Value: 1230},
  1416. }, {
  1417. desc: "Int64Value",
  1418. inputMessage: &knownpb.Int64Value{},
  1419. inputText: `"42"`,
  1420. wantMessage: &knownpb.Int64Value{Value: 42},
  1421. }, {
  1422. desc: "UInt32Value",
  1423. inputMessage: &knownpb.UInt32Value{},
  1424. inputText: `42`,
  1425. wantMessage: &knownpb.UInt32Value{Value: 42},
  1426. }, {
  1427. desc: "UInt64Value",
  1428. inputMessage: &knownpb.UInt64Value{},
  1429. inputText: `"42"`,
  1430. wantMessage: &knownpb.UInt64Value{Value: 42},
  1431. }, {
  1432. desc: "FloatValue",
  1433. inputMessage: &knownpb.FloatValue{},
  1434. inputText: `1.02`,
  1435. wantMessage: &knownpb.FloatValue{Value: 1.02},
  1436. }, {
  1437. desc: "FloatValue exceeds max limit",
  1438. inputMessage: &knownpb.FloatValue{},
  1439. inputText: `1.23+40`,
  1440. wantErr: true,
  1441. }, {
  1442. desc: "FloatValue Infinity",
  1443. inputMessage: &knownpb.FloatValue{},
  1444. inputText: `"-Infinity"`,
  1445. wantMessage: &knownpb.FloatValue{Value: float32(math.Inf(-1))},
  1446. }, {
  1447. desc: "DoubleValue",
  1448. inputMessage: &knownpb.DoubleValue{},
  1449. inputText: `1.02`,
  1450. wantMessage: &knownpb.DoubleValue{Value: 1.02},
  1451. }, {
  1452. desc: "DoubleValue Infinity",
  1453. inputMessage: &knownpb.DoubleValue{},
  1454. inputText: `"Infinity"`,
  1455. wantMessage: &knownpb.DoubleValue{Value: math.Inf(+1)},
  1456. }, {
  1457. desc: "StringValue empty",
  1458. inputMessage: &knownpb.StringValue{},
  1459. inputText: `""`,
  1460. wantMessage: &knownpb.StringValue{},
  1461. }, {
  1462. desc: "StringValue",
  1463. inputMessage: &knownpb.StringValue{},
  1464. inputText: `"谷歌"`,
  1465. wantMessage: &knownpb.StringValue{Value: "谷歌"},
  1466. }, {
  1467. desc: "StringValue with invalid UTF8 error",
  1468. inputMessage: &knownpb.StringValue{},
  1469. inputText: "\"abc\xff\"",
  1470. wantMessage: &knownpb.StringValue{Value: "abc\xff"},
  1471. wantErr: true,
  1472. }, {
  1473. desc: "StringValue field with invalid UTF8 error",
  1474. inputMessage: &pb2.KnownTypes{},
  1475. inputText: "{\n \"optString\": \"abc\xff\"\n}",
  1476. wantMessage: &pb2.KnownTypes{
  1477. OptString: &knownpb.StringValue{Value: "abc\xff"},
  1478. },
  1479. wantErr: true,
  1480. }, {
  1481. desc: "NullValue field with JSON null",
  1482. inputMessage: &pb2.KnownTypes{},
  1483. inputText: `{
  1484. "optNull": null
  1485. }`,
  1486. wantMessage: &pb2.KnownTypes{OptNull: new(knownpb.NullValue)},
  1487. }, {
  1488. desc: "NullValue field with string",
  1489. inputMessage: &pb2.KnownTypes{},
  1490. inputText: `{
  1491. "optNull": "NULL_VALUE"
  1492. }`,
  1493. wantMessage: &pb2.KnownTypes{OptNull: new(knownpb.NullValue)},
  1494. }, {
  1495. desc: "BytesValue",
  1496. inputMessage: &knownpb.BytesValue{},
  1497. inputText: `"aGVsbG8="`,
  1498. wantMessage: &knownpb.BytesValue{Value: []byte("hello")},
  1499. }, {
  1500. desc: "Value null",
  1501. inputMessage: &knownpb.Value{},
  1502. inputText: `null`,
  1503. wantMessage: &knownpb.Value{Kind: &knownpb.Value_NullValue{}},
  1504. }, {
  1505. desc: "Value field null",
  1506. inputMessage: &pb2.KnownTypes{},
  1507. inputText: `{
  1508. "optValue": null
  1509. }`,
  1510. wantMessage: &pb2.KnownTypes{
  1511. OptValue: &knownpb.Value{Kind: &knownpb.Value_NullValue{}},
  1512. },
  1513. }, {
  1514. desc: "Value bool",
  1515. inputMessage: &knownpb.Value{},
  1516. inputText: `false`,
  1517. wantMessage: &knownpb.Value{Kind: &knownpb.Value_BoolValue{}},
  1518. }, {
  1519. desc: "Value field bool",
  1520. inputMessage: &pb2.KnownTypes{},
  1521. inputText: `{
  1522. "optValue": true
  1523. }`,
  1524. wantMessage: &pb2.KnownTypes{
  1525. OptValue: &knownpb.Value{Kind: &knownpb.Value_BoolValue{true}},
  1526. },
  1527. }, {
  1528. desc: "Value number",
  1529. inputMessage: &knownpb.Value{},
  1530. inputText: `1.02`,
  1531. wantMessage: &knownpb.Value{Kind: &knownpb.Value_NumberValue{1.02}},
  1532. }, {
  1533. desc: "Value field number",
  1534. inputMessage: &pb2.KnownTypes{},
  1535. inputText: `{
  1536. "optValue": 1.02
  1537. }`,
  1538. wantMessage: &pb2.KnownTypes{
  1539. OptValue: &knownpb.Value{Kind: &knownpb.Value_NumberValue{1.02}},
  1540. },
  1541. }, {
  1542. desc: "Value string",
  1543. inputMessage: &knownpb.Value{},
  1544. inputText: `"hello"`,
  1545. wantMessage: &knownpb.Value{Kind: &knownpb.Value_StringValue{"hello"}},
  1546. }, {
  1547. desc: "Value string with invalid UTF8",
  1548. inputMessage: &knownpb.Value{},
  1549. inputText: "\"\xff\"",
  1550. wantMessage: &knownpb.Value{Kind: &knownpb.Value_StringValue{"\xff"}},
  1551. wantErr: true,
  1552. }, {
  1553. desc: "Value field string",
  1554. inputMessage: &pb2.KnownTypes{},
  1555. inputText: `{
  1556. "optValue": "NaN"
  1557. }`,
  1558. wantMessage: &pb2.KnownTypes{
  1559. OptValue: &knownpb.Value{Kind: &knownpb.Value_StringValue{"NaN"}},
  1560. },
  1561. }, {
  1562. desc: "Value field string with invalid UTF8",
  1563. inputMessage: &pb2.KnownTypes{},
  1564. inputText: `{
  1565. "optValue": "` + "\xff" + `"
  1566. }`,
  1567. wantMessage: &pb2.KnownTypes{
  1568. OptValue: &knownpb.Value{Kind: &knownpb.Value_StringValue{"\xff"}},
  1569. },
  1570. wantErr: true,
  1571. }, {
  1572. desc: "Value empty struct",
  1573. inputMessage: &knownpb.Value{},
  1574. inputText: `{}`,
  1575. wantMessage: &knownpb.Value{
  1576. Kind: &knownpb.Value_StructValue{
  1577. &knownpb.Struct{Fields: map[string]*knownpb.Value{}},
  1578. },
  1579. },
  1580. }, {
  1581. desc: "Value struct",
  1582. inputMessage: &knownpb.Value{},
  1583. inputText: `{
  1584. "string": "hello",
  1585. "number": 123,
  1586. "null": null,
  1587. "bool": false,
  1588. "struct": {
  1589. "string": "world"
  1590. },
  1591. "list": []
  1592. }`,
  1593. wantMessage: &knownpb.Value{
  1594. Kind: &knownpb.Value_StructValue{
  1595. &knownpb.Struct{
  1596. Fields: map[string]*knownpb.Value{
  1597. "string": {Kind: &knownpb.Value_StringValue{"hello"}},
  1598. "number": {Kind: &knownpb.Value_NumberValue{123}},
  1599. "null": {Kind: &knownpb.Value_NullValue{}},
  1600. "bool": {Kind: &knownpb.Value_BoolValue{false}},
  1601. "struct": {
  1602. Kind: &knownpb.Value_StructValue{
  1603. &knownpb.Struct{
  1604. Fields: map[string]*knownpb.Value{
  1605. "string": {Kind: &knownpb.Value_StringValue{"world"}},
  1606. },
  1607. },
  1608. },
  1609. },
  1610. "list": {
  1611. Kind: &knownpb.Value_ListValue{&knownpb.ListValue{}},
  1612. },
  1613. },
  1614. },
  1615. },
  1616. },
  1617. }, {
  1618. desc: "Value struct with invalid UTF8 string",
  1619. inputMessage: &knownpb.Value{},
  1620. inputText: "{\"string\": \"abc\xff\"}",
  1621. wantMessage: &knownpb.Value{
  1622. Kind: &knownpb.Value_StructValue{
  1623. &knownpb.Struct{
  1624. Fields: map[string]*knownpb.Value{
  1625. "string": {Kind: &knownpb.Value_StringValue{"abc\xff"}},
  1626. },
  1627. },
  1628. },
  1629. },
  1630. wantErr: true,
  1631. }, {
  1632. desc: "Value field struct",
  1633. inputMessage: &pb2.KnownTypes{},
  1634. inputText: `{
  1635. "optValue": {
  1636. "string": "hello"
  1637. }
  1638. }`,
  1639. wantMessage: &pb2.KnownTypes{
  1640. OptValue: &knownpb.Value{
  1641. Kind: &knownpb.Value_StructValue{
  1642. &knownpb.Struct{
  1643. Fields: map[string]*knownpb.Value{
  1644. "string": {Kind: &knownpb.Value_StringValue{"hello"}},
  1645. },
  1646. },
  1647. },
  1648. },
  1649. },
  1650. }, {
  1651. desc: "Value empty list",
  1652. inputMessage: &knownpb.Value{},
  1653. inputText: `[]`,
  1654. wantMessage: &knownpb.Value{
  1655. Kind: &knownpb.Value_ListValue{
  1656. &knownpb.ListValue{Values: []*knownpb.Value{}},
  1657. },
  1658. },
  1659. }, {
  1660. desc: "Value list",
  1661. inputMessage: &knownpb.Value{},
  1662. inputText: `[
  1663. "string",
  1664. 123,
  1665. null,
  1666. true,
  1667. {},
  1668. [
  1669. "string",
  1670. 1.23,
  1671. null,
  1672. false
  1673. ]
  1674. ]`,
  1675. wantMessage: &knownpb.Value{
  1676. Kind: &knownpb.Value_ListValue{
  1677. &knownpb.ListValue{
  1678. Values: []*knownpb.Value{
  1679. {Kind: &knownpb.Value_StringValue{"string"}},
  1680. {Kind: &knownpb.Value_NumberValue{123}},
  1681. {Kind: &knownpb.Value_NullValue{}},
  1682. {Kind: &knownpb.Value_BoolValue{true}},
  1683. {Kind: &knownpb.Value_StructValue{&knownpb.Struct{}}},
  1684. {
  1685. Kind: &knownpb.Value_ListValue{
  1686. &knownpb.ListValue{
  1687. Values: []*knownpb.Value{
  1688. {Kind: &knownpb.Value_StringValue{"string"}},
  1689. {Kind: &knownpb.Value_NumberValue{1.23}},
  1690. {Kind: &knownpb.Value_NullValue{}},
  1691. {Kind: &knownpb.Value_BoolValue{false}},
  1692. },
  1693. },
  1694. },
  1695. },
  1696. },
  1697. },
  1698. },
  1699. },
  1700. }, {
  1701. desc: "Value list with invalid UTF8 string",
  1702. inputMessage: &knownpb.Value{},
  1703. inputText: "[\"abc\xff\"]",
  1704. wantMessage: &knownpb.Value{
  1705. Kind: &knownpb.Value_ListValue{
  1706. &knownpb.ListValue{
  1707. Values: []*knownpb.Value{
  1708. {Kind: &knownpb.Value_StringValue{"abc\xff"}},
  1709. },
  1710. },
  1711. },
  1712. },
  1713. wantErr: true,
  1714. }, {
  1715. desc: "Value field list with invalid UTF8 string",
  1716. inputMessage: &pb2.KnownTypes{},
  1717. inputText: `{
  1718. "optValue": [ "` + "abc\xff" + `"]
  1719. }`,
  1720. wantMessage: &pb2.KnownTypes{
  1721. OptValue: &knownpb.Value{
  1722. Kind: &knownpb.Value_ListValue{
  1723. &knownpb.ListValue{
  1724. Values: []*knownpb.Value{
  1725. {Kind: &knownpb.Value_StringValue{"abc\xff"}},
  1726. },
  1727. },
  1728. },
  1729. },
  1730. },
  1731. wantErr: true,
  1732. }, {
  1733. desc: "Duration empty string",
  1734. inputMessage: &knownpb.Duration{},
  1735. inputText: `""`,
  1736. wantErr: true,
  1737. }, {
  1738. desc: "Duration with secs",
  1739. inputMessage: &knownpb.Duration{},
  1740. inputText: `"3s"`,
  1741. wantMessage: &knownpb.Duration{Seconds: 3},
  1742. }, {
  1743. desc: "Duration with escaped unicode",
  1744. inputMessage: &knownpb.Duration{},
  1745. inputText: `"\u0033s"`,
  1746. wantMessage: &knownpb.Duration{Seconds: 3},
  1747. }, {
  1748. desc: "Duration with -secs",
  1749. inputMessage: &knownpb.Duration{},
  1750. inputText: `"-3s"`,
  1751. wantMessage: &knownpb.Duration{Seconds: -3},
  1752. }, {
  1753. desc: "Duration with plus sign",
  1754. inputMessage: &knownpb.Duration{},
  1755. inputText: `"+3s"`,
  1756. wantMessage: &knownpb.Duration{Seconds: 3},
  1757. }, {
  1758. desc: "Duration with nanos",
  1759. inputMessage: &knownpb.Duration{},
  1760. inputText: `"0.001s"`,
  1761. wantMessage: &knownpb.Duration{Nanos: 1e6},
  1762. }, {
  1763. desc: "Duration with -nanos",
  1764. inputMessage: &knownpb.Duration{},
  1765. inputText: `"-0.001s"`,
  1766. wantMessage: &knownpb.Duration{Nanos: -1e6},
  1767. }, {
  1768. desc: "Duration with -nanos",
  1769. inputMessage: &knownpb.Duration{},
  1770. inputText: `"-.001s"`,
  1771. wantMessage: &knownpb.Duration{Nanos: -1e6},
  1772. }, {
  1773. desc: "Duration with +nanos",
  1774. inputMessage: &knownpb.Duration{},
  1775. inputText: `"+.001s"`,
  1776. wantMessage: &knownpb.Duration{Nanos: 1e6},
  1777. }, {
  1778. desc: "Duration with -secs -nanos",
  1779. inputMessage: &knownpb.Duration{},
  1780. inputText: `"-123.000000450s"`,
  1781. wantMessage: &knownpb.Duration{Seconds: -123, Nanos: -450},
  1782. }, {
  1783. desc: "Duration with large secs",
  1784. inputMessage: &knownpb.Duration{},
  1785. inputText: `"10000000000.000000001s"`,
  1786. wantMessage: &knownpb.Duration{Seconds: 1e10, Nanos: 1},
  1787. }, {
  1788. desc: "Duration with decimal without fractional",
  1789. inputMessage: &knownpb.Duration{},
  1790. inputText: `"3.s"`,
  1791. wantMessage: &knownpb.Duration{Seconds: 3},
  1792. }, {
  1793. desc: "Duration with decimal without integer",
  1794. inputMessage: &knownpb.Duration{},
  1795. inputText: `"0.5s"`,
  1796. wantMessage: &knownpb.Duration{Nanos: 5e8},
  1797. }, {
  1798. desc: "Duration with +secs out of range",
  1799. inputMessage: &knownpb.Duration{},
  1800. inputText: `"315576000001s"`,
  1801. wantErr: true,
  1802. }, {
  1803. desc: "Duration with -secs out of range",
  1804. inputMessage: &knownpb.Duration{},
  1805. inputText: `"-315576000001s"`,
  1806. wantErr: true,
  1807. }, {
  1808. desc: "Duration with nanos beyond 9 digits",
  1809. inputMessage: &knownpb.Duration{},
  1810. inputText: `"0.1000000000s"`,
  1811. wantErr: true,
  1812. }, {
  1813. desc: "Duration without suffix s",
  1814. inputMessage: &knownpb.Duration{},
  1815. inputText: `"123"`,
  1816. wantErr: true,
  1817. }, {
  1818. desc: "Duration invalid signed fraction",
  1819. inputMessage: &knownpb.Duration{},
  1820. inputText: `"123.+123s"`,
  1821. wantErr: true,
  1822. }, {
  1823. desc: "Duration invalid multiple .",
  1824. inputMessage: &knownpb.Duration{},
  1825. inputText: `"123.123.s"`,
  1826. wantErr: true,
  1827. }, {
  1828. desc: "Duration invalid integer",
  1829. inputMessage: &knownpb.Duration{},
  1830. inputText: `"01s"`,
  1831. wantErr: true,
  1832. }, {
  1833. desc: "Timestamp zero",
  1834. inputMessage: &knownpb.Timestamp{},
  1835. inputText: `"1970-01-01T00:00:00Z"`,
  1836. wantMessage: &knownpb.Timestamp{},
  1837. }, {
  1838. desc: "Timestamp with tz adjustment",
  1839. inputMessage: &knownpb.Timestamp{},
  1840. inputText: `"1970-01-01T00:00:00+01:00"`,
  1841. wantMessage: &knownpb.Timestamp{Seconds: -3600},
  1842. }, {
  1843. desc: "Timestamp UTC",
  1844. inputMessage: &knownpb.Timestamp{},
  1845. inputText: `"2019-03-19T23:03:21Z"`,
  1846. wantMessage: &knownpb.Timestamp{Seconds: 1553036601},
  1847. }, {
  1848. desc: "Timestamp with escaped unicode",
  1849. inputMessage: &knownpb.Timestamp{},
  1850. inputText: `"2019-0\u0033-19T23:03:21Z"`,
  1851. wantMessage: &knownpb.Timestamp{Seconds: 1553036601},
  1852. }, {
  1853. desc: "Timestamp with nanos",
  1854. inputMessage: &knownpb.Timestamp{},
  1855. inputText: `"2019-03-19T23:03:21.000000001Z"`,
  1856. wantMessage: &knownpb.Timestamp{Seconds: 1553036601, Nanos: 1},
  1857. }, {
  1858. desc: "Timestamp upper limit",
  1859. inputMessage: &knownpb.Timestamp{},
  1860. inputText: `"9999-12-31T23:59:59.999999999Z"`,
  1861. wantMessage: &knownpb.Timestamp{Seconds: 253402300799, Nanos: 999999999},
  1862. }, {
  1863. desc: "Timestamp above upper limit",
  1864. inputMessage: &knownpb.Timestamp{},
  1865. inputText: `"9999-12-31T23:59:59-01:00"`,
  1866. wantErr: true,
  1867. }, {
  1868. desc: "Timestamp lower limit",
  1869. inputMessage: &knownpb.Timestamp{},
  1870. inputText: `"0001-01-01T00:00:00Z"`,
  1871. wantMessage: &knownpb.Timestamp{Seconds: -62135596800},
  1872. }, {
  1873. desc: "Timestamp below lower limit",
  1874. inputMessage: &knownpb.Timestamp{},
  1875. inputText: `"0001-01-01T00:00:00+01:00"`,
  1876. wantErr: true,
  1877. }, {
  1878. desc: "Timestamp with nanos beyond 9 digits",
  1879. inputMessage: &knownpb.Timestamp{},
  1880. inputText: `"1970-01-01T00:00:00.0000000001Z"`,
  1881. wantErr: true,
  1882. }, {
  1883. desc: "FieldMask empty",
  1884. inputMessage: &knownpb.FieldMask{},
  1885. inputText: `""`,
  1886. wantMessage: &knownpb.FieldMask{Paths: []string{}},
  1887. }, {
  1888. desc: "FieldMask",
  1889. inputMessage: &knownpb.FieldMask{},
  1890. inputText: `"foo,fooBar , foo.barQux ,Foo"`,
  1891. wantMessage: &knownpb.FieldMask{
  1892. Paths: []string{
  1893. "foo",
  1894. "foo_bar",
  1895. "foo.bar_qux",
  1896. "_foo",
  1897. },
  1898. },
  1899. }, {
  1900. desc: "FieldMask field",
  1901. inputMessage: &pb2.KnownTypes{},
  1902. inputText: `{
  1903. "optFieldmask": "foo, qux.fooBar"
  1904. }`,
  1905. wantMessage: &pb2.KnownTypes{
  1906. OptFieldmask: &knownpb.FieldMask{
  1907. Paths: []string{
  1908. "foo",
  1909. "qux.foo_bar",
  1910. },
  1911. },
  1912. },
  1913. }, {
  1914. desc: "Any empty",
  1915. inputMessage: &knownpb.Any{},
  1916. inputText: `{}`,
  1917. wantMessage: &knownpb.Any{},
  1918. }, {
  1919. desc: "Any with non-custom message",
  1920. umo: jsonpb.UnmarshalOptions{
  1921. Resolver: preg.NewTypes((&pb2.Nested{}).ProtoReflect().Type()),
  1922. },
  1923. inputMessage: &knownpb.Any{},
  1924. inputText: `{
  1925. "@type": "foo/pb2.Nested",
  1926. "optString": "embedded inside Any",
  1927. "optNested": {
  1928. "optString": "inception"
  1929. }
  1930. }`,
  1931. wantMessage: func() proto.Message {
  1932. m := &pb2.Nested{
  1933. OptString: scalar.String("embedded inside Any"),
  1934. OptNested: &pb2.Nested{
  1935. OptString: scalar.String("inception"),
  1936. },
  1937. }
  1938. b, err := proto.MarshalOptions{Deterministic: true}.Marshal(m)
  1939. if err != nil {
  1940. t.Fatalf("error in binary marshaling message for Any.value: %v", err)
  1941. }
  1942. return &knownpb.Any{
  1943. TypeUrl: "foo/pb2.Nested",
  1944. Value: b,
  1945. }
  1946. }(),
  1947. }, {
  1948. desc: "Any with empty embedded message",
  1949. umo: jsonpb.UnmarshalOptions{
  1950. Resolver: preg.NewTypes((&pb2.Nested{}).ProtoReflect().Type()),
  1951. },
  1952. inputMessage: &knownpb.Any{},
  1953. inputText: `{
  1954. "@type": "foo/pb2.Nested"
  1955. }`,
  1956. wantMessage: &knownpb.Any{TypeUrl: "foo/pb2.Nested"},
  1957. }, {
  1958. desc: "Any without registered type",
  1959. umo: jsonpb.UnmarshalOptions{Resolver: preg.NewTypes()},
  1960. inputMessage: &knownpb.Any{},
  1961. inputText: `{
  1962. "@type": "foo/pb2.Nested"
  1963. }`,
  1964. wantErr: true,
  1965. }, {
  1966. desc: "Any with missing required error",
  1967. umo: jsonpb.UnmarshalOptions{
  1968. Resolver: preg.NewTypes((&pb2.PartialRequired{}).ProtoReflect().Type()),
  1969. },
  1970. inputMessage: &knownpb.Any{},
  1971. inputText: `{
  1972. "@type": "pb2.PartialRequired",
  1973. "optString": "embedded inside Any"
  1974. }`,
  1975. wantMessage: func() proto.Message {
  1976. m := &pb2.PartialRequired{
  1977. OptString: scalar.String("embedded inside Any"),
  1978. }
  1979. b, err := proto.MarshalOptions{Deterministic: true}.Marshal(m)
  1980. // TODO: Marshal may fail due to required field not set at some
  1981. // point. Need to ignore required not set error here.
  1982. if err != nil {
  1983. t.Fatalf("error in binary marshaling message for Any.value: %v", err)
  1984. }
  1985. return &knownpb.Any{
  1986. TypeUrl: string(m.ProtoReflect().Type().FullName()),
  1987. Value: b,
  1988. }
  1989. }(),
  1990. wantErr: true,
  1991. }, {
  1992. desc: "Any with partial required and AllowPartial",
  1993. umo: jsonpb.UnmarshalOptions{
  1994. AllowPartial: true,
  1995. Resolver: preg.NewTypes((&pb2.PartialRequired{}).ProtoReflect().Type()),
  1996. },
  1997. inputMessage: &knownpb.Any{},
  1998. inputText: `{
  1999. "@type": "pb2.PartialRequired",
  2000. "optString": "embedded inside Any"
  2001. }`,
  2002. wantMessage: func() proto.Message {
  2003. m := &pb2.PartialRequired{
  2004. OptString: scalar.String("embedded inside Any"),
  2005. }
  2006. b, err := proto.MarshalOptions{Deterministic: true}.Marshal(m)
  2007. // TODO: Marshal may fail due to required field not set at some
  2008. // point. Need to ignore required not set error here.
  2009. if err != nil {
  2010. t.Fatalf("error in binary marshaling message for Any.value: %v", err)
  2011. }
  2012. return &knownpb.Any{
  2013. TypeUrl: string(m.ProtoReflect().Type().FullName()),
  2014. Value: b,
  2015. }
  2016. }(),
  2017. }, {
  2018. desc: "Any with invalid UTF8",
  2019. umo: jsonpb.UnmarshalOptions{
  2020. Resolver: preg.NewTypes((&pb2.Nested{}).ProtoReflect().Type()),
  2021. },
  2022. inputMessage: &knownpb.Any{},
  2023. inputText: `{
  2024. "optString": "` + "abc\xff" + `",
  2025. "@type": "foo/pb2.Nested"
  2026. }`,
  2027. wantMessage: func() proto.Message {
  2028. m := &pb2.Nested{
  2029. OptString: scalar.String("abc\xff"),
  2030. }
  2031. b, err := proto.MarshalOptions{Deterministic: true}.Marshal(m)
  2032. if err != nil {
  2033. t.Fatalf("error in binary marshaling message for Any.value: %v", err)
  2034. }
  2035. return &knownpb.Any{
  2036. TypeUrl: "foo/pb2.Nested",
  2037. Value: b,
  2038. }
  2039. }(),
  2040. wantErr: true,
  2041. }, {
  2042. desc: "Any with BoolValue",
  2043. umo: jsonpb.UnmarshalOptions{
  2044. Resolver: preg.NewTypes((&knownpb.BoolValue{}).ProtoReflect().Type()),
  2045. },
  2046. inputMessage: &knownpb.Any{},
  2047. inputText: `{
  2048. "@type": "type.googleapis.com/google.protobuf.BoolValue",
  2049. "value": true
  2050. }`,
  2051. wantMessage: func() proto.Message {
  2052. m := &knownpb.BoolValue{Value: true}
  2053. b, err := proto.MarshalOptions{Deterministic: true}.Marshal(m)
  2054. if err != nil {
  2055. t.Fatalf("error in binary marshaling message for Any.value: %v", err)
  2056. }
  2057. return &knownpb.Any{
  2058. TypeUrl: "type.googleapis.com/google.protobuf.BoolValue",
  2059. Value: b,
  2060. }
  2061. }(),
  2062. }, {
  2063. desc: "Any with Empty",
  2064. umo: jsonpb.UnmarshalOptions{
  2065. Resolver: preg.NewTypes((&knownpb.Empty{}).ProtoReflect().Type()),
  2066. },
  2067. inputMessage: &knownpb.Any{},
  2068. inputText: `{
  2069. "value": {},
  2070. "@type": "type.googleapis.com/google.protobuf.Empty"
  2071. }`,
  2072. wantMessage: func() proto.Message {
  2073. m := &knownpb.Empty{}
  2074. b, err := proto.MarshalOptions{Deterministic: true}.Marshal(m)
  2075. if err != nil {
  2076. t.Fatalf("error in binary marshaling message for Any.value: %v", err)
  2077. }
  2078. return &knownpb.Any{
  2079. TypeUrl: "type.googleapis.com/google.protobuf.Empty",
  2080. Value: b,
  2081. }
  2082. }(),
  2083. }, {
  2084. desc: "Any with missing Empty",
  2085. umo: jsonpb.UnmarshalOptions{
  2086. Resolver: preg.NewTypes((&knownpb.Empty{}).ProtoReflect().Type()),
  2087. },
  2088. inputMessage: &knownpb.Any{},
  2089. inputText: `{
  2090. "@type": "type.googleapis.com/google.protobuf.Empty"
  2091. }`,
  2092. wantErr: true,
  2093. }, {
  2094. desc: "Any with StringValue containing invalid UTF8",
  2095. umo: jsonpb.UnmarshalOptions{
  2096. Resolver: preg.NewTypes((&knownpb.StringValue{}).ProtoReflect().Type()),
  2097. },
  2098. inputMessage: &knownpb.Any{},
  2099. inputText: `{
  2100. "@type": "google.protobuf.StringValue",
  2101. "value": "` + "abc\xff" + `"
  2102. }`,
  2103. wantMessage: func() proto.Message {
  2104. m := &knownpb.StringValue{Value: "abc\xff"}
  2105. b, err := proto.MarshalOptions{Deterministic: true}.Marshal(m)
  2106. if err != nil {
  2107. t.Fatalf("error in binary marshaling message for Any.value: %v", err)
  2108. }
  2109. return &knownpb.Any{
  2110. TypeUrl: "google.protobuf.StringValue",
  2111. Value: b,
  2112. }
  2113. }(),
  2114. wantErr: true,
  2115. }, {
  2116. desc: "Any with Int64Value",
  2117. umo: jsonpb.UnmarshalOptions{
  2118. Resolver: preg.NewTypes((&knownpb.Int64Value{}).ProtoReflect().Type()),
  2119. },
  2120. inputMessage: &knownpb.Any{},
  2121. inputText: `{
  2122. "@type": "google.protobuf.Int64Value",
  2123. "value": "42"
  2124. }`,
  2125. wantMessage: func() proto.Message {
  2126. m := &knownpb.Int64Value{Value: 42}
  2127. b, err := proto.MarshalOptions{Deterministic: true}.Marshal(m)
  2128. if err != nil {
  2129. t.Fatalf("error in binary marshaling message for Any.value: %v", err)
  2130. }
  2131. return &knownpb.Any{
  2132. TypeUrl: "google.protobuf.Int64Value",
  2133. Value: b,
  2134. }
  2135. }(),
  2136. }, {
  2137. desc: "Any with invalid Int64Value",
  2138. umo: jsonpb.UnmarshalOptions{
  2139. Resolver: preg.NewTypes((&knownpb.Int64Value{}).ProtoReflect().Type()),
  2140. },
  2141. inputMessage: &knownpb.Any{},
  2142. inputText: `{
  2143. "@type": "google.protobuf.Int64Value",
  2144. "value": "forty-two"
  2145. }`,
  2146. wantErr: true,
  2147. }, {
  2148. desc: "Any with invalid UInt64Value",
  2149. umo: jsonpb.UnmarshalOptions{
  2150. Resolver: preg.NewTypes((&knownpb.UInt64Value{}).ProtoReflect().Type()),
  2151. },
  2152. inputMessage: &knownpb.Any{},
  2153. inputText: `{
  2154. "@type": "google.protobuf.UInt64Value",
  2155. "value": -42
  2156. }`,
  2157. wantErr: true,
  2158. }, {
  2159. desc: "Any with Duration",
  2160. umo: jsonpb.UnmarshalOptions{
  2161. Resolver: preg.NewTypes((&knownpb.Duration{}).ProtoReflect().Type()),
  2162. },
  2163. inputMessage: &knownpb.Any{},
  2164. inputText: `{
  2165. "@type": "type.googleapis.com/google.protobuf.Duration",
  2166. "value": "0s"
  2167. }`,
  2168. wantMessage: func() proto.Message {
  2169. m := &knownpb.Duration{}
  2170. b, err := proto.MarshalOptions{Deterministic: true}.Marshal(m)
  2171. if err != nil {
  2172. t.Fatalf("error in binary marshaling message for Any.value: %v", err)
  2173. }
  2174. return &knownpb.Any{
  2175. TypeUrl: "type.googleapis.com/google.protobuf.Duration",
  2176. Value: b,
  2177. }
  2178. }(),
  2179. }, {
  2180. desc: "Any with Value of StringValue",
  2181. umo: jsonpb.UnmarshalOptions{
  2182. Resolver: preg.NewTypes((&knownpb.Value{}).ProtoReflect().Type()),
  2183. },
  2184. inputMessage: &knownpb.Any{},
  2185. inputText: `{
  2186. "@type": "google.protobuf.Value",
  2187. "value": "` + "abc\xff" + `"
  2188. }`,
  2189. wantMessage: func() proto.Message {
  2190. m := &knownpb.Value{Kind: &knownpb.Value_StringValue{"abc\xff"}}
  2191. b, err := proto.MarshalOptions{Deterministic: true}.Marshal(m)
  2192. if err != nil {
  2193. t.Fatalf("error in binary marshaling message for Any.value: %v", err)
  2194. }
  2195. return &knownpb.Any{
  2196. TypeUrl: "google.protobuf.Value",
  2197. Value: b,
  2198. }
  2199. }(),
  2200. wantErr: true,
  2201. }, {
  2202. desc: "Any with Value of NullValue",
  2203. umo: jsonpb.UnmarshalOptions{
  2204. Resolver: preg.NewTypes((&knownpb.Value{}).ProtoReflect().Type()),
  2205. },
  2206. inputMessage: &knownpb.Any{},
  2207. inputText: `{
  2208. "@type": "google.protobuf.Value",
  2209. "value": null
  2210. }`,
  2211. wantMessage: func() proto.Message {
  2212. m := &knownpb.Value{Kind: &knownpb.Value_NullValue{}}
  2213. b, err := proto.MarshalOptions{Deterministic: true}.Marshal(m)
  2214. if err != nil {
  2215. t.Fatalf("error in binary marshaling message for Any.value: %v", err)
  2216. }
  2217. return &knownpb.Any{
  2218. TypeUrl: "google.protobuf.Value",
  2219. Value: b,
  2220. }
  2221. }(),
  2222. }, {
  2223. desc: "Any with Struct",
  2224. umo: jsonpb.UnmarshalOptions{
  2225. Resolver: preg.NewTypes(
  2226. (&knownpb.Struct{}).ProtoReflect().Type(),
  2227. (&knownpb.Value{}).ProtoReflect().Type(),
  2228. (&knownpb.BoolValue{}).ProtoReflect().Type(),
  2229. knownpb.NullValue_NULL_VALUE.Type(),
  2230. (&knownpb.StringValue{}).ProtoReflect().Type(),
  2231. ),
  2232. },
  2233. inputMessage: &knownpb.Any{},
  2234. inputText: `{
  2235. "@type": "google.protobuf.Struct",
  2236. "value": {
  2237. "bool": true,
  2238. "null": null,
  2239. "string": "hello",
  2240. "struct": {
  2241. "string": "world"
  2242. }
  2243. }
  2244. }`,
  2245. wantMessage: func() proto.Message {
  2246. m := &knownpb.Struct{
  2247. Fields: map[string]*knownpb.Value{
  2248. "bool": {Kind: &knownpb.Value_BoolValue{true}},
  2249. "null": {Kind: &knownpb.Value_NullValue{}},
  2250. "string": {Kind: &knownpb.Value_StringValue{"hello"}},
  2251. "struct": {
  2252. Kind: &knownpb.Value_StructValue{
  2253. &knownpb.Struct{
  2254. Fields: map[string]*knownpb.Value{
  2255. "string": {Kind: &knownpb.Value_StringValue{"world"}},
  2256. },
  2257. },
  2258. },
  2259. },
  2260. },
  2261. }
  2262. b, err := proto.MarshalOptions{Deterministic: true}.Marshal(m)
  2263. if err != nil {
  2264. t.Fatalf("error in binary marshaling message for Any.value: %v", err)
  2265. }
  2266. return &knownpb.Any{
  2267. TypeUrl: "google.protobuf.Struct",
  2268. Value: b,
  2269. }
  2270. }(),
  2271. }, {
  2272. desc: "Any with missing @type",
  2273. umo: jsonpb.UnmarshalOptions{},
  2274. inputMessage: &knownpb.Any{},
  2275. inputText: `{
  2276. "value": {}
  2277. }`,
  2278. wantErr: true,
  2279. }, {
  2280. desc: "Any with empty @type",
  2281. inputMessage: &knownpb.Any{},
  2282. inputText: `{
  2283. "@type": ""
  2284. }`,
  2285. wantErr: true,
  2286. }, {
  2287. desc: "Any with duplicate @type",
  2288. umo: jsonpb.UnmarshalOptions{
  2289. Resolver: preg.NewTypes(
  2290. (&pb2.Nested{}).ProtoReflect().Type(),
  2291. (&knownpb.StringValue{}).ProtoReflect().Type(),
  2292. ),
  2293. },
  2294. inputMessage: &knownpb.Any{},
  2295. inputText: `{
  2296. "@type": "google.protobuf.StringValue",
  2297. "value": "hello",
  2298. "@type": "pb2.Nested"
  2299. }`,
  2300. wantErr: true,
  2301. }, {
  2302. desc: "Any with duplicate value",
  2303. umo: jsonpb.UnmarshalOptions{
  2304. Resolver: preg.NewTypes((&knownpb.StringValue{}).ProtoReflect().Type()),
  2305. },
  2306. inputMessage: &knownpb.Any{},
  2307. inputText: `{
  2308. "@type": "google.protobuf.StringValue",
  2309. "value": "hello",
  2310. "value": "world"
  2311. }`,
  2312. wantErr: true,
  2313. }, {
  2314. desc: "Any with unknown field",
  2315. umo: jsonpb.UnmarshalOptions{
  2316. Resolver: preg.NewTypes((&pb2.Nested{}).ProtoReflect().Type()),
  2317. },
  2318. inputMessage: &knownpb.Any{},
  2319. inputText: `{
  2320. "@type": "pb2.Nested",
  2321. "optString": "hello",
  2322. "unknown": "world"
  2323. }`,
  2324. wantErr: true,
  2325. }, {
  2326. desc: "Any with embedded type containing Any",
  2327. umo: jsonpb.UnmarshalOptions{
  2328. Resolver: preg.NewTypes(
  2329. (&pb2.KnownTypes{}).ProtoReflect().Type(),
  2330. (&knownpb.Any{}).ProtoReflect().Type(),
  2331. (&knownpb.StringValue{}).ProtoReflect().Type(),
  2332. ),
  2333. },
  2334. inputMessage: &knownpb.Any{},
  2335. inputText: `{
  2336. "@type": "pb2.KnownTypes",
  2337. "optAny": {
  2338. "@type": "google.protobuf.StringValue",
  2339. "value": "` + "abc\xff" + `"
  2340. }
  2341. }`,
  2342. wantMessage: func() proto.Message {
  2343. m1 := &knownpb.StringValue{Value: "abc\xff"}
  2344. b, err := proto.MarshalOptions{Deterministic: true}.Marshal(m1)
  2345. if err != nil {
  2346. t.Fatalf("error in binary marshaling message for Any.value: %v", err)
  2347. }
  2348. m2 := &knownpb.Any{
  2349. TypeUrl: "google.protobuf.StringValue",
  2350. Value: b,
  2351. }
  2352. m3 := &pb2.KnownTypes{OptAny: m2}
  2353. b, err = proto.MarshalOptions{Deterministic: true}.Marshal(m3)
  2354. if err != nil {
  2355. t.Fatalf("error in binary marshaling message for Any.value: %v", err)
  2356. }
  2357. return &knownpb.Any{
  2358. TypeUrl: "pb2.KnownTypes",
  2359. Value: b,
  2360. }
  2361. }(),
  2362. wantErr: true,
  2363. }, {
  2364. desc: "well known types as field values",
  2365. umo: jsonpb.UnmarshalOptions{
  2366. Resolver: preg.NewTypes((&knownpb.Empty{}).ProtoReflect().Type()),
  2367. },
  2368. inputMessage: &pb2.KnownTypes{},
  2369. inputText: `{
  2370. "optBool": false,
  2371. "optInt32": 42,
  2372. "optInt64": "42",
  2373. "optUint32": 42,
  2374. "optUint64": "42",
  2375. "optFloat": 1.23,
  2376. "optDouble": 3.1415,
  2377. "optString": "hello",
  2378. "optBytes": "aGVsbG8=",
  2379. "optDuration": "123s",
  2380. "optTimestamp": "2019-03-19T23:03:21Z",
  2381. "optStruct": {
  2382. "string": "hello"
  2383. },
  2384. "optList": [
  2385. null,
  2386. "",
  2387. {},
  2388. []
  2389. ],
  2390. "optValue": "world",
  2391. "optEmpty": {},
  2392. "optAny": {
  2393. "@type": "google.protobuf.Empty",
  2394. "value": {}
  2395. },
  2396. "optFieldmask": "fooBar,barFoo"
  2397. }`,
  2398. wantMessage: &pb2.KnownTypes{
  2399. OptBool: &knownpb.BoolValue{Value: false},
  2400. OptInt32: &knownpb.Int32Value{Value: 42},
  2401. OptInt64: &knownpb.Int64Value{Value: 42},
  2402. OptUint32: &knownpb.UInt32Value{Value: 42},
  2403. OptUint64: &knownpb.UInt64Value{Value: 42},
  2404. OptFloat: &knownpb.FloatValue{Value: 1.23},
  2405. OptDouble: &knownpb.DoubleValue{Value: 3.1415},
  2406. OptString: &knownpb.StringValue{Value: "hello"},
  2407. OptBytes: &knownpb.BytesValue{Value: []byte("hello")},
  2408. OptDuration: &knownpb.Duration{Seconds: 123},
  2409. OptTimestamp: &knownpb.Timestamp{Seconds: 1553036601},
  2410. OptStruct: &knownpb.Struct{
  2411. Fields: map[string]*knownpb.Value{
  2412. "string": {Kind: &knownpb.Value_StringValue{"hello"}},
  2413. },
  2414. },
  2415. OptList: &knownpb.ListValue{
  2416. Values: []*knownpb.Value{
  2417. {Kind: &knownpb.Value_NullValue{}},
  2418. {Kind: &knownpb.Value_StringValue{}},
  2419. {
  2420. Kind: &knownpb.Value_StructValue{
  2421. &knownpb.Struct{Fields: map[string]*knownpb.Value{}},
  2422. },
  2423. },
  2424. {
  2425. Kind: &knownpb.Value_ListValue{
  2426. &knownpb.ListValue{Values: []*knownpb.Value{}},
  2427. },
  2428. },
  2429. },
  2430. },
  2431. OptValue: &knownpb.Value{
  2432. Kind: &knownpb.Value_StringValue{"world"},
  2433. },
  2434. OptEmpty: &knownpb.Empty{},
  2435. OptAny: &knownpb.Any{
  2436. TypeUrl: "google.protobuf.Empty",
  2437. },
  2438. OptFieldmask: &knownpb.FieldMask{
  2439. Paths: []string{"foo_bar", "bar_foo"},
  2440. },
  2441. },
  2442. }}
  2443. for _, tt := range tests {
  2444. tt := tt
  2445. t.Run(tt.desc, func(t *testing.T) {
  2446. err := tt.umo.Unmarshal(tt.inputMessage, []byte(tt.inputText))
  2447. if err != nil && !tt.wantErr {
  2448. t.Errorf("Unmarshal() returned error: %v\n\n", err)
  2449. }
  2450. if err == nil && tt.wantErr {
  2451. t.Error("Unmarshal() got nil error, want error\n\n")
  2452. }
  2453. if tt.wantMessage != nil && !protoV1.Equal(tt.inputMessage.(protoV1.Message), tt.wantMessage.(protoV1.Message)) {
  2454. t.Errorf("Unmarshal()\n<got>\n%v\n<want>\n%v\n", tt.inputMessage, tt.wantMessage)
  2455. }
  2456. })
  2457. }
  2458. }