check_types_builtin_json.c 202 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283528452855286528752885289529052915292529352945295529652975298529953005301530253035304530553065307530853095310531153125313531453155316531753185319532053215322532353245325532653275328532953305331533253335334533553365337533853395340534153425343534453455346534753485349535053515352535353545355535653575358535953605361536253635364536553665367536853695370537153725373537453755376537753785379538053815382538353845385538653875388538953905391539253935394539553965397539853995400540154025403540454055406540754085409541054115412541354145415541654175418541954205421542254235424542554265427542854295430543154325433543454355436543754385439544054415442544354445445544654475448544954505451545254535454545554565457545854595460546154625463546454655466546754685469547054715472547354745475547654775478547954805481548254835484548554865487548854895490549154925493549454955496549754985499550055015502550355045505550655075508550955105511551255135514551555165517551855195520552155225523552455255526552755285529553055315532553355345535553655375538553955405541554255435544554555465547554855495550555155525553555455555556555755585559556055615562556355645565556655675568556955705571557255735574557555765577557855795580558155825583558455855586558755885589559055915592559355945595559655975598559956005601560256035604560556065607560856095610561156125613561456155616561756185619562056215622562356245625562656275628562956305631563256335634563556365637563856395640564156425643564456455646564756485649565056515652565356545655565656575658565956605661566256635664566556665667566856695670567156725673567456755676567756785679568056815682568356845685568656875688568956905691569256935694569556965697569856995700570157025703570457055706570757085709571057115712571357145715571657175718571957205721572257235724572557265727572857295730573157325733573457355736573757385739574057415742574357445745574657475748574957505751575257535754575557565757575857595760576157625763576457655766576757685769577057715772577357745775577657775778577957805781578257835784578557865787578857895790579157925793579457955796579757985799580058015802580358045805580658075808580958105811581258135814581558165817581858195820582158225823582458255826582758285829583058315832583358345835583658375838583958405841584258435844584558465847584858495850585158525853585458555856585758585859586058615862586358645865586658675868586958705871587258735874587558765877587858795880588158825883588458855886588758885889589058915892589358945895589658975898589959005901590259035904590559065907590859095910591159125913591459155916591759185919592059215922592359245925592659275928592959305931593259335934593559365937593859395940594159425943594459455946594759485949595059515952595359545955595659575958595959605961596259635964596559665967596859695970597159725973597459755976597759785979598059815982598359845985598659875988598959905991599259935994599559965997599859996000600160026003600460056006600760086009601060116012601360146015601660176018601960206021602260236024602560266027602860296030603160326033603460356036603760386039604060416042604360446045604660476048604960506051605260536054605560566057
  1. /* This Source Code Form is subject to the terms of the Mozilla Public
  2. * License, v. 2.0. If a copy of the MPL was not distributed with this
  3. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  4. #include <open62541/types.h>
  5. #include <open62541/types_generated.h>
  6. #include <open62541/types_generated_encoding_binary.h>
  7. #include <open62541/types_generated_handling.h>
  8. #include <open62541/util.h>
  9. #include "ua_types_encoding_binary.h"
  10. #include "ua_types_encoding_json.h"
  11. #include <check.h>
  12. #include <float.h>
  13. #include <math.h>
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #if defined(_MSC_VER)
  17. # pragma warning(disable: 4146)
  18. #endif
  19. /* Test Boolean */
  20. START_TEST(UA_Boolean_true_json_encode) {
  21. UA_Boolean *src = UA_Boolean_new();
  22. UA_Boolean_init(src);
  23. *src = UA_TRUE;
  24. const UA_DataType *type = &UA_TYPES[UA_TYPES_BOOLEAN];
  25. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  26. UA_ByteString buf;
  27. UA_ByteString_allocBuffer(&buf, size+1);
  28. UA_Byte *bufPos = &buf.data[0];
  29. const UA_Byte *bufEnd = &buf.data[size+1];
  30. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  31. *bufPos = 0;
  32. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  33. char* result = "true";
  34. ck_assert_str_eq(result, (char*)buf.data);
  35. UA_ByteString_deleteMembers(&buf);
  36. UA_Boolean_delete(src);
  37. }
  38. END_TEST
  39. START_TEST(UA_Boolean_false_json_encode) {
  40. UA_Boolean *src = UA_Boolean_new();
  41. UA_Boolean_init(src);
  42. *src = UA_FALSE;
  43. const UA_DataType *type = &UA_TYPES[UA_TYPES_BOOLEAN];
  44. UA_ByteString buf;
  45. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  46. ck_assert_int_eq(size, 5);
  47. UA_ByteString_allocBuffer(&buf, size+1);
  48. UA_Byte *bufPos = &buf.data[0];
  49. const UA_Byte *bufEnd = &buf.data[size+1];
  50. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  51. *bufPos = 0;
  52. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  53. char* result = "false";
  54. ck_assert_str_eq(result, (char*)buf.data);
  55. UA_ByteString_deleteMembers(&buf);
  56. UA_Boolean_delete(src);
  57. }
  58. END_TEST
  59. START_TEST(UA_Boolean_true_bufferTooSmall_json_encode) {
  60. UA_Boolean *src = UA_Boolean_new();
  61. UA_Boolean_init(src);
  62. *src = UA_FALSE;
  63. const UA_DataType *type = &UA_TYPES[UA_TYPES_BOOLEAN];
  64. UA_ByteString buf;
  65. UA_ByteString_allocBuffer(&buf, 2);
  66. UA_Byte *bufPos = &buf.data[0];
  67. const UA_Byte *bufEnd = &buf.data[2];
  68. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  69. *bufPos = 0;
  70. ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  71. char* result = "";
  72. ck_assert_str_eq(result, (char*)buf.data);
  73. UA_ByteString_deleteMembers(&buf);
  74. UA_Boolean_delete(src);
  75. }
  76. END_TEST
  77. /* Test String */
  78. START_TEST(UA_String_json_encode) {
  79. // given
  80. UA_String src = UA_STRING("hello");
  81. const UA_DataType *type = &UA_TYPES[UA_TYPES_STRING];
  82. UA_ByteString buf;
  83. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  84. UA_ByteString_allocBuffer(&buf, size+1);
  85. UA_Byte *bufPos = &buf.data[0];
  86. const UA_Byte *bufEnd = &buf.data[size+1];
  87. // when
  88. status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  89. *bufPos = 0;
  90. // then
  91. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  92. char* result = "\"hello\"";
  93. ck_assert_str_eq(result, (char*)buf.data);
  94. UA_ByteString_deleteMembers(&buf);
  95. }
  96. END_TEST
  97. START_TEST(UA_String_Empty_json_encode) {
  98. // given
  99. UA_String src = UA_STRING("");
  100. UA_ByteString buf;
  101. const UA_DataType *type = &UA_TYPES[UA_TYPES_STRING];
  102. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  103. UA_ByteString_allocBuffer(&buf, size+1);
  104. UA_Byte *bufPos = &buf.data[0];
  105. const UA_Byte *bufEnd = &buf.data[size+1];
  106. // when
  107. status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  108. *bufPos = 0;
  109. // then
  110. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  111. char* result = "\"\"";
  112. ck_assert_str_eq(result, (char*)buf.data);
  113. UA_ByteString_deleteMembers(&buf);
  114. }
  115. END_TEST
  116. START_TEST(UA_String_Null_json_encode) {
  117. // given
  118. UA_String src = UA_STRING_NULL;
  119. UA_ByteString buf;
  120. const UA_DataType *type = &UA_TYPES[UA_TYPES_STRING];
  121. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  122. UA_ByteString_allocBuffer(&buf, size+1);
  123. UA_Byte *bufPos = &buf.data[0];
  124. const UA_Byte *bufEnd = &buf.data[size+1];
  125. // when
  126. status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  127. *bufPos = 0;
  128. // then
  129. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  130. char* result = "null";
  131. ck_assert_str_eq(result, (char*)buf.data);
  132. UA_ByteString_deleteMembers(&buf);
  133. }
  134. END_TEST
  135. START_TEST(UA_String_escapesimple_json_encode) {
  136. // given
  137. UA_String src = UA_STRING("\b\th\"e\fl\nl\\o\r");
  138. UA_ByteString buf;
  139. const UA_DataType *type = &UA_TYPES[UA_TYPES_STRING];
  140. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  141. UA_ByteString_allocBuffer(&buf, size+1);
  142. UA_Byte *bufPos = &buf.data[0];
  143. const UA_Byte *bufEnd = &buf.data[size+1];
  144. // when
  145. status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  146. *bufPos = 0;
  147. // then
  148. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  149. char* result = "\"\\b\\th\\\"e\\fl\\nl\\\\o\\r\"";
  150. ck_assert_str_eq(result, (char*)buf.data);
  151. UA_ByteString_deleteMembers(&buf);
  152. }
  153. END_TEST
  154. START_TEST(UA_String_escapeutf_json_encode) {
  155. // given
  156. UA_String src = UA_STRING("he\\zsdl\alo€ \x26\x3A asdasd");
  157. UA_ByteString buf;
  158. const UA_DataType *type = &UA_TYPES[UA_TYPES_STRING];
  159. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  160. UA_ByteString_allocBuffer(&buf, size+1);
  161. UA_Byte *bufPos = &buf.data[0];
  162. const UA_Byte *bufEnd = &buf.data[size+1];
  163. // when
  164. status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  165. *bufPos = 0;
  166. // then
  167. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  168. char* result = "\"he\\\\zsdl\\u0007lo€ &: asdasd\"";
  169. ck_assert_str_eq(result, (char*)buf.data);
  170. UA_ByteString_deleteMembers(&buf);
  171. }
  172. END_TEST
  173. START_TEST(UA_String_special_json_encode) {
  174. // given
  175. UA_String src = UA_STRING("𝄞𠂊𝕥🔍");
  176. UA_ByteString buf;
  177. const UA_DataType *type = &UA_TYPES[UA_TYPES_STRING];
  178. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  179. UA_ByteString_allocBuffer(&buf, size+1);
  180. UA_Byte *bufPos = &buf.data[0];
  181. const UA_Byte *bufEnd = &buf.data[size+1];
  182. // when
  183. status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  184. *bufPos = 0;
  185. // then
  186. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  187. char* result = "\"𝄞𠂊𝕥🔍\"";
  188. ck_assert_str_eq(result, (char*)buf.data);
  189. UA_ByteString_deleteMembers(&buf);
  190. }
  191. END_TEST
  192. /* Byte */
  193. START_TEST(UA_Byte_Max_Number_json_encode) {
  194. UA_Byte *src = UA_Byte_new();
  195. *src = 255;
  196. const UA_DataType *type = &UA_TYPES[UA_TYPES_BYTE];
  197. UA_ByteString buf;
  198. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  199. UA_ByteString_allocBuffer(&buf, size+1);
  200. UA_Byte *bufPos = &buf.data[0];
  201. const UA_Byte *bufEnd = &buf.data[size+1];
  202. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  203. *bufPos = 0;
  204. // then
  205. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  206. char* result = "255";
  207. ck_assert_str_eq(result, (char*)buf.data);
  208. UA_ByteString_deleteMembers(&buf);
  209. UA_Byte_delete(src);
  210. }
  211. END_TEST
  212. START_TEST(UA_Byte_Min_Number_json_encode) {
  213. UA_Byte *src = UA_Byte_new();
  214. *src = 0;
  215. const UA_DataType *type = &UA_TYPES[UA_TYPES_BYTE];
  216. UA_ByteString buf;
  217. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  218. UA_ByteString_allocBuffer(&buf, size+1);
  219. UA_Byte *bufPos = &buf.data[0];
  220. const UA_Byte *bufEnd = &buf.data[size+1];
  221. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  222. *bufPos = 0;
  223. // then
  224. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  225. char* result = "0";
  226. ck_assert_str_eq(result, (char*)buf.data);
  227. UA_ByteString_deleteMembers(&buf);
  228. UA_Byte_delete(src);
  229. }
  230. END_TEST
  231. START_TEST(UA_Byte_smallbuf_Number_json_encode) {
  232. UA_Byte *src = UA_Byte_new();
  233. *src = 255;
  234. const UA_DataType *type = &UA_TYPES[UA_TYPES_BYTE];
  235. UA_ByteString buf;
  236. UA_ByteString_allocBuffer(&buf, 2);
  237. UA_Byte *bufPos = &buf.data[0];
  238. const UA_Byte *bufEnd = &buf.data[2];
  239. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  240. *bufPos = 0;
  241. // then
  242. ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  243. UA_ByteString_deleteMembers(&buf);
  244. UA_Byte_delete(src);
  245. }
  246. END_TEST
  247. /* sByte */
  248. START_TEST(UA_SByte_Max_Number_json_encode) {
  249. UA_SByte *src = UA_SByte_new();
  250. *src = 127;
  251. const UA_DataType *type = &UA_TYPES[UA_TYPES_SBYTE];
  252. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  253. UA_ByteString buf;
  254. UA_ByteString_allocBuffer(&buf, size+1);
  255. UA_Byte *bufPos = &buf.data[0];
  256. const UA_Byte *bufEnd = &buf.data[size+1];
  257. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  258. *bufPos = 0;
  259. // then
  260. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  261. char* result = "127";
  262. ck_assert_str_eq(result, (char*)buf.data);
  263. UA_ByteString_deleteMembers(&buf);
  264. UA_SByte_delete(src);
  265. }
  266. END_TEST
  267. START_TEST(UA_SByte_Min_Number_json_encode) {
  268. UA_SByte *src = UA_SByte_new();
  269. *src = -128;
  270. const UA_DataType *type = &UA_TYPES[UA_TYPES_SBYTE];
  271. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  272. UA_ByteString buf;
  273. UA_ByteString_allocBuffer(&buf, size+1);
  274. UA_Byte *bufPos = &buf.data[0];
  275. const UA_Byte *bufEnd = &buf.data[size+1];
  276. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  277. *bufPos = 0;
  278. // then
  279. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  280. char* result = "-128";
  281. ck_assert_str_eq(result, (char*)buf.data);
  282. UA_ByteString_deleteMembers(&buf);
  283. UA_SByte_delete(src);
  284. }
  285. END_TEST
  286. START_TEST(UA_SByte_Zero_Number_json_encode) {
  287. UA_SByte *src = UA_SByte_new();
  288. *src = 0;
  289. const UA_DataType *type = &UA_TYPES[UA_TYPES_SBYTE];
  290. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  291. UA_ByteString buf;
  292. UA_ByteString_allocBuffer(&buf, size+1);
  293. UA_Byte *bufPos = &buf.data[0];
  294. const UA_Byte *bufEnd = &buf.data[size+1];
  295. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  296. *bufPos = 0;
  297. // then
  298. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  299. char* result = "0";
  300. ck_assert_str_eq(result, (char*)buf.data);
  301. UA_ByteString_deleteMembers(&buf);
  302. UA_SByte_delete(src);
  303. }
  304. END_TEST
  305. START_TEST(UA_SByte_smallbuf_Number_json_encode) {
  306. UA_SByte *src = UA_SByte_new();
  307. *src = 127;
  308. const UA_DataType *type = &UA_TYPES[UA_TYPES_SBYTE];
  309. UA_ByteString buf;
  310. UA_ByteString_allocBuffer(&buf, 2);
  311. UA_Byte *bufPos = &buf.data[0];
  312. const UA_Byte *bufEnd = &buf.data[2];
  313. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  314. *bufPos = 0;
  315. // then
  316. ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  317. UA_ByteString_deleteMembers(&buf);
  318. UA_SByte_delete(src);
  319. }
  320. END_TEST
  321. /* UInt16 */
  322. START_TEST(UA_UInt16_Max_Number_json_encode) {
  323. UA_UInt16 *src = UA_UInt16_new();
  324. *src = 65535;
  325. const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT16];
  326. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  327. UA_ByteString buf;
  328. UA_ByteString_allocBuffer(&buf, size+1);
  329. UA_Byte *bufPos = &buf.data[0];
  330. const UA_Byte *bufEnd = &buf.data[size+1];
  331. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  332. *bufPos = 0;
  333. // then
  334. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  335. char* result = "65535";
  336. ck_assert_str_eq(result, (char*)buf.data);
  337. UA_ByteString_deleteMembers(&buf);
  338. UA_UInt16_delete(src);
  339. }
  340. END_TEST
  341. START_TEST(UA_UInt16_Min_Number_json_encode) {
  342. UA_UInt16 *src = UA_UInt16_new();
  343. *src = 0;
  344. const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT16];
  345. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  346. UA_ByteString buf;
  347. UA_ByteString_allocBuffer(&buf, size+1);
  348. UA_Byte *bufPos = &buf.data[0];
  349. const UA_Byte *bufEnd = &buf.data[size+1];
  350. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  351. *bufPos = 0;
  352. // then
  353. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  354. char* result = "0";
  355. ck_assert_str_eq(result, (char*)buf.data);
  356. UA_ByteString_deleteMembers(&buf);
  357. UA_UInt16_delete(src);
  358. }
  359. END_TEST
  360. START_TEST(UA_UInt16_smallbuf_Number_json_encode) {
  361. UA_UInt16 *src = UA_UInt16_new();
  362. *src = 255;
  363. const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT16];
  364. UA_ByteString buf;
  365. UA_ByteString_allocBuffer(&buf, 2);
  366. UA_Byte *bufPos = &buf.data[0];
  367. const UA_Byte *bufEnd = &buf.data[2];
  368. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  369. *bufPos = 0;
  370. // then
  371. ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  372. UA_ByteString_deleteMembers(&buf);
  373. UA_UInt16_delete(src);
  374. }
  375. END_TEST
  376. /* Int16 */
  377. START_TEST(UA_Int16_Max_Number_json_encode) {
  378. UA_Int16 *src = UA_Int16_new();
  379. *src = 32767;
  380. const UA_DataType *type = &UA_TYPES[UA_TYPES_INT16];
  381. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  382. UA_ByteString buf;
  383. UA_ByteString_allocBuffer(&buf, size+1);
  384. UA_Byte *bufPos = &buf.data[0];
  385. const UA_Byte *bufEnd = &buf.data[size+1];
  386. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  387. *bufPos = 0;
  388. // then
  389. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  390. char* result = "32767";
  391. ck_assert_str_eq(result, (char*)buf.data);
  392. UA_ByteString_deleteMembers(&buf);
  393. UA_Int16_delete(src);
  394. }
  395. END_TEST
  396. START_TEST(UA_Int16_Min_Number_json_encode) {
  397. UA_Int16 *src = UA_Int16_new();
  398. *src = -32768;
  399. const UA_DataType *type = &UA_TYPES[UA_TYPES_INT16];
  400. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  401. UA_ByteString buf;
  402. UA_ByteString_allocBuffer(&buf, size+1);
  403. UA_Byte *bufPos = &buf.data[0];
  404. const UA_Byte *bufEnd = &buf.data[size+1];
  405. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  406. *bufPos = 0;
  407. // then
  408. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  409. char* result = "-32768";
  410. ck_assert_str_eq(result, (char*)buf.data);
  411. UA_ByteString_deleteMembers(&buf);
  412. UA_Int16_delete(src);
  413. }
  414. END_TEST
  415. START_TEST(UA_Int16_Zero_Number_json_encode) {
  416. UA_Int16 *src = UA_Int16_new();
  417. *src = 0;
  418. const UA_DataType *type = &UA_TYPES[UA_TYPES_INT16];
  419. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  420. UA_ByteString buf;
  421. UA_ByteString_allocBuffer(&buf, size+1);
  422. UA_Byte *bufPos = &buf.data[0];
  423. const UA_Byte *bufEnd = &buf.data[size+1];
  424. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  425. *bufPos = 0;
  426. // then
  427. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  428. char* result = "0";
  429. ck_assert_str_eq(result, (char*)buf.data);
  430. UA_ByteString_deleteMembers(&buf);
  431. UA_Int16_delete(src);
  432. }
  433. END_TEST
  434. START_TEST(UA_Int16_smallbuf_Number_json_encode) {
  435. UA_Int16 *src = UA_Int16_new();
  436. *src = 127;
  437. const UA_DataType *type = &UA_TYPES[UA_TYPES_INT16];
  438. UA_ByteString buf;
  439. UA_ByteString_allocBuffer(&buf, 2);
  440. UA_Byte *bufPos = &buf.data[0];
  441. const UA_Byte *bufEnd = &buf.data[2];
  442. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  443. *bufPos = 0;
  444. // then
  445. ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  446. UA_ByteString_deleteMembers(&buf);
  447. UA_Int16_delete(src);
  448. }
  449. END_TEST
  450. /* UInt32 */
  451. START_TEST(UA_UInt32_Max_Number_json_encode) {
  452. UA_UInt32 *src = UA_UInt32_new();
  453. *src = 4294967295;
  454. const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT32];
  455. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  456. UA_ByteString buf;
  457. UA_ByteString_allocBuffer(&buf, size+1);
  458. UA_Byte *bufPos = &buf.data[0];
  459. const UA_Byte *bufEnd = &buf.data[size+1];
  460. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  461. *bufPos = 0;
  462. // then
  463. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  464. char* result = "4294967295";
  465. ck_assert_str_eq(result, (char*)buf.data);
  466. UA_ByteString_deleteMembers(&buf);
  467. UA_UInt32_delete(src);
  468. }
  469. END_TEST
  470. START_TEST(UA_UInt32_Min_Number_json_encode) {
  471. UA_UInt32 *src = UA_UInt32_new();
  472. *src = 0;
  473. const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT32];
  474. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  475. UA_ByteString buf;
  476. UA_ByteString_allocBuffer(&buf, size+1);
  477. UA_Byte *bufPos = &buf.data[0];
  478. const UA_Byte *bufEnd = &buf.data[size+1];
  479. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  480. *bufPos = 0;
  481. // then
  482. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  483. char* result = "0";
  484. ck_assert_str_eq(result, (char*)buf.data);
  485. UA_ByteString_deleteMembers(&buf);
  486. UA_UInt32_delete(src);
  487. }
  488. END_TEST
  489. START_TEST(UA_UInt32_smallbuf_Number_json_encode) {
  490. UA_UInt32 *src = UA_UInt32_new();
  491. *src = 255;
  492. const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT32];
  493. UA_ByteString buf;
  494. UA_ByteString_allocBuffer(&buf, 2);
  495. UA_Byte *bufPos = &buf.data[0];
  496. const UA_Byte *bufEnd = &buf.data[2];
  497. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  498. *bufPos = 0;
  499. // then
  500. ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  501. UA_ByteString_deleteMembers(&buf);
  502. UA_UInt32_delete(src);
  503. }
  504. END_TEST
  505. /* Int32 */
  506. START_TEST(UA_Int32_Max_Number_json_encode) {
  507. UA_Int32 *src = UA_Int32_new();
  508. *src = 2147483647;
  509. const UA_DataType *type = &UA_TYPES[UA_TYPES_INT32];
  510. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  511. UA_ByteString buf;
  512. UA_ByteString_allocBuffer(&buf, size+1);
  513. UA_Byte *bufPos = &buf.data[0];
  514. const UA_Byte *bufEnd = &buf.data[size+1];
  515. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  516. *bufPos = 0;
  517. // then
  518. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  519. char* result = "2147483647";
  520. ck_assert_str_eq(result, (char*)buf.data);
  521. UA_ByteString_deleteMembers(&buf);
  522. UA_Int32_delete(src);
  523. }
  524. END_TEST
  525. START_TEST(UA_Int32_Min_Number_json_encode) {
  526. UA_Int32 src = -2147483648;
  527. const UA_DataType *type = &UA_TYPES[UA_TYPES_INT32];
  528. size_t size = UA_calcSizeJson((void *)&src, type, NULL, 0, NULL, 0, UA_TRUE);
  529. UA_ByteString buf;
  530. UA_ByteString_allocBuffer(&buf, size+1);
  531. UA_Byte *bufPos = &buf.data[0];
  532. const UA_Byte *bufEnd = &buf.data[size+1];
  533. status s = UA_encodeJson((void *)&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  534. *bufPos = 0;
  535. // then
  536. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  537. char* result = "-2147483648";
  538. ck_assert_str_eq(result, (char*)buf.data);
  539. UA_ByteString_deleteMembers(&buf);
  540. }
  541. END_TEST
  542. START_TEST(UA_Int32_Zero_Number_json_encode) {
  543. UA_Int32 *src = UA_Int32_new();
  544. *src = 0;
  545. const UA_DataType *type = &UA_TYPES[UA_TYPES_INT32];
  546. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  547. UA_ByteString buf;
  548. UA_ByteString_allocBuffer(&buf, size+1);
  549. UA_Byte *bufPos = &buf.data[0];
  550. const UA_Byte *bufEnd = &buf.data[size+1];
  551. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  552. *bufPos = 0;
  553. // then
  554. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  555. char* result = "0";
  556. ck_assert_str_eq(result, (char*)buf.data);
  557. UA_ByteString_deleteMembers(&buf);
  558. UA_Int32_delete(src);
  559. }
  560. END_TEST
  561. START_TEST(UA_Int32_smallbuf_Number_json_encode) {
  562. UA_Int32 *src = UA_Int32_new();
  563. *src = 127;
  564. const UA_DataType *type = &UA_TYPES[UA_TYPES_INT32];
  565. UA_ByteString buf;
  566. UA_ByteString_allocBuffer(&buf, 2);
  567. UA_Byte *bufPos = &buf.data[0];
  568. const UA_Byte *bufEnd = &buf.data[2];
  569. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  570. *bufPos = 0;
  571. // then
  572. ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  573. UA_ByteString_deleteMembers(&buf);
  574. UA_Int32_delete(src);
  575. }
  576. END_TEST
  577. /* UINT64*/
  578. START_TEST(UA_UInt64_Max_Number_json_encode) {
  579. UA_UInt64 *src = UA_UInt64_new();
  580. //*src = 18446744073709551615;
  581. ((u8*)src)[0] = 0xFF;
  582. ((u8*)src)[1] = 0xFF;
  583. ((u8*)src)[2] = 0xFF;
  584. ((u8*)src)[3] = 0xFF;
  585. ((u8*)src)[4] = 0xFF;
  586. ((u8*)src)[5] = 0xFF;
  587. ((u8*)src)[6] = 0xFF;
  588. ((u8*)src)[7] = 0xFF;
  589. const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT64];
  590. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  591. UA_ByteString buf;
  592. UA_ByteString_allocBuffer(&buf, size+1);
  593. UA_Byte *bufPos = &buf.data[0];
  594. const UA_Byte *bufEnd = &buf.data[size+1];
  595. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  596. *bufPos = 0;
  597. // then
  598. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  599. char* result = "\"18446744073709551615\"";
  600. ck_assert_str_eq(result, (char*)buf.data);
  601. UA_ByteString_deleteMembers(&buf);
  602. UA_UInt64_delete(src);
  603. }
  604. END_TEST
  605. START_TEST(UA_UInt64_Min_Number_json_encode) {
  606. UA_UInt64 *src = UA_UInt64_new();
  607. *src = 0;
  608. const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT64];
  609. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  610. UA_ByteString buf;
  611. UA_ByteString_allocBuffer(&buf, size+1);
  612. UA_Byte *bufPos = &buf.data[0];
  613. const UA_Byte *bufEnd = &buf.data[size+1];
  614. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  615. *bufPos = 0;
  616. // then
  617. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  618. char* result = "\"0\"";
  619. ck_assert_str_eq(result, (char*)buf.data);
  620. UA_ByteString_deleteMembers(&buf);
  621. UA_UInt64_delete(src);
  622. }
  623. END_TEST
  624. START_TEST(UA_UInt64_smallbuf_Number_json_encode) {
  625. UA_UInt64 *src = UA_UInt64_new();
  626. //*src = -9223372036854775808;
  627. ((u8*)src)[0] = 0x00;
  628. ((u8*)src)[1] = 0x00;
  629. ((u8*)src)[2] = 0x00;
  630. ((u8*)src)[3] = 0x00;
  631. ((u8*)src)[4] = 0x00;
  632. ((u8*)src)[5] = 0x00;
  633. ((u8*)src)[6] = 0x00;
  634. ((u8*)src)[7] = 0x80;
  635. const UA_DataType *type = &UA_TYPES[UA_TYPES_UINT64];
  636. UA_ByteString buf;
  637. UA_ByteString_allocBuffer(&buf, 2);
  638. UA_Byte *bufPos = &buf.data[0];
  639. const UA_Byte *bufEnd = &buf.data[2];
  640. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  641. *bufPos = 0;
  642. // then
  643. ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  644. UA_ByteString_deleteMembers(&buf);
  645. UA_UInt64_delete(src);
  646. }
  647. END_TEST
  648. /* Int64 */
  649. START_TEST(UA_Int64_Max_Number_json_encode) {
  650. UA_Int64 *src = UA_Int64_new();
  651. //*src = 9223372036854775808;
  652. ((u8*)src)[0] = 0xFF;
  653. ((u8*)src)[1] = 0xFF;
  654. ((u8*)src)[2] = 0xFF;
  655. ((u8*)src)[3] = 0xFF;
  656. ((u8*)src)[4] = 0xFF;
  657. ((u8*)src)[5] = 0xFF;
  658. ((u8*)src)[6] = 0xFF;
  659. ((u8*)src)[7] = 0x7F;
  660. const UA_DataType *type = &UA_TYPES[UA_TYPES_INT64];
  661. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  662. UA_ByteString buf;
  663. UA_ByteString_allocBuffer(&buf, size+1);
  664. UA_Byte *bufPos = &buf.data[0];
  665. const UA_Byte *bufEnd = &buf.data[size+1];
  666. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  667. *bufPos = 0;
  668. // then
  669. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  670. char* result = "\"9223372036854775807\"";
  671. ck_assert_str_eq(result, (char*)buf.data);
  672. UA_ByteString_deleteMembers(&buf);
  673. UA_Int64_delete(src);
  674. }
  675. END_TEST
  676. START_TEST(UA_Int64_Min_Number_json_encode) {
  677. UA_Int64 *src = UA_Int64_new();
  678. // TODO: compiler error: integer constant is so large that it is unsigned [-Werror]
  679. //*src = -9223372036854775808;
  680. ((u8*)src)[0] = 0x00;
  681. ((u8*)src)[1] = 0x00;
  682. ((u8*)src)[2] = 0x00;
  683. ((u8*)src)[3] = 0x00;
  684. ((u8*)src)[4] = 0x00;
  685. ((u8*)src)[5] = 0x00;
  686. ((u8*)src)[6] = 0x00;
  687. ((u8*)src)[7] = 0x80;
  688. const UA_DataType *type = &UA_TYPES[UA_TYPES_INT64];
  689. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  690. UA_ByteString buf;
  691. UA_ByteString_allocBuffer(&buf, size+1);
  692. UA_Byte *bufPos = &buf.data[0];
  693. const UA_Byte *bufEnd = &buf.data[size+1];
  694. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  695. *bufPos = 0;
  696. // then
  697. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  698. char* result = "\"-9223372036854775808\"";
  699. ck_assert_str_eq(result, (char*)buf.data);
  700. UA_ByteString_deleteMembers(&buf);
  701. UA_Int64_delete(src);
  702. }
  703. END_TEST
  704. START_TEST(UA_Int64_Zero_Number_json_encode) {
  705. UA_Int64 *src = UA_Int64_new();
  706. *src = 0;
  707. const UA_DataType *type = &UA_TYPES[UA_TYPES_INT64];
  708. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  709. UA_ByteString buf;
  710. UA_ByteString_allocBuffer(&buf, size+1);
  711. UA_Byte *bufPos = &buf.data[0];
  712. const UA_Byte *bufEnd = &buf.data[size+1];
  713. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  714. *bufPos = 0;
  715. // then
  716. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  717. char* result = "\"0\"";
  718. ck_assert_str_eq(result, (char*)buf.data);
  719. UA_ByteString_deleteMembers(&buf);
  720. UA_Int64_delete(src);
  721. }
  722. END_TEST
  723. START_TEST(UA_Int64_smallbuf_Number_json_encode) {
  724. UA_Int64 *src = UA_Int64_new();
  725. *src = 127;
  726. const UA_DataType *type = &UA_TYPES[UA_TYPES_INT64];
  727. UA_ByteString buf;
  728. UA_ByteString_allocBuffer(&buf, 2);
  729. UA_Byte *bufPos = &buf.data[0];
  730. const UA_Byte *bufEnd = &buf.data[2];
  731. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  732. *bufPos = 0;
  733. // then
  734. ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  735. UA_ByteString_deleteMembers(&buf);
  736. UA_Int64_delete(src);
  737. }
  738. END_TEST
  739. START_TEST(UA_Double_json_encode) {
  740. UA_Double src = 1.1234;
  741. const UA_DataType *type = &UA_TYPES[UA_TYPES_DOUBLE];
  742. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  743. UA_ByteString buf;
  744. UA_ByteString_allocBuffer(&buf, size+1);
  745. UA_Byte *bufPos = &buf.data[0];
  746. const UA_Byte *bufEnd = &buf.data[size+1];
  747. status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  748. *bufPos = 0;
  749. // then
  750. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  751. char* result = "1.1233999999999999541699935434735380113124847412109375";
  752. ck_assert_str_eq(result, (char*)buf.data);
  753. UA_ByteString_deleteMembers(&buf);
  754. }
  755. END_TEST
  756. START_TEST(UA_Double_pluszero_json_encode) {
  757. UA_Double src = 0;
  758. const UA_DataType *type = &UA_TYPES[UA_TYPES_DOUBLE];
  759. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  760. UA_ByteString buf;
  761. UA_ByteString_allocBuffer(&buf, size+1);
  762. UA_Byte *bufPos = &buf.data[0];
  763. const UA_Byte *bufEnd = &buf.data[size+1];
  764. status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  765. *bufPos = 0;
  766. // then
  767. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  768. char* result = "0";
  769. ck_assert_str_eq(result, (char*)buf.data);
  770. UA_ByteString_deleteMembers(&buf);
  771. }
  772. END_TEST
  773. START_TEST(UA_Double_minuszero_json_encode) {
  774. UA_Double src = -0;
  775. const UA_DataType *type = &UA_TYPES[UA_TYPES_DOUBLE];
  776. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  777. UA_ByteString buf;
  778. UA_ByteString_allocBuffer(&buf, size+1);
  779. UA_Byte *bufPos = &buf.data[0];
  780. const UA_Byte *bufEnd = &buf.data[size+1];
  781. status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  782. *bufPos = 0;
  783. // then
  784. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  785. char* result = "0";
  786. ck_assert_str_eq(result, (char*)buf.data);
  787. UA_ByteString_deleteMembers(&buf);
  788. }
  789. END_TEST
  790. START_TEST(UA_Double_plusInf_json_encode) {
  791. UA_Double src = INFINITY;
  792. const UA_DataType *type = &UA_TYPES[UA_TYPES_DOUBLE];
  793. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  794. UA_ByteString buf;
  795. UA_ByteString_allocBuffer(&buf, size+1);
  796. UA_Byte *bufPos = &buf.data[0];
  797. const UA_Byte *bufEnd = &buf.data[size+1];
  798. status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  799. *bufPos = 0;
  800. // then
  801. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  802. char* result = "\"Infinity\"";
  803. ck_assert_str_eq(result, (char*)buf.data);
  804. UA_ByteString_deleteMembers(&buf);
  805. }
  806. END_TEST
  807. START_TEST(UA_Double_minusInf_json_encode) {
  808. UA_Double src = -INFINITY;
  809. const UA_DataType *type = &UA_TYPES[UA_TYPES_DOUBLE];
  810. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  811. UA_ByteString buf;
  812. UA_ByteString_allocBuffer(&buf, size+1);
  813. UA_Byte *bufPos = &buf.data[0];
  814. const UA_Byte *bufEnd = &buf.data[size+1];
  815. status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  816. *bufPos = 0;
  817. // then
  818. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  819. char* result = "\"-Infinity\"";
  820. ck_assert_str_eq(result, (char*)buf.data);
  821. UA_ByteString_deleteMembers(&buf);
  822. }
  823. END_TEST
  824. START_TEST(UA_Double_nan_json_encode) {
  825. UA_Double src = NAN;
  826. const UA_DataType *type = &UA_TYPES[UA_TYPES_DOUBLE];
  827. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  828. UA_ByteString buf;
  829. UA_ByteString_allocBuffer(&buf, size+1);
  830. UA_Byte *bufPos = &buf.data[0];
  831. const UA_Byte *bufEnd = &buf.data[size+1];
  832. status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  833. *bufPos = 0;
  834. // then
  835. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  836. char* result = "\"NaN\"";
  837. ck_assert_str_eq(result, (char*)buf.data);
  838. UA_ByteString_deleteMembers(&buf);
  839. }
  840. END_TEST
  841. START_TEST(UA_Double_onesmallest_json_encode) {
  842. UA_Double src = 1.0000000000000002220446049250313080847263336181640625;
  843. const UA_DataType *type = &UA_TYPES[UA_TYPES_DOUBLE];
  844. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  845. UA_ByteString buf;
  846. UA_ByteString_allocBuffer(&buf, size+1);
  847. UA_Byte *bufPos = &buf.data[0];
  848. const UA_Byte *bufEnd = &buf.data[size+1];
  849. status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  850. *bufPos = 0;
  851. // then
  852. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  853. char* result = "1.0000000000000002220446049250313080847263336181640625";
  854. ck_assert_str_eq(result, (char*)buf.data);
  855. UA_ByteString_deleteMembers(&buf);
  856. }
  857. END_TEST
  858. START_TEST(UA_Float_json_encode) {
  859. UA_Float src = 1.0000000000F;
  860. const UA_DataType *type = &UA_TYPES[UA_TYPES_FLOAT];
  861. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  862. UA_ByteString buf;
  863. UA_ByteString_allocBuffer(&buf, size+1);
  864. UA_Byte *bufPos = &buf.data[0];
  865. const UA_Byte *bufEnd = &buf.data[size+1];
  866. status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  867. *bufPos = 0;
  868. // then
  869. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  870. char* result = "1";
  871. ck_assert_str_eq(result, (char*)buf.data);
  872. UA_ByteString_deleteMembers(&buf);
  873. }
  874. END_TEST
  875. /* -------------------------LocalizedText------------------------- */
  876. START_TEST(UA_LocText_json_encode) {
  877. UA_LocalizedText *src = UA_LocalizedText_new();
  878. UA_LocalizedText_init(src);
  879. src->locale = UA_STRING_ALLOC("theLocale");
  880. src->text = UA_STRING_ALLOC("theText");
  881. const UA_DataType *type = &UA_TYPES[UA_TYPES_LOCALIZEDTEXT];
  882. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  883. UA_ByteString buf;
  884. UA_ByteString_allocBuffer(&buf, size+1);
  885. UA_Byte *bufPos = &buf.data[0];
  886. const UA_Byte *bufEnd = &buf.data[size+1];
  887. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  888. *bufPos = 0;
  889. // then
  890. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  891. char* result = "{\"Locale\":\"theLocale\",\"Text\":\"theText\"}";
  892. ck_assert_str_eq(result, (char*)buf.data);
  893. UA_ByteString_deleteMembers(&buf);
  894. UA_LocalizedText_delete(src);
  895. }
  896. END_TEST
  897. START_TEST(UA_LocText_NonReversible_json_encode) {
  898. UA_LocalizedText *src = UA_LocalizedText_new();
  899. UA_LocalizedText_init(src);
  900. src->locale = UA_STRING_ALLOC("theLocale");
  901. src->text = UA_STRING_ALLOC("theText");
  902. const UA_DataType *type = &UA_TYPES[UA_TYPES_LOCALIZEDTEXT];
  903. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE);
  904. UA_ByteString buf;
  905. UA_ByteString_allocBuffer(&buf, size+1);
  906. UA_Byte *bufPos = &buf.data[0];
  907. const UA_Byte *bufEnd = &buf.data[size+1];
  908. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
  909. *bufPos = 0;
  910. // then
  911. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  912. char* result = "\"theText\"";
  913. ck_assert_str_eq(result, (char*)buf.data);
  914. UA_ByteString_deleteMembers(&buf);
  915. UA_LocalizedText_delete(src);
  916. }
  917. END_TEST
  918. START_TEST(UA_LocText_smallBuffer_json_encode) {
  919. UA_LocalizedText *src = UA_LocalizedText_new();
  920. UA_LocalizedText_init(src);
  921. src->locale = UA_STRING_ALLOC("theLocale");
  922. src->text = UA_STRING_ALLOC("theText");
  923. const UA_DataType *type = &UA_TYPES[UA_TYPES_LOCALIZEDTEXT];
  924. UA_ByteString buf;
  925. UA_ByteString_allocBuffer(&buf, 4);
  926. UA_Byte *bufPos = &buf.data[0];
  927. const UA_Byte *bufEnd = &buf.data[4];
  928. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  929. // then
  930. ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  931. UA_ByteString_deleteMembers(&buf);
  932. UA_LocalizedText_delete(src);
  933. }
  934. END_TEST
  935. /* --------------------------------GUID----------------------------------- */
  936. START_TEST(UA_Guid_json_encode) {
  937. UA_Guid src = {3, 9, 10, {8, 7, 6, 5, 4, 3, 2, 1}};
  938. const UA_DataType *type = &UA_TYPES[UA_TYPES_GUID];
  939. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  940. UA_ByteString buf;
  941. UA_ByteString_allocBuffer(&buf, size+1);
  942. UA_Byte *bufPos = &buf.data[0];
  943. const UA_Byte *bufEnd = &buf.data[size+1];
  944. status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  945. *bufPos = 0;
  946. // then
  947. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  948. char* result = "\"00000003-0009-000A-0807-060504030201\"";
  949. ck_assert_str_eq(result, (char*)buf.data);
  950. UA_ByteString_deleteMembers(&buf);
  951. }
  952. END_TEST
  953. START_TEST(UA_Guid_smallbuf_json_encode) {
  954. UA_Guid *src = UA_Guid_new();
  955. *src = UA_Guid_random();
  956. const UA_DataType *type = &UA_TYPES[UA_TYPES_GUID];
  957. UA_ByteString buf;
  958. UA_ByteString_allocBuffer(&buf, 1);
  959. UA_Byte *bufPos = &buf.data[0];
  960. const UA_Byte *bufEnd = &buf.data[1];
  961. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  962. *bufPos = 0;
  963. // then
  964. ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  965. UA_ByteString_deleteMembers(&buf);
  966. UA_Guid_delete(src);
  967. }
  968. END_TEST
  969. /* -------------------------DateTime--------------------------------------*/
  970. START_TEST(UA_DateTime_json_encode) {
  971. UA_DateTime *src = UA_DateTime_new();
  972. *src = UA_DateTime_fromUnixTime(1234567);
  973. const UA_DataType *type = &UA_TYPES[UA_TYPES_DATETIME];
  974. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  975. UA_ByteString buf;
  976. UA_ByteString_allocBuffer(&buf, size+1);
  977. UA_Byte *bufPos = &buf.data[0];
  978. const UA_Byte *bufEnd = &buf.data[size+1];
  979. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  980. *bufPos = 0;
  981. // then
  982. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  983. char* result = "\"1970-01-15T06:56:07Z\"";
  984. ck_assert_str_eq(result, (char*)buf.data);
  985. UA_ByteString_deleteMembers(&buf);
  986. UA_DateTime_delete(src);
  987. }
  988. END_TEST
  989. START_TEST(UA_DateTime_with_nanoseconds_json_encode) {
  990. UA_DateTime *src = UA_DateTime_new();
  991. *src = UA_DateTime_fromUnixTime(1234567) + 8901234;
  992. const UA_DataType *type = &UA_TYPES[UA_TYPES_DATETIME];
  993. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  994. UA_ByteString buf;
  995. UA_ByteString_allocBuffer(&buf, size+1);
  996. UA_Byte *bufPos = &buf.data[0];
  997. const UA_Byte *bufEnd = &buf.data[size+1];
  998. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  999. *bufPos = 0;
  1000. // then
  1001. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1002. char* result = "\"1970-01-15T06:56:07.8901234Z\"";
  1003. ck_assert_str_eq(result, (char*)buf.data);
  1004. UA_ByteString_deleteMembers(&buf);
  1005. UA_DateTime_delete(src);
  1006. }
  1007. END_TEST
  1008. /* ------------------------Statuscode--------------------------------- */
  1009. START_TEST(UA_StatusCode_json_encode) {
  1010. UA_StatusCode *src = UA_StatusCode_new();
  1011. *src = UA_STATUSCODE_BADAGGREGATECONFIGURATIONREJECTED;
  1012. const UA_DataType *type = &UA_TYPES[UA_TYPES_STATUSCODE];
  1013. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1014. UA_ByteString buf;
  1015. UA_ByteString_allocBuffer(&buf, size+1);
  1016. UA_Byte *bufPos = &buf.data[0];
  1017. const UA_Byte *bufEnd = &buf.data[size+1];
  1018. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1019. *bufPos = 0;
  1020. // then
  1021. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1022. char* result = "2161770496";
  1023. ck_assert_str_eq(result, (char*)buf.data);
  1024. UA_ByteString_deleteMembers(&buf);
  1025. UA_StatusCode_delete(src);
  1026. }
  1027. END_TEST
  1028. START_TEST(UA_StatusCode_nonReversible_json_encode) {
  1029. UA_StatusCode *src = UA_StatusCode_new();
  1030. *src = UA_STATUSCODE_BADAGGREGATECONFIGURATIONREJECTED;
  1031. const UA_DataType *type = &UA_TYPES[UA_TYPES_STATUSCODE];
  1032. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE);
  1033. UA_ByteString buf;
  1034. UA_ByteString_allocBuffer(&buf, size+1);
  1035. UA_Byte *bufPos = &buf.data[0];
  1036. const UA_Byte *bufEnd = &buf.data[size+1];
  1037. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
  1038. *bufPos = 0;
  1039. // then
  1040. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1041. char* result = "{\"Code\":2161770496,\"Symbol\":\"BadAggregateConfigurationRejected\"}";
  1042. ck_assert_str_eq(result, (char*)buf.data);
  1043. UA_ByteString_deleteMembers(&buf);
  1044. UA_StatusCode_delete(src);
  1045. }
  1046. END_TEST
  1047. START_TEST(UA_StatusCode_nonReversible_good_json_encode) {
  1048. UA_StatusCode *src = UA_StatusCode_new();
  1049. *src = UA_STATUSCODE_GOOD;
  1050. const UA_DataType *type = &UA_TYPES[UA_TYPES_STATUSCODE];
  1051. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE);
  1052. UA_ByteString buf;
  1053. UA_ByteString_allocBuffer(&buf, size+1);
  1054. UA_Byte *bufPos = &buf.data[0];
  1055. const UA_Byte *bufEnd = &buf.data[size+1];
  1056. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
  1057. *bufPos = 0;
  1058. // then
  1059. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1060. char* result = "null";
  1061. ck_assert_str_eq(result, (char*)buf.data);
  1062. UA_ByteString_deleteMembers(&buf);
  1063. UA_StatusCode_delete(src);
  1064. }
  1065. END_TEST
  1066. START_TEST(UA_StatusCode_smallbuf_json_encode) {
  1067. UA_StatusCode *src = UA_StatusCode_new();
  1068. *src = UA_STATUSCODE_BADAGGREGATECONFIGURATIONREJECTED;
  1069. const UA_DataType *type = &UA_TYPES[UA_TYPES_STATUSCODE];
  1070. UA_ByteString buf;
  1071. UA_ByteString_allocBuffer(&buf, 1);
  1072. UA_Byte *bufPos = &buf.data[0];
  1073. const UA_Byte *bufEnd = &buf.data[1];
  1074. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
  1075. // then
  1076. ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  1077. UA_ByteString_deleteMembers(&buf);
  1078. UA_StatusCode_delete(src);
  1079. }
  1080. END_TEST
  1081. /* -------------------------------NodeId--------------------------------*/
  1082. /* Numeric */
  1083. START_TEST(UA_NodeId_Numeric_json_encode) {
  1084. UA_NodeId *src = UA_NodeId_new();
  1085. *src = UA_NODEID_NUMERIC(0, 5555);
  1086. const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
  1087. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1088. UA_ByteString buf;
  1089. UA_ByteString_allocBuffer(&buf, size+1);
  1090. UA_Byte *bufPos = &buf.data[0];
  1091. const UA_Byte *bufEnd = &buf.data[size+1];
  1092. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1093. *bufPos = 0;
  1094. // then
  1095. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1096. char* result = "{\"Id\":5555}";
  1097. ck_assert_str_eq(result, (char*)buf.data);
  1098. UA_ByteString_deleteMembers(&buf);
  1099. UA_NodeId_delete(src);
  1100. }
  1101. END_TEST
  1102. START_TEST(UA_NodeId_Numeric_Namespace_json_encode) {
  1103. UA_NodeId *src = UA_NodeId_new();
  1104. *src = UA_NODEID_NUMERIC(4, 5555);
  1105. const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
  1106. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1107. UA_ByteString buf;
  1108. UA_ByteString_allocBuffer(&buf, size+1);
  1109. UA_Byte *bufPos = &buf.data[0];
  1110. const UA_Byte *bufEnd = &buf.data[size+1];
  1111. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1112. *bufPos = 0;
  1113. // then
  1114. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1115. char* result = "{\"Id\":5555,\"Namespace\":4}";
  1116. ck_assert_str_eq(result, (char*)buf.data);
  1117. UA_ByteString_deleteMembers(&buf);
  1118. UA_NodeId_delete(src);
  1119. }
  1120. END_TEST
  1121. /* String */
  1122. START_TEST(UA_NodeId_String_json_encode) {
  1123. UA_NodeId *src = UA_NodeId_new();
  1124. *src = UA_NODEID_STRING_ALLOC(0, "foobar");
  1125. const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
  1126. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1127. UA_ByteString buf;
  1128. UA_ByteString_allocBuffer(&buf, size+1);
  1129. UA_Byte *bufPos = &buf.data[0];
  1130. const UA_Byte *bufEnd = &buf.data[size+1];
  1131. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1132. *bufPos = 0;
  1133. // then
  1134. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1135. char* result = "{\"IdType\":1,\"Id\":\"foobar\"}";
  1136. ck_assert_str_eq(result, (char*)buf.data);
  1137. UA_ByteString_deleteMembers(&buf);
  1138. UA_NodeId_delete(src);
  1139. }
  1140. END_TEST
  1141. START_TEST(UA_NodeId_String_Namespace_json_encode) {
  1142. UA_NodeId *src = UA_NodeId_new();
  1143. *src = UA_NODEID_STRING_ALLOC(5, "foobar");
  1144. const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
  1145. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1146. UA_ByteString buf;
  1147. UA_ByteString_allocBuffer(&buf, size+1);
  1148. UA_Byte *bufPos = &buf.data[0];
  1149. const UA_Byte *bufEnd = &buf.data[size+1];
  1150. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1151. *bufPos = 0;
  1152. // then
  1153. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1154. char* result = "{\"IdType\":1,\"Id\":\"foobar\",\"Namespace\":5}";
  1155. ck_assert_str_eq(result, (char*)buf.data);
  1156. UA_ByteString_deleteMembers(&buf);
  1157. UA_NodeId_delete(src);
  1158. }
  1159. END_TEST
  1160. /* Guid */
  1161. START_TEST(UA_NodeId_Guid_json_encode) {
  1162. UA_NodeId *src = UA_NodeId_new();
  1163. UA_NodeId_init(src);
  1164. UA_Guid g = {3, 9, 10, {8, 7, 6, 5, 4, 3, 2, 1}};
  1165. *src = UA_NODEID_GUID(0, g);
  1166. const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
  1167. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1168. UA_ByteString buf;
  1169. UA_ByteString_allocBuffer(&buf, size+1);
  1170. UA_Byte *bufPos = &buf.data[0];
  1171. const UA_Byte *bufEnd = &buf.data[size+1];
  1172. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1173. *bufPos = 0;
  1174. // then
  1175. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1176. char* result = "{\"IdType\":2,\"Id\":\"00000003-0009-000A-0807-060504030201\"}";
  1177. ck_assert_str_eq(result, (char*)buf.data);
  1178. UA_ByteString_deleteMembers(&buf);
  1179. UA_NodeId_delete(src);
  1180. }
  1181. END_TEST
  1182. START_TEST(UA_NodeId_Guid_Namespace_json_encode) {
  1183. UA_NodeId *src = UA_NodeId_new();
  1184. UA_Guid g = {3, 9, 10, {8, 7, 6, 5, 4, 3, 2, 1}};
  1185. *src = UA_NODEID_GUID(5, g);
  1186. const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
  1187. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1188. UA_ByteString buf;
  1189. // {"IdType":2,"Id":"00000003-0009-000A-0807-060504030201","Namespace":5}
  1190. ck_assert_int_eq(size, 70);
  1191. UA_ByteString_allocBuffer(&buf, size+1);
  1192. UA_Byte *bufPos = &buf.data[0];
  1193. const UA_Byte *bufEnd = &buf.data[size+1];
  1194. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1195. *bufPos = 0;
  1196. // then
  1197. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1198. char* result = "{\"IdType\":2,\"Id\":\"00000003-0009-000A-0807-060504030201\",\"Namespace\":5}";
  1199. ck_assert_str_eq(result, (char*)buf.data);
  1200. UA_ByteString_deleteMembers(&buf);
  1201. UA_NodeId_delete(src);
  1202. }
  1203. END_TEST
  1204. /* ByteString */
  1205. START_TEST(UA_NodeId_ByteString_json_encode) {
  1206. UA_NodeId *src = UA_NodeId_new();
  1207. *src = UA_NODEID_BYTESTRING_ALLOC(0, "asdfasdf");
  1208. const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
  1209. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1210. UA_ByteString buf;
  1211. UA_ByteString_allocBuffer(&buf, size+1);
  1212. UA_Byte *bufPos = &buf.data[0];
  1213. const UA_Byte *bufEnd = &buf.data[size+1];
  1214. //{"IdType":3,"Id":"YXNkZmFzZGY="}
  1215. ck_assert_int_eq(size, 32);
  1216. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1217. *bufPos = 0;
  1218. // then
  1219. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1220. char* result = "{\"IdType\":3,\"Id\":\"YXNkZmFzZGY=\"}";
  1221. ck_assert_str_eq(result, (char*)buf.data);
  1222. UA_ByteString_deleteMembers(&buf);
  1223. UA_NodeId_delete(src);
  1224. }
  1225. END_TEST
  1226. START_TEST(UA_NodeId_ByteString_Namespace_json_encode) {
  1227. UA_NodeId *src = UA_NodeId_new();
  1228. *src = UA_NODEID_BYTESTRING_ALLOC(5, "asdfasdf");
  1229. const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
  1230. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1231. UA_ByteString buf;
  1232. UA_ByteString_allocBuffer(&buf, size+1);
  1233. UA_Byte *bufPos = &buf.data[0];
  1234. const UA_Byte *bufEnd = &buf.data[size+1];
  1235. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1236. *bufPos = 0;
  1237. // then
  1238. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1239. char* result = "{\"IdType\":3,\"Id\":\"YXNkZmFzZGY=\",\"Namespace\":5}";
  1240. ck_assert_str_eq(result, (char*)buf.data);
  1241. UA_ByteString_deleteMembers(&buf);
  1242. UA_NodeId_delete(src);
  1243. }
  1244. END_TEST
  1245. /* Non-reversible, Namespace */
  1246. START_TEST(UA_NodeId_NonReversible_Numeric_Namespace_json_encode) {
  1247. UA_NodeId *src = UA_NodeId_new();
  1248. *src = UA_NODEID_NUMERIC(2, 5555);
  1249. const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
  1250. UA_String namespaces[3] = {UA_STRING("ns0"),UA_STRING("ns1"),UA_STRING("ns2")};
  1251. size_t size = UA_calcSizeJson((void *) src, type, namespaces, 3, NULL, 0, UA_FALSE);
  1252. ck_assert_int_ne(size, 0);
  1253. UA_ByteString buf;
  1254. UA_ByteString_allocBuffer(&buf, size+1);
  1255. UA_Byte *bufPos = &buf.data[0];
  1256. const UA_Byte *bufEnd = &buf.data[size+1];
  1257. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, namespaces, 3, NULL, 0, UA_FALSE);
  1258. *bufPos = 0;
  1259. // then
  1260. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1261. char* result = "{\"Id\":5555,\"Namespace\":\"ns2\"}";
  1262. ck_assert_str_eq(result, (char*)buf.data);
  1263. UA_ByteString_deleteMembers(&buf);
  1264. UA_NodeId_delete(src);
  1265. }
  1266. END_TEST
  1267. /* --------------------Diagnostic Info------------------------- */
  1268. START_TEST(UA_DiagInfo_json_encode) {
  1269. UA_DiagnosticInfo *src = UA_DiagnosticInfo_new();
  1270. UA_DiagnosticInfo_init(src);
  1271. src->hasAdditionalInfo = UA_TRUE;
  1272. src->hasInnerDiagnosticInfo = UA_FALSE;
  1273. src->hasInnerStatusCode = UA_TRUE;
  1274. src->hasLocale = UA_TRUE;
  1275. src->hasSymbolicId = UA_TRUE;
  1276. src->hasLocalizedText = UA_TRUE;
  1277. src->hasNamespaceUri = UA_TRUE;
  1278. UA_StatusCode statusCode = UA_STATUSCODE_BADARGUMENTSMISSING;
  1279. src->additionalInfo = UA_STRING_ALLOC("additionalInfo");
  1280. src->innerStatusCode = statusCode;
  1281. src->locale = 12;
  1282. src->symbolicId = 13;
  1283. src->localizedText = 14;
  1284. src->namespaceUri = 15;
  1285. const UA_DataType *type = &UA_TYPES[UA_TYPES_DIAGNOSTICINFO];
  1286. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1287. UA_ByteString buf;
  1288. UA_ByteString_allocBuffer(&buf, size+1);
  1289. UA_Byte *bufPos = &buf.data[0];
  1290. const UA_Byte *bufEnd = &buf.data[size+1];
  1291. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1292. *bufPos = 0;
  1293. // then
  1294. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1295. char* result = "{\"SymbolicId\":13,\"NamespaceUri\":15,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}";
  1296. ck_assert_str_eq(result, (char*)buf.data);
  1297. UA_ByteString_deleteMembers(&buf);
  1298. UA_DiagnosticInfo_delete(src);
  1299. }
  1300. END_TEST
  1301. START_TEST(UA_DiagInfo_withInner_json_encode) {
  1302. UA_DiagnosticInfo *innerDiag = UA_DiagnosticInfo_new();
  1303. UA_DiagnosticInfo_init(innerDiag);
  1304. innerDiag->hasAdditionalInfo = UA_TRUE;
  1305. innerDiag->additionalInfo = UA_STRING_ALLOC("INNER ADDITION INFO");
  1306. innerDiag->hasInnerDiagnosticInfo = UA_FALSE;
  1307. innerDiag->hasInnerStatusCode = UA_FALSE;
  1308. innerDiag->hasLocale = UA_FALSE;
  1309. innerDiag->hasSymbolicId = UA_FALSE;
  1310. innerDiag->hasLocalizedText = UA_FALSE;
  1311. innerDiag->hasNamespaceUri = UA_FALSE;
  1312. UA_DiagnosticInfo *src = UA_DiagnosticInfo_new();
  1313. UA_DiagnosticInfo_init(src);
  1314. src->hasAdditionalInfo = UA_TRUE;
  1315. src->hasInnerDiagnosticInfo = UA_TRUE;
  1316. src->hasInnerStatusCode = UA_TRUE;
  1317. src->hasLocale = UA_TRUE;
  1318. src->hasSymbolicId = UA_TRUE;
  1319. src->hasLocalizedText = UA_TRUE;
  1320. src->hasNamespaceUri = UA_FALSE;
  1321. UA_StatusCode statusCode = UA_STATUSCODE_BADARGUMENTSMISSING;
  1322. src->additionalInfo = UA_STRING_ALLOC("additionalInfo");
  1323. src->innerDiagnosticInfo = innerDiag;
  1324. src->innerStatusCode = statusCode;
  1325. src->locale = 12;
  1326. src->symbolicId = 13;
  1327. src->localizedText = 14;
  1328. const UA_DataType *type = &UA_TYPES[UA_TYPES_DIAGNOSTICINFO];
  1329. UA_ByteString buf;
  1330. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1331. UA_ByteString_allocBuffer(&buf, size+1);
  1332. UA_Byte *bufPos = &buf.data[0];
  1333. const UA_Byte *bufEnd = &buf.data[size+1];
  1334. //{"SymbolicId":13,"LocalizedText":14,"Locale":12,"AdditionalInfo":"additionalInfo","InnerStatusCode":2155216896,"InnerDiagnosticInfo":{"AdditionalInfo":"INNER ADDITION INFO"}}
  1335. ck_assert_int_eq(size, 174);
  1336. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1337. *bufPos = 0;
  1338. // then
  1339. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1340. char* result = "{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896,\"InnerDiagnosticInfo\":{\"AdditionalInfo\":\"INNER ADDITION INFO\"}}";
  1341. ck_assert_str_eq(result, (char*)buf.data);
  1342. UA_ByteString_deleteMembers(&buf);
  1343. UA_DiagnosticInfo_delete(src);
  1344. }
  1345. END_TEST
  1346. START_TEST(UA_DiagInfo_withTwoInner_json_encode) {
  1347. UA_DiagnosticInfo *innerDiag2 = UA_DiagnosticInfo_new();
  1348. UA_DiagnosticInfo_init(innerDiag2);
  1349. innerDiag2->hasAdditionalInfo = UA_TRUE;
  1350. innerDiag2->additionalInfo = UA_STRING_ALLOC("INNER ADDITION INFO2");
  1351. innerDiag2->hasInnerDiagnosticInfo = UA_FALSE;
  1352. innerDiag2->hasInnerStatusCode = UA_FALSE;
  1353. innerDiag2->hasLocale = UA_FALSE;
  1354. innerDiag2->hasSymbolicId = UA_FALSE;
  1355. innerDiag2->hasLocalizedText = UA_FALSE;
  1356. innerDiag2->hasNamespaceUri = UA_FALSE;
  1357. UA_DiagnosticInfo *innerDiag = UA_DiagnosticInfo_new();
  1358. UA_DiagnosticInfo_init(innerDiag);
  1359. innerDiag->hasAdditionalInfo = UA_TRUE;
  1360. innerDiag->additionalInfo = UA_STRING_ALLOC("INNER ADDITION INFO");
  1361. innerDiag->hasInnerDiagnosticInfo = UA_TRUE;
  1362. innerDiag->innerDiagnosticInfo = innerDiag2;
  1363. innerDiag->hasInnerStatusCode = UA_FALSE;
  1364. innerDiag->hasLocale = UA_FALSE;
  1365. innerDiag->hasSymbolicId = UA_FALSE;
  1366. innerDiag->hasLocalizedText = UA_FALSE;
  1367. innerDiag->hasNamespaceUri = UA_FALSE;
  1368. UA_DiagnosticInfo *src = UA_DiagnosticInfo_new();
  1369. UA_DiagnosticInfo_init(src);
  1370. src->hasAdditionalInfo = UA_TRUE;
  1371. src->hasInnerDiagnosticInfo = UA_TRUE;
  1372. src->hasInnerStatusCode = UA_TRUE;
  1373. src->hasLocale = UA_TRUE;
  1374. src->hasSymbolicId = UA_TRUE;
  1375. src->hasLocalizedText = UA_TRUE;
  1376. src->hasNamespaceUri = UA_FALSE;
  1377. UA_StatusCode statusCode = UA_STATUSCODE_BADARGUMENTSMISSING;
  1378. src->additionalInfo = UA_STRING_ALLOC("additionalInfo");
  1379. src->innerDiagnosticInfo = innerDiag;
  1380. src->innerStatusCode = statusCode;
  1381. src->locale = 12;
  1382. src->symbolicId = 13;
  1383. src->localizedText = 14;
  1384. const UA_DataType *type = &UA_TYPES[UA_TYPES_DIAGNOSTICINFO];
  1385. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1386. UA_ByteString buf;
  1387. UA_ByteString_allocBuffer(&buf, size+1);
  1388. UA_Byte *bufPos = &buf.data[0];
  1389. const UA_Byte *bufEnd = &buf.data[size+1];
  1390. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1391. *bufPos = 0;
  1392. // then
  1393. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1394. char* result = "{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896,\"InnerDiagnosticInfo\":{\"AdditionalInfo\":\"INNER ADDITION INFO\",\"InnerDiagnosticInfo\":{\"AdditionalInfo\":\"INNER ADDITION INFO2\"}}}";
  1395. ck_assert_str_eq(result, (char*)buf.data);
  1396. UA_ByteString_deleteMembers(&buf);
  1397. UA_DiagnosticInfo_delete(src);
  1398. }
  1399. END_TEST
  1400. START_TEST(UA_DiagInfo_noFields_json_encode) {
  1401. UA_DiagnosticInfo *src = UA_DiagnosticInfo_new();
  1402. UA_DiagnosticInfo_init(src);
  1403. const UA_DataType *type = &UA_TYPES[UA_TYPES_DIAGNOSTICINFO];
  1404. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1405. UA_ByteString buf;
  1406. UA_ByteString_allocBuffer(&buf, size+1);
  1407. UA_Byte *bufPos = &buf.data[0];
  1408. const UA_Byte *bufEnd = &buf.data[size+1];
  1409. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1410. *bufPos = 0;
  1411. // then
  1412. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1413. char* result = "null";
  1414. ck_assert_str_eq(result, (char*)buf.data);
  1415. UA_ByteString_deleteMembers(&buf);
  1416. UA_DiagnosticInfo_delete(src);
  1417. }
  1418. END_TEST
  1419. START_TEST(UA_DiagInfo_smallBuffer_json_encode) {
  1420. UA_DiagnosticInfo *src = UA_DiagnosticInfo_new();
  1421. UA_DiagnosticInfo_init(src);
  1422. src->hasAdditionalInfo = UA_TRUE;
  1423. src->hasInnerDiagnosticInfo = UA_FALSE;
  1424. src->hasInnerStatusCode = UA_TRUE;
  1425. src->hasLocale = UA_TRUE;
  1426. src->hasSymbolicId = UA_TRUE;
  1427. src->hasLocalizedText = UA_TRUE;
  1428. src->hasNamespaceUri = UA_FALSE;
  1429. UA_StatusCode statusCode = UA_STATUSCODE_BADARGUMENTSMISSING;
  1430. src->additionalInfo = UA_STRING_ALLOC("additionalInfo");
  1431. src->innerStatusCode = statusCode;
  1432. src->locale = 12;
  1433. src->symbolicId = 13;
  1434. src->localizedText = 14;
  1435. const UA_DataType *type = &UA_TYPES[UA_TYPES_DIAGNOSTICINFO];
  1436. UA_ByteString buf;
  1437. UA_ByteString_allocBuffer(&buf, 2);
  1438. UA_Byte *bufPos = &buf.data[0];
  1439. const UA_Byte *bufEnd = &buf.data[2];
  1440. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1441. *bufPos = 0;
  1442. // then
  1443. ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  1444. UA_ByteString_deleteMembers(&buf);
  1445. UA_DiagnosticInfo_delete(src);
  1446. }
  1447. END_TEST
  1448. /* ---------------ByteString----------------- */
  1449. START_TEST(UA_ByteString_json_encode) {
  1450. UA_ByteString *src = UA_ByteString_new();
  1451. UA_ByteString_init(src);
  1452. *src = UA_BYTESTRING_ALLOC("asdfasdf");
  1453. const UA_DataType *type = &UA_TYPES[UA_TYPES_BYTESTRING];
  1454. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1455. UA_ByteString buf;
  1456. UA_ByteString_allocBuffer(&buf, size+1);
  1457. UA_Byte *bufPos = &buf.data[0];
  1458. const UA_Byte *bufEnd = &buf.data[size+1];
  1459. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1460. *bufPos = 0;
  1461. // then
  1462. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1463. char* result = "\"YXNkZmFzZGY=\"";
  1464. ck_assert_str_eq(result, (char*)buf.data);
  1465. UA_ByteString_deleteMembers(&buf);
  1466. UA_ByteString_delete(src);
  1467. }
  1468. END_TEST
  1469. START_TEST(UA_ByteString2_json_encode) {
  1470. UA_ByteString *src = UA_ByteString_new();
  1471. UA_ByteString_init(src);
  1472. *src = UA_BYTESTRING_ALLOC("Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
  1473. const UA_DataType *type = &UA_TYPES[UA_TYPES_BYTESTRING];
  1474. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1475. UA_ByteString buf;
  1476. UA_ByteString_allocBuffer(&buf, size+1);
  1477. UA_Byte *bufPos = &buf.data[0];
  1478. const UA_Byte *bufEnd = &buf.data[size+1];
  1479. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1480. //s = UA_decodeJson()
  1481. *bufPos = 0;
  1482. // then
  1483. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1484. char* result = "\"TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4=\"";
  1485. ck_assert_str_eq(result, (char*)buf.data);
  1486. UA_ByteString_deleteMembers(&buf);
  1487. UA_ByteString_delete(src);
  1488. }
  1489. END_TEST
  1490. START_TEST(UA_ByteString3_json_encode) {
  1491. UA_Variant *src = UA_Variant_new();
  1492. UA_Variant_init(src);
  1493. UA_ByteString *variantContent = UA_ByteString_new();
  1494. *variantContent = UA_BYTESTRING_ALLOC("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.");
  1495. UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_BYTESTRING]);
  1496. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1497. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1498. UA_ByteString buf;
  1499. UA_ByteString_allocBuffer(&buf, size+1);
  1500. UA_Byte *bufPos = &buf.data[0];
  1501. const UA_Byte *bufEnd = &buf.data[size+1];
  1502. status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1503. *bufPos = 0;
  1504. //printf("%s\n\n", (char*)buf.data);
  1505. UA_Variant out;
  1506. UA_Variant_init(&out);
  1507. retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  1508. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  1509. UA_ByteString *srcData = ((UA_ByteString*)src->data);
  1510. UA_ByteString *outData = ((UA_ByteString*)out.data);
  1511. ck_assert(UA_ByteString_equal(srcData, outData));
  1512. UA_ByteString_deleteMembers(&buf);
  1513. UA_Variant_deleteMembers(&out);
  1514. UA_Variant_delete(src);
  1515. }
  1516. END_TEST
  1517. /* ------------------QualifiedName---------------------------- */
  1518. START_TEST(UA_QualName_json_encode) {
  1519. UA_QualifiedName *src = UA_QualifiedName_new();
  1520. UA_QualifiedName_init(src);
  1521. src->name = UA_STRING_ALLOC("derName");
  1522. src->namespaceIndex = 1;
  1523. const UA_DataType *type = &UA_TYPES[UA_TYPES_QUALIFIEDNAME];
  1524. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1525. UA_ByteString buf;
  1526. UA_ByteString_allocBuffer(&buf, size+1);
  1527. UA_Byte *bufPos = &buf.data[0];
  1528. const UA_Byte *bufEnd = &buf.data[size+1];
  1529. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1530. *bufPos = 0;
  1531. // then
  1532. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1533. char* result = "{\"Name\":\"derName\",\"Uri\":1}";
  1534. ck_assert_str_eq(result, (char*)buf.data);
  1535. UA_ByteString_deleteMembers(&buf);
  1536. UA_QualifiedName_delete(src);
  1537. }
  1538. END_TEST
  1539. START_TEST(UA_QualName_NonReversible_json_encode) {
  1540. UA_QualifiedName *src = UA_QualifiedName_new();
  1541. UA_QualifiedName_init(src);
  1542. src->name = UA_STRING_ALLOC("derName");
  1543. src->namespaceIndex = 1;
  1544. const UA_DataType *type = &UA_TYPES[UA_TYPES_QUALIFIEDNAME];
  1545. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE);
  1546. UA_ByteString buf;
  1547. UA_ByteString_allocBuffer(&buf, size+1);
  1548. UA_Byte *bufPos = &buf.data[0];
  1549. const UA_Byte *bufEnd = &buf.data[size+1];
  1550. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
  1551. *bufPos = 0;
  1552. // then
  1553. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1554. char* result = "{\"Name\":\"derName\",\"Uri\":1}";
  1555. ck_assert_str_eq(result, (char*)buf.data);
  1556. UA_ByteString_deleteMembers(&buf);
  1557. UA_QualifiedName_delete(src);
  1558. }
  1559. END_TEST
  1560. START_TEST(UA_QualName_NonReversible_Namespace_json_encode) {
  1561. UA_QualifiedName *src = UA_QualifiedName_new();
  1562. UA_QualifiedName_init(src);
  1563. src->name = UA_STRING_ALLOC("derName");
  1564. src->namespaceIndex = 2;
  1565. const UA_DataType *type = &UA_TYPES[UA_TYPES_QUALIFIEDNAME];
  1566. UA_String namespaces[3] = {UA_STRING("ns0"),UA_STRING("ns1"),UA_STRING("ns2")};
  1567. size_t size = UA_calcSizeJson((void *) src, type, namespaces, 3, NULL, 0, UA_FALSE);
  1568. UA_ByteString buf;
  1569. UA_ByteString_allocBuffer(&buf, size+1);
  1570. UA_Byte *bufPos = &buf.data[0];
  1571. const UA_Byte *bufEnd = &buf.data[size+1];
  1572. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, namespaces, 3, NULL, 0, UA_FALSE);
  1573. *bufPos = 0;
  1574. // then
  1575. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1576. char* result = "{\"Name\":\"derName\",\"Uri\":\"ns2\"}";
  1577. ck_assert_str_eq(result, (char*)buf.data);
  1578. UA_ByteString_deleteMembers(&buf);
  1579. UA_QualifiedName_delete(src);
  1580. }
  1581. END_TEST
  1582. START_TEST(UA_QualName_NonReversible_NoNamespaceAsNumber_json_encode) {
  1583. UA_QualifiedName *src = UA_QualifiedName_new();
  1584. UA_QualifiedName_init(src);
  1585. src->name = UA_STRING_ALLOC("derName");
  1586. src->namespaceIndex = 6789;
  1587. const UA_DataType *type = &UA_TYPES[UA_TYPES_QUALIFIEDNAME];
  1588. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE);
  1589. UA_ByteString buf;
  1590. UA_ByteString_allocBuffer(&buf, size+1);
  1591. UA_Byte *bufPos = &buf.data[0];
  1592. const UA_Byte *bufEnd = &buf.data[size+1];
  1593. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
  1594. *bufPos = 0;
  1595. // then
  1596. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1597. char* result = "{\"Name\":\"derName\",\"Uri\":6789}";
  1598. ck_assert_str_eq(result, (char*)buf.data);
  1599. UA_ByteString_deleteMembers(&buf);
  1600. UA_QualifiedName_delete(src);
  1601. }
  1602. END_TEST
  1603. /* ----------------------------Variant------------------------ */
  1604. /* -----Builtin scalar----- */
  1605. START_TEST(UA_Variant_Bool_json_encode) {
  1606. UA_Variant *src = UA_Variant_new();
  1607. UA_Variant_init(src);
  1608. UA_Boolean *variantContent = UA_Boolean_new();
  1609. *variantContent = true;
  1610. UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_BOOLEAN]);
  1611. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1612. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1613. UA_ByteString buf;
  1614. UA_ByteString_allocBuffer(&buf, size+1);
  1615. UA_Byte *bufPos = &buf.data[0];
  1616. const UA_Byte *bufEnd = &buf.data[size+1];
  1617. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1618. *bufPos = 0;
  1619. // then
  1620. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1621. char* result = "{\"Type\":1,\"Body\":true}";
  1622. ck_assert_str_eq(result, (char*)buf.data);
  1623. UA_ByteString_deleteMembers(&buf);
  1624. UA_Variant_delete(src);
  1625. }
  1626. END_TEST
  1627. START_TEST(UA_Variant_Number_json_encode) {
  1628. UA_Variant *src = UA_Variant_new();
  1629. UA_Variant_init(src);
  1630. UA_UInt64 *variantContent = UA_UInt64_new();
  1631. *variantContent = 345634563456;
  1632. UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_UINT64]);
  1633. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1634. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1635. UA_ByteString buf;
  1636. UA_ByteString_allocBuffer(&buf, size+1);
  1637. UA_Byte *bufPos = &buf.data[0];
  1638. const UA_Byte *bufEnd = &buf.data[size+1];
  1639. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1640. *bufPos = 0;
  1641. // then
  1642. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1643. char* result = "{\"Type\":9,\"Body\":\"345634563456\"}";
  1644. ck_assert_str_eq(result, (char*)buf.data);
  1645. UA_ByteString_deleteMembers(&buf);
  1646. UA_Variant_delete(src);
  1647. }
  1648. END_TEST
  1649. START_TEST(UA_Variant_Double_json_encode) {
  1650. /* Encode decode cyle of 100 Doubles */
  1651. UA_Double d = 0.0;
  1652. for(size_t i = 0; i < 100; i++){
  1653. d = nextafter(d,1);
  1654. UA_Variant *src = UA_Variant_new();
  1655. UA_Variant_init(src);
  1656. UA_Double *variantContent = UA_Double_new();
  1657. //*variantContent = 1.0000000000000002;
  1658. *variantContent = d;
  1659. UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_DOUBLE]);
  1660. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1661. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1662. UA_ByteString buf;
  1663. UA_ByteString_allocBuffer(&buf, size+1);
  1664. UA_Byte *bufPos = &buf.data[0];
  1665. const UA_Byte *bufEnd = &buf.data[size+1];
  1666. status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1667. *bufPos = 0;
  1668. //printf("%s\n\n", (char*)buf.data);
  1669. UA_Variant out;
  1670. UA_Variant_init(&out);
  1671. retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  1672. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  1673. UA_Double srcData = *((UA_Double*)src->data);
  1674. UA_Double outData = *((UA_Double*)out.data);
  1675. ck_assert(memcmp(&srcData, &outData, sizeof(UA_Double)) == 0);
  1676. UA_ByteString_deleteMembers(&buf);
  1677. UA_Variant_deleteMembers(&out);
  1678. UA_Variant_delete(src);
  1679. }
  1680. }
  1681. END_TEST
  1682. START_TEST(UA_Variant_Double2_json_encode) {
  1683. UA_Variant *src = UA_Variant_new();
  1684. UA_Variant_init(src);
  1685. UA_Double *variantContent = UA_Double_new();
  1686. *variantContent = (pow(2,53)-1)*pow(2,-1074);
  1687. UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_DOUBLE]);
  1688. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1689. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1690. UA_ByteString buf;
  1691. UA_ByteString_allocBuffer(&buf, size+1);
  1692. UA_Byte *bufPos = &buf.data[0];
  1693. const UA_Byte *bufEnd = &buf.data[size+1];
  1694. status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1695. *bufPos = 0;
  1696. //printf("%s\n\n", (char*)buf.data);
  1697. /*{"Type":11,"Body":4.4501477170144022721148195934182639518696390927032912960468522194496444440421538910330590478162701758282983178260792422137401728773891892910553144148156412434867599762821265346585071045737627442980259622449029037796981144446145705102663115100318287949527959668236039986479250965780342141637013812613333119898765515451440315261253813266652951306000184917766328660755595837392240989947807556594098101021612198814605258742579179000071675999344145086087205681577915435923018910334964869420614052182892431445797605163650903606514140377217442262561590244668525767372446430075513332450079650686719491377688478005309963967709758965844137894433796621993967316936280457084866613206797017728916080020698679408551343728867675409720757232455434770912461317493580281734466552734375e-308}*/
  1698. UA_Variant out;
  1699. UA_Variant_init(&out);
  1700. retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  1701. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  1702. UA_Double srcData = *((UA_Double*)src->data);
  1703. UA_Double outData = *((UA_Double*)out.data);
  1704. ck_assert(memcmp(&srcData, &outData, sizeof(UA_Double)) == 0);
  1705. UA_ByteString_deleteMembers(&buf);
  1706. UA_Variant_deleteMembers(&out);
  1707. UA_Variant_delete(src);
  1708. }
  1709. END_TEST
  1710. START_TEST(UA_Variant_Double3_json_encode) {
  1711. UA_Variant *src = UA_Variant_new();
  1712. UA_Variant_init(src);
  1713. UA_Double *variantContent = UA_Double_new();
  1714. *variantContent = 1.1234;
  1715. UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_DOUBLE]);
  1716. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1717. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1718. UA_ByteString buf;
  1719. UA_ByteString_allocBuffer(&buf, size+1);
  1720. UA_Byte *bufPos = &buf.data[0];
  1721. const UA_Byte *bufEnd = &buf.data[size+1];
  1722. status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1723. *bufPos = 0;
  1724. UA_Variant out;
  1725. UA_Variant_init(&out);
  1726. retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  1727. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  1728. UA_Double srcData = *((UA_Double*)src->data);
  1729. UA_Double outData = *((UA_Double*)out.data);
  1730. ck_assert(memcmp(&srcData, &outData, sizeof(UA_Double)) == 0);
  1731. UA_ByteString_deleteMembers(&buf);
  1732. UA_Variant_deleteMembers(&out);
  1733. UA_Variant_delete(src);
  1734. }
  1735. END_TEST
  1736. START_TEST(UA_Variant_DoubleInf_json_encode) {
  1737. UA_Variant *src = UA_Variant_new();
  1738. UA_Variant_init(src);
  1739. UA_Double *variantContent = UA_Double_new();
  1740. *variantContent = (UA_Double)INFINITY;
  1741. UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_DOUBLE]);
  1742. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1743. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1744. UA_ByteString buf;
  1745. UA_ByteString_allocBuffer(&buf, size+1);
  1746. UA_Byte *bufPos = &buf.data[0];
  1747. const UA_Byte *bufEnd = &buf.data[size+1];
  1748. status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1749. *bufPos = 0;
  1750. //printf("%s\n\n", (char*)buf.data);
  1751. UA_Variant out;
  1752. UA_Variant_init(&out);
  1753. retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  1754. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  1755. UA_Double srcData = *((UA_Double*)src->data);
  1756. UA_Double outData = *((UA_Double*)out.data);
  1757. ck_assert(memcmp(&srcData, &outData, sizeof(UA_Double)) == 0);
  1758. UA_ByteString_deleteMembers(&buf);
  1759. UA_Variant_deleteMembers(&out);
  1760. UA_Variant_delete(src);
  1761. }
  1762. END_TEST
  1763. START_TEST(UA_Variant_DoubleNan_json_encode) {
  1764. UA_Variant *src = UA_Variant_new();
  1765. UA_Variant_init(src);
  1766. UA_Double *variantContent = UA_Double_new();
  1767. *variantContent = (UA_Double)NAN;
  1768. UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_DOUBLE]);
  1769. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1770. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1771. UA_ByteString buf;
  1772. UA_ByteString_allocBuffer(&buf, size+1);
  1773. UA_Byte *bufPos = &buf.data[0];
  1774. const UA_Byte *bufEnd = &buf.data[size+1];
  1775. status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1776. *bufPos = 0;
  1777. //printf("%s\n\n", (char*)buf.data);
  1778. UA_Variant out;
  1779. UA_Variant_init(&out);
  1780. retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  1781. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  1782. UA_Double srcData = *((UA_Double*)src->data);
  1783. UA_Double outData = *((UA_Double*)out.data);
  1784. ck_assert(memcmp(&srcData, &outData, sizeof(UA_Double)) == 0);
  1785. UA_ByteString_deleteMembers(&buf);
  1786. UA_Variant_deleteMembers(&out);
  1787. UA_Variant_delete(src);
  1788. }
  1789. END_TEST
  1790. START_TEST(UA_Variant_Float_json_encode) {
  1791. UA_Variant *src = UA_Variant_new();
  1792. UA_Variant_init(src);
  1793. UA_Float *variantContent = UA_Float_new();
  1794. *variantContent = (UA_Float)((pow(2,23)-1)/pow(2,149));
  1795. UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_FLOAT]);
  1796. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1797. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1798. UA_ByteString buf;
  1799. UA_ByteString_allocBuffer(&buf, size+1);
  1800. UA_Byte *bufPos = &buf.data[0];
  1801. const UA_Byte *bufEnd = &buf.data[size+1];
  1802. status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1803. *bufPos = 0;
  1804. UA_Variant out;
  1805. UA_Variant_init(&out);
  1806. retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  1807. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  1808. UA_Float srcData = *((UA_Float*)src->data);
  1809. UA_Float outData = *((UA_Float*)out.data);
  1810. ck_assert(memcmp(&srcData, &outData, sizeof(UA_Float)) == 0);
  1811. UA_ByteString_deleteMembers(&buf);
  1812. UA_Variant_deleteMembers(&out);
  1813. UA_Variant_delete(src);
  1814. }
  1815. END_TEST
  1816. START_TEST(UA_Variant_NodeId_json_encode) {
  1817. UA_Variant *src = UA_Variant_new();
  1818. UA_Variant_init(src);
  1819. UA_NodeId variantContent = UA_NODEID_STRING(1, "theID");
  1820. UA_Variant_setScalarCopy(src, &variantContent, &UA_TYPES[UA_TYPES_NODEID]);
  1821. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1822. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1823. UA_ByteString buf;
  1824. UA_ByteString_allocBuffer(&buf, size+1);
  1825. UA_Byte *bufPos = &buf.data[0];
  1826. const UA_Byte *bufEnd = &buf.data[size+1];
  1827. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1828. *bufPos = 0;
  1829. // then
  1830. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1831. char* result = "{\"Type\":17,\"Body\":{\"IdType\":1,\"Id\":\"theID\",\"Namespace\":1}}";
  1832. ck_assert_str_eq(result, (char*)buf.data);
  1833. UA_ByteString_deleteMembers(&buf);
  1834. UA_Variant_delete(src);
  1835. }
  1836. END_TEST
  1837. START_TEST(UA_Variant_LocText_json_encode) {
  1838. UA_Variant *src = UA_Variant_new();
  1839. UA_Variant_init(src);
  1840. UA_LocalizedText variantContent;
  1841. variantContent.locale = UA_STRING("localeString");
  1842. variantContent.text = UA_STRING("textString");
  1843. UA_Variant_setScalarCopy(src, &variantContent, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
  1844. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1845. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1846. UA_ByteString buf;
  1847. UA_ByteString_allocBuffer(&buf, size+1);
  1848. UA_Byte *bufPos = &buf.data[0];
  1849. const UA_Byte *bufEnd = &buf.data[size+1];
  1850. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1851. *bufPos = 0;
  1852. // then
  1853. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1854. char* result = "{\"Type\":21,\"Body\":{\"Locale\":\"localeString\",\"Text\":\"textString\"}}";
  1855. ck_assert_str_eq(result, (char*)buf.data);
  1856. UA_ByteString_deleteMembers(&buf);
  1857. UA_Variant_delete(src);
  1858. }
  1859. END_TEST
  1860. START_TEST(UA_Variant_QualName_json_encode) {
  1861. UA_Variant *src = UA_Variant_new();
  1862. UA_Variant_init(src);
  1863. UA_QualifiedName variantContent;
  1864. UA_QualifiedName_init(&variantContent);
  1865. variantContent.name = UA_STRING("derName");
  1866. variantContent.namespaceIndex = 1;
  1867. UA_Variant_setScalarCopy(src, &variantContent, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]);
  1868. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1869. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1870. UA_ByteString buf;
  1871. UA_ByteString_allocBuffer(&buf, size+1);
  1872. UA_Byte *bufPos = &buf.data[0];
  1873. const UA_Byte *bufEnd = &buf.data[size+1];
  1874. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1875. *bufPos = 0;
  1876. // then
  1877. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1878. char* result = "{\"Type\":20,\"Body\":{\"Name\":\"derName\",\"Uri\":1}}";
  1879. ck_assert_str_eq(result, (char*)buf.data);
  1880. UA_ByteString_deleteMembers(&buf);
  1881. UA_Variant_delete(src);
  1882. }
  1883. END_TEST
  1884. /* ---Reversible Variant Array---- */
  1885. START_TEST(UA_Variant_Array_UInt16_json_encode) {
  1886. UA_Variant *src = UA_Variant_new();
  1887. UA_Variant_init(src);
  1888. UA_UInt16 zero[2] = {42,43};
  1889. UA_Variant_setArrayCopy(src, zero, 2, &UA_TYPES[UA_TYPES_UINT16]);
  1890. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1891. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1892. UA_ByteString buf;
  1893. UA_ByteString_allocBuffer(&buf, size+1);
  1894. UA_Byte *bufPos = &buf.data[0];
  1895. const UA_Byte *bufEnd = &buf.data[size+1];
  1896. ck_assert_int_eq(size, 25);
  1897. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1898. *bufPos = 0;
  1899. // then
  1900. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1901. char* result = "{\"Type\":5,\"Body\":[42,43]}";
  1902. ck_assert_str_eq(result, (char*)buf.data);
  1903. UA_ByteString_deleteMembers(&buf);
  1904. UA_Variant_delete(src);
  1905. }
  1906. END_TEST
  1907. START_TEST(UA_Variant_Array_Byte_json_encode) {
  1908. UA_Variant *src = UA_Variant_new();
  1909. UA_Variant_init(src);
  1910. UA_Byte zero[2] = {42,43};
  1911. UA_Variant_setArrayCopy(src, zero, 2, &UA_TYPES[UA_TYPES_BYTE]);
  1912. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1913. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1914. UA_ByteString buf;
  1915. UA_ByteString_allocBuffer(&buf, size+1);
  1916. UA_Byte *bufPos = &buf.data[0];
  1917. const UA_Byte *bufEnd = &buf.data[size+1];
  1918. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1919. *bufPos = 0;
  1920. // then
  1921. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1922. char* result = "{\"Type\":3,\"Body\":[42,43]}";
  1923. ck_assert_str_eq(result, (char*)buf.data);
  1924. UA_ByteString_deleteMembers(&buf);
  1925. UA_Variant_delete(src);
  1926. }
  1927. END_TEST
  1928. START_TEST(UA_Variant_Array_String_json_encode) {
  1929. UA_Variant *src = UA_Variant_new();
  1930. UA_Variant_init(src);
  1931. UA_String zero[2] = {UA_STRING("eins"),UA_STRING("zwei")};
  1932. UA_Variant_setArrayCopy(src, zero, 2, &UA_TYPES[UA_TYPES_STRING]);
  1933. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1934. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1935. UA_ByteString buf;
  1936. UA_ByteString_allocBuffer(&buf, size+1);
  1937. UA_Byte *bufPos = &buf.data[0];
  1938. const UA_Byte *bufEnd = &buf.data[size+1];
  1939. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1940. *bufPos = 0;
  1941. // then
  1942. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1943. char* result = "{\"Type\":12,\"Body\":[\"eins\",\"zwei\"]}";
  1944. ck_assert_str_eq(result, (char*)buf.data);
  1945. UA_ByteString_deleteMembers(&buf);
  1946. UA_Variant_delete(src);
  1947. }
  1948. END_TEST
  1949. START_TEST(UA_Variant_Matrix_UInt16_json_encode) {
  1950. // Set an array value
  1951. UA_Variant src;
  1952. UA_Variant_init(&src);
  1953. UA_UInt16 d[9] = {1, 2, 3,
  1954. 4, 5, 6,
  1955. 7, 8, 9};
  1956. UA_Variant_setArrayCopy(&src, d, 9, &UA_TYPES[UA_TYPES_UINT16]);
  1957. //Set array dimensions
  1958. src.arrayDimensions = (UA_UInt32 *)UA_Array_new(2, &UA_TYPES[UA_TYPES_UINT32]);
  1959. src.arrayDimensionsSize = 2;
  1960. src.arrayDimensions[0] = 3;
  1961. src.arrayDimensions[1] = 3;
  1962. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1963. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  1964. UA_ByteString buf;
  1965. UA_ByteString_allocBuffer(&buf, size+1);
  1966. UA_Byte *bufPos = &buf.data[0];
  1967. const UA_Byte *bufEnd = &buf.data[size+1];
  1968. //{"Type":5,"Body":[1,2,3,4,5,6,7,8,9],"Dimension":[3,3]}
  1969. size_t sizeOfBytes = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  1970. ck_assert_int_eq(sizeOfBytes, 55);
  1971. status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1972. *bufPos = 0;
  1973. // then
  1974. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1975. char* result = "{\"Type\":5,\"Body\":[1,2,3,4,5,6,7,8,9],\"Dimension\":[3,3]}";
  1976. ck_assert_str_eq(result, (char*)buf.data);
  1977. UA_ByteString_deleteMembers(&buf);
  1978. UA_Variant_deleteMembers(&src);
  1979. }
  1980. END_TEST
  1981. /* NON-Reversible builtin simple */
  1982. START_TEST(UA_Variant_StatusCode_NonReversible_json_encode) {
  1983. UA_Variant *src = UA_Variant_new();
  1984. UA_Variant_init(src);
  1985. UA_StatusCode variantContent = UA_STATUSCODE_BADAGGREGATECONFIGURATIONREJECTED;
  1986. UA_Variant_setScalarCopy(src, &variantContent, &UA_TYPES[UA_TYPES_STATUSCODE]);
  1987. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1988. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE);
  1989. UA_ByteString buf;
  1990. UA_ByteString_allocBuffer(&buf, size+1);
  1991. UA_Byte *bufPos = &buf.data[0];
  1992. const UA_Byte *bufEnd = &buf.data[size+1];
  1993. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
  1994. *bufPos = 0;
  1995. // then
  1996. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1997. char* result = "{\"Body\":{\"Code\":2161770496,\"Symbol\":\"BadAggregateConfigurationRejected\"}}";
  1998. ck_assert_str_eq(result, (char*)buf.data);
  1999. UA_ByteString_deleteMembers(&buf);
  2000. UA_Variant_delete(src);
  2001. }
  2002. END_TEST
  2003. /* NON-Reversible Array */
  2004. START_TEST(UA_Variant_Array_String_NonReversible_json_encode) {
  2005. UA_Variant src;
  2006. UA_Variant_init(&src);
  2007. UA_String d[8] = {UA_STRING("1"), UA_STRING("2"), UA_STRING("3"),
  2008. UA_STRING("4"), UA_STRING("5"), UA_STRING("6"),
  2009. UA_STRING("7"), UA_STRING("8")};
  2010. UA_Variant_setArrayCopy(&src, d, 8, &UA_TYPES[UA_TYPES_STRING]);
  2011. src.arrayDimensions = (UA_UInt32 *)UA_Array_new(4, &UA_TYPES[UA_TYPES_UINT32]);
  2012. src.arrayDimensionsSize = 1;
  2013. src.arrayDimensions[0] = 8;
  2014. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  2015. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_FALSE);
  2016. UA_ByteString buf;
  2017. UA_ByteString_allocBuffer(&buf, size+1);
  2018. UA_Byte *bufPos = &buf.data[0];
  2019. const UA_Byte *bufEnd = &buf.data[size+1];
  2020. status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
  2021. *bufPos = 0;
  2022. // then
  2023. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2024. char* result = "{\"Body\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\"]}";
  2025. ck_assert_str_eq(result, (char*)buf.data);
  2026. UA_ByteString_deleteMembers(&buf);
  2027. UA_Variant_deleteMembers(&src);
  2028. }
  2029. END_TEST
  2030. /* NON-Reversible Matrix */
  2031. START_TEST(UA_Variant_Matrix_String_NonReversible_json_encode) {
  2032. UA_Variant src;
  2033. UA_Variant_init(&src);
  2034. UA_String d[8] = {UA_STRING("1"), UA_STRING("2"), UA_STRING("3"),
  2035. UA_STRING("4"), UA_STRING("5"), UA_STRING("6"),
  2036. UA_STRING("7"), UA_STRING("8")};
  2037. UA_Variant_setArrayCopy(&src, d, 8, &UA_TYPES[UA_TYPES_STRING]);
  2038. src.arrayDimensions = (UA_UInt32 *)UA_Array_new(4, &UA_TYPES[UA_TYPES_UINT32]);
  2039. src.arrayDimensionsSize = 4;
  2040. src.arrayDimensions[0] = 2;
  2041. src.arrayDimensions[1] = 2;
  2042. src.arrayDimensions[2] = 2;
  2043. src.arrayDimensions[3] = 1;
  2044. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  2045. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_FALSE);
  2046. UA_ByteString buf;
  2047. UA_ByteString_allocBuffer(&buf, size+1);
  2048. UA_Byte *bufPos = &buf.data[0];
  2049. const UA_Byte *bufEnd = &buf.data[size+1];
  2050. //{"Body":[[[["1"],["2"]],[["3"],["4"]]],[[["5"],["6"]],[["7"],["8"]]]]}
  2051. size_t sizeOfBytes = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_FALSE);
  2052. ck_assert_int_eq(sizeOfBytes, 70);
  2053. status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
  2054. *bufPos = 0;
  2055. // then
  2056. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2057. char* result = "{\"Body\":[[[[\"1\"],[\"2\"]],[[\"3\"],[\"4\"]]],[[[\"5\"],[\"6\"]],[[\"7\"],[\"8\"]]]]}";
  2058. ck_assert_str_eq(result, (char*)buf.data);
  2059. UA_ByteString_deleteMembers(&buf);
  2060. UA_Variant_deleteMembers(&src);
  2061. }
  2062. END_TEST
  2063. START_TEST(UA_Variant_Matrix_NodeId_NonReversible_json_encode) {
  2064. UA_Variant src;
  2065. UA_Variant_init(&src);
  2066. UA_NodeId d[8] = {UA_NODEID_NUMERIC(1,1),UA_NODEID_NUMERIC(1,2),UA_NODEID_NUMERIC(1,3),UA_NODEID_NUMERIC(1,4),UA_NODEID_NUMERIC(1,5),UA_NODEID_NUMERIC(1,6),UA_NODEID_NUMERIC(1,7),UA_NODEID_NUMERIC(1,8)};
  2067. UA_Variant_setArrayCopy(&src, d, 8, &UA_TYPES[UA_TYPES_NODEID]);
  2068. src.arrayDimensions = (UA_UInt32 *)UA_Array_new(4, &UA_TYPES[UA_TYPES_UINT32]);
  2069. src.arrayDimensionsSize = 4;
  2070. src.arrayDimensions[0] = 2;
  2071. src.arrayDimensions[1] = 2;
  2072. src.arrayDimensions[2] = 2;
  2073. src.arrayDimensions[3] = 1;
  2074. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  2075. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_FALSE);
  2076. UA_ByteString buf;
  2077. UA_ByteString_allocBuffer(&buf, size+1);
  2078. UA_Byte *bufPos = &buf.data[0];
  2079. const UA_Byte *bufEnd = &buf.data[size+1];
  2080. status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
  2081. *bufPos = 0;
  2082. // then
  2083. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2084. char* result = "{\"Body\":[[[[{\"Id\":1,\"Namespace\":1}],[{\"Id\":2,\"Namespace\":1}]],[[{\"Id\":3,\"Namespace\":1}],[{\"Id\":4,\"Namespace\":1}]]],[[[{\"Id\":5,\"Namespace\":1}],[{\"Id\":6,\"Namespace\":1}]],[[{\"Id\":7,\"Namespace\":1}],[{\"Id\":8,\"Namespace\":1}]]]]}";
  2085. ck_assert_str_eq(result, (char*)buf.data);
  2086. UA_ByteString_deleteMembers(&buf);
  2087. UA_Variant_deleteMembers(&src);
  2088. }
  2089. END_TEST
  2090. START_TEST(UA_Variant_Wrap_json_encode) {
  2091. UA_Variant *src = UA_Variant_new();
  2092. UA_Variant_init(src);
  2093. UA_ViewDescription variantContent;
  2094. UA_DateTime srvts = UA_DateTime_fromUnixTime(1234567);
  2095. variantContent.timestamp = srvts;
  2096. variantContent.viewVersion = 1236;
  2097. variantContent.viewId = UA_NODEID_NUMERIC(0,99999);
  2098. UA_Variant_setScalarCopy(src, &variantContent, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]);
  2099. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  2100. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  2101. UA_ByteString buf;
  2102. UA_ByteString_allocBuffer(&buf, size+1);
  2103. UA_Byte *bufPos = &buf.data[0];
  2104. const UA_Byte *bufEnd = &buf.data[size+1];
  2105. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2106. *bufPos = 0;
  2107. // then
  2108. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2109. char* result = "{\"Type\":22,\"Body\":{\"TypeId\":{\"Id\":511},\"Body\":{\"ViewId\":{\"Id\":99999},\"Timestamp\":\"1970-01-15T06:56:07Z\",\"ViewVersion\":1236}}}";
  2110. ck_assert_str_eq(result, (char*)buf.data);
  2111. UA_ByteString_deleteMembers(&buf);
  2112. UA_Variant_delete(src);
  2113. }
  2114. END_TEST
  2115. START_TEST(UA_Variant_Wrap_Array_json_encode) {
  2116. UA_Variant src;
  2117. UA_Variant_init(&src);
  2118. //src.arrayDimensions = (UA_UInt32 *)UA_Array_new(1, &UA_TYPES[UA_TYPES_UINT32]);
  2119. //src.arrayDimensionsSize = 1;
  2120. //src.arrayDimensions[0] = 2;
  2121. UA_ViewDescription variantContent1;
  2122. UA_DateTime srvts1 = UA_DateTime_fromUnixTime(1234567);
  2123. variantContent1.timestamp = srvts1;
  2124. variantContent1.viewVersion = 1;
  2125. variantContent1.viewId = UA_NODEID_NUMERIC(0,1);
  2126. UA_ViewDescription variantContent2;
  2127. UA_DateTime srvts2 = UA_DateTime_fromUnixTime(1234567);
  2128. variantContent2.timestamp = srvts2;
  2129. variantContent2.viewVersion = 2;
  2130. variantContent2.viewId = UA_NODEID_NUMERIC(0,2);
  2131. UA_ViewDescription d[2] = {variantContent1, variantContent2};
  2132. UA_Variant_setArrayCopy(&src, d, 2, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]);
  2133. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  2134. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  2135. UA_ByteString buf;
  2136. UA_ByteString_allocBuffer(&buf, size+1);
  2137. UA_Byte *bufPos = &buf.data[0];
  2138. const UA_Byte *bufEnd = &buf.data[size+1];
  2139. status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2140. *bufPos = 0;
  2141. // then
  2142. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2143. char* result = "{\"Type\":22,\"Body\":[{\"TypeId\":{\"Id\":511},\"Body\":{\"ViewId\":{\"Id\":1},\"Timestamp\":\"1970-01-15T06:56:07Z\",\"ViewVersion\":1}},{\"TypeId\":{\"Id\":511},\"Body\":{\"ViewId\":{\"Id\":2},\"Timestamp\":\"1970-01-15T06:56:07Z\",\"ViewVersion\":2}}]}";
  2144. ck_assert_str_eq(result, (char*)buf.data);
  2145. UA_ByteString_deleteMembers(&buf);
  2146. UA_Variant_deleteMembers(&src);
  2147. }
  2148. END_TEST
  2149. START_TEST(UA_Variant_Wrap_Array_NonReversible_json_encode) {
  2150. UA_Variant src;
  2151. UA_Variant_init(&src);
  2152. //src.arrayDimensions = (UA_UInt32 *)UA_Array_new(1, &UA_TYPES[UA_TYPES_UINT32]);
  2153. //src.arrayDimensionsSize = 1;
  2154. //src.arrayDimensions[0] = 2;
  2155. UA_ViewDescription variantContent1;
  2156. UA_DateTime srvts1 = UA_DateTime_fromUnixTime(1234567);
  2157. variantContent1.timestamp = srvts1;
  2158. variantContent1.viewVersion = 1;
  2159. variantContent1.viewId = UA_NODEID_NUMERIC(1,1);
  2160. UA_ViewDescription variantContent2;
  2161. UA_DateTime srvts2 = UA_DateTime_fromUnixTime(1234567);
  2162. variantContent2.timestamp = srvts2;
  2163. variantContent2.viewVersion = 2;
  2164. variantContent2.viewId = UA_NODEID_NUMERIC(1,2);
  2165. UA_ViewDescription d[2] = {variantContent1, variantContent2};
  2166. UA_Variant_setArrayCopy(&src, d, 2, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]);
  2167. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  2168. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_FALSE);
  2169. UA_ByteString buf;
  2170. UA_ByteString_allocBuffer(&buf, size+1);
  2171. UA_Byte *bufPos = &buf.data[0];
  2172. const UA_Byte *bufEnd = &buf.data[size+1];
  2173. status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
  2174. *bufPos = 0;
  2175. // then
  2176. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2177. char* result = "{\"Body\":[{\"Body\":{\"ViewId\":{\"Id\":1,\"Namespace\":1},\"Timestamp\":\"1970-01-15T06:56:07Z\",\"ViewVersion\":1}},{\"Body\":{\"ViewId\":{\"Id\":2,\"Namespace\":1},\"Timestamp\":\"1970-01-15T06:56:07Z\",\"ViewVersion\":2}}]}";
  2178. ck_assert_str_eq(result, (char*)buf.data);
  2179. UA_ByteString_deleteMembers(&buf);
  2180. UA_Variant_deleteMembers(&src);
  2181. }
  2182. END_TEST
  2183. /* -----------ExtensionObject------------------*/
  2184. START_TEST(UA_ExtensionObject_json_encode) {
  2185. UA_ExtensionObject *src = UA_ExtensionObject_new();
  2186. UA_ExtensionObject_init(src);
  2187. src->encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
  2188. src->content.decoded.type = &UA_TYPES[UA_TYPES_BOOLEAN];
  2189. UA_Boolean b = UA_FALSE;
  2190. src->content.decoded.data = &b;
  2191. const UA_DataType *type = &UA_TYPES[UA_TYPES_EXTENSIONOBJECT];
  2192. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  2193. UA_ByteString buf;
  2194. UA_ByteString_allocBuffer(&buf, size+1);
  2195. UA_Byte *bufPos = &buf.data[0];
  2196. const UA_Byte *bufEnd = &buf.data[size+1];
  2197. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2198. *bufPos = 0;
  2199. // then
  2200. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2201. char* result = "{\"TypeId\":{\"Id\":1},\"Body\":false}";
  2202. ck_assert_str_eq(result, (char*)buf.data);
  2203. UA_ByteString_deleteMembers(&buf);
  2204. UA_ExtensionObject_delete(src);
  2205. }
  2206. END_TEST
  2207. START_TEST(UA_ExtensionObject_xml_json_encode) {
  2208. UA_ExtensionObject *src = UA_ExtensionObject_new();
  2209. UA_ExtensionObject_init(src);
  2210. src->encoding = UA_EXTENSIONOBJECT_ENCODED_XML;
  2211. src->content.encoded.typeId = UA_NODEID_NUMERIC(2,1234);
  2212. UA_ByteString b = UA_BYTESTRING_ALLOC("<Elemement></Element>");
  2213. src->content.encoded.body = b;
  2214. const UA_DataType *type = &UA_TYPES[UA_TYPES_EXTENSIONOBJECT];
  2215. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  2216. UA_ByteString buf;
  2217. UA_ByteString_allocBuffer(&buf, size+1);
  2218. UA_Byte *bufPos = &buf.data[0];
  2219. const UA_Byte *bufEnd = &buf.data[size+1];
  2220. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2221. *bufPos = 0;
  2222. // then
  2223. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2224. char* result = "{\"TypeId\":{\"Id\":1234,\"Namespace\":2},\"Encoding\":2,\"Body\":\"<Elemement></Element>\"}";
  2225. ck_assert_str_eq(result, (char*)buf.data);
  2226. UA_ByteString_deleteMembers(&buf);
  2227. UA_ExtensionObject_delete(src);
  2228. }
  2229. END_TEST
  2230. START_TEST(UA_ExtensionObject_byteString_json_encode) {
  2231. UA_ExtensionObject *src = UA_ExtensionObject_new();
  2232. UA_ExtensionObject_init(src);
  2233. src->encoding = UA_EXTENSIONOBJECT_ENCODED_BYTESTRING;
  2234. src->content.encoded.typeId = UA_NODEID_NUMERIC(2,1234);
  2235. UA_ByteString b = UA_BYTESTRING_ALLOC("123456789012345678901234567890");
  2236. src->content.encoded.body = b;
  2237. const UA_DataType *type = &UA_TYPES[UA_TYPES_EXTENSIONOBJECT];
  2238. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  2239. UA_ByteString buf;
  2240. UA_ByteString_allocBuffer(&buf, size+1);
  2241. UA_Byte *bufPos = &buf.data[0];
  2242. const UA_Byte *bufEnd = &buf.data[size+1];
  2243. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2244. *bufPos = 0;
  2245. // then
  2246. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2247. char* result = "{\"TypeId\":{\"Id\":1234,\"Namespace\":2},\"Encoding\":1,\"Body\":\"123456789012345678901234567890\"}";
  2248. ck_assert_str_eq(result, (char*)buf.data);
  2249. UA_ByteString_deleteMembers(&buf);
  2250. UA_ExtensionObject_delete(src);
  2251. }
  2252. END_TEST
  2253. START_TEST(UA_ExtensionObject_NonReversible_StatusCode_json_encode) {
  2254. UA_ExtensionObject *src = UA_ExtensionObject_new();
  2255. UA_ExtensionObject_init(src);
  2256. src->encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
  2257. src->content.decoded.type = &UA_TYPES[UA_TYPES_STATUSCODE];
  2258. UA_StatusCode b = UA_STATUSCODE_BADENCODINGERROR;
  2259. src->content.decoded.data = &b;
  2260. const UA_DataType *type = &UA_TYPES[UA_TYPES_EXTENSIONOBJECT];
  2261. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE);
  2262. UA_ByteString buf;
  2263. UA_ByteString_allocBuffer(&buf, size+1);
  2264. UA_Byte *bufPos = &buf.data[0];
  2265. const UA_Byte *bufEnd = &buf.data[size+1];
  2266. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
  2267. *bufPos = 0;
  2268. // then
  2269. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2270. char* result = "{\"Body\":{\"Code\":2147876864,\"Symbol\":\"BadEncodingError\"}}";
  2271. ck_assert_str_eq(result, (char*)buf.data);
  2272. UA_ByteString_deleteMembers(&buf);
  2273. UA_ExtensionObject_delete(src);
  2274. }
  2275. END_TEST
  2276. /* --------------ExpandedNodeId-------------------------- */
  2277. START_TEST(UA_ExpandedNodeId_json_encode) {
  2278. UA_ExpandedNodeId *src = UA_ExpandedNodeId_new();
  2279. UA_ExpandedNodeId_init(src);
  2280. *src = UA_EXPANDEDNODEID_STRING_ALLOC(23, "testtestTest");
  2281. src->namespaceUri = UA_STRING_ALLOC("asdf");
  2282. src->serverIndex = 1345;
  2283. const UA_DataType *type = &UA_TYPES[UA_TYPES_EXPANDEDNODEID];
  2284. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  2285. UA_ByteString buf;
  2286. UA_ByteString_allocBuffer(&buf, size+1);
  2287. UA_Byte *bufPos = &buf.data[0];
  2288. const UA_Byte *bufEnd = &buf.data[size+1];
  2289. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2290. *bufPos = 0;
  2291. // then
  2292. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2293. char* result = "{\"IdType\":1,\"Id\":\"testtestTest\",\"Namespace\":\"asdf\",\"ServerUri\":1345}";
  2294. ck_assert_str_eq(result, (char*)buf.data);
  2295. UA_ByteString_deleteMembers(&buf);
  2296. UA_ExpandedNodeId_delete(src);
  2297. }
  2298. END_TEST
  2299. START_TEST(UA_ExpandedNodeId_MissingNamespaceUri_json_encode) {
  2300. UA_ExpandedNodeId *src = UA_ExpandedNodeId_new();
  2301. UA_ExpandedNodeId_init(src);
  2302. *src = UA_EXPANDEDNODEID_STRING_ALLOC(23, "testtestTest");
  2303. src->namespaceUri = UA_STRING_NULL;
  2304. src->serverIndex = 1345;
  2305. const UA_DataType *type = &UA_TYPES[UA_TYPES_EXPANDEDNODEID];
  2306. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  2307. UA_ByteString buf;
  2308. UA_ByteString_allocBuffer(&buf, size+1);
  2309. UA_Byte *bufPos = &buf.data[0];
  2310. const UA_Byte *bufEnd = &buf.data[size+1];
  2311. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2312. *bufPos = 0;
  2313. // then
  2314. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2315. char* result = "{\"IdType\":1,\"Id\":\"testtestTest\",\"Namespace\":23,\"ServerUri\":1345}";
  2316. ck_assert_str_eq(result, (char*)buf.data);
  2317. UA_ByteString_deleteMembers(&buf);
  2318. UA_ExpandedNodeId_delete(src);
  2319. }
  2320. END_TEST
  2321. START_TEST(UA_ExpandedNodeId_NonReversible_Ns1_json_encode) {
  2322. UA_ExpandedNodeId *src = UA_ExpandedNodeId_new();
  2323. UA_ExpandedNodeId_init(src);
  2324. *src = UA_EXPANDEDNODEID_STRING_ALLOC(1, "testtestTest");
  2325. src->namespaceUri = UA_STRING_NULL;
  2326. src->serverIndex = 1;
  2327. const UA_DataType *type = &UA_TYPES[UA_TYPES_EXPANDEDNODEID];
  2328. UA_String serverUris[3] = {UA_STRING("uri0"),UA_STRING("uri1"),UA_STRING("uri2")};
  2329. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, serverUris, 3, UA_FALSE);
  2330. UA_ByteString buf;
  2331. UA_ByteString_allocBuffer(&buf, size+1);
  2332. UA_Byte *bufPos = &buf.data[0];
  2333. const UA_Byte *bufEnd = &buf.data[size+1];
  2334. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, serverUris, 3, UA_FALSE);
  2335. *bufPos = 0;
  2336. // then
  2337. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2338. char* result = "{\"IdType\":1,\"Id\":\"testtestTest\",\"Namespace\":1,\"ServerUri\":\"uri1\"}";
  2339. ck_assert_str_eq(result, (char*)buf.data);
  2340. UA_ByteString_deleteMembers(&buf);
  2341. UA_ExpandedNodeId_delete(src);
  2342. }
  2343. END_TEST
  2344. START_TEST(UA_ExpandedNodeId_NonReversible_Namespace_json_encode) {
  2345. UA_ExpandedNodeId *src = UA_ExpandedNodeId_new();
  2346. UA_ExpandedNodeId_init(src);
  2347. *src = UA_EXPANDEDNODEID_STRING_ALLOC(2, "testtestTest");
  2348. src->namespaceUri = UA_STRING_NULL;
  2349. src->serverIndex = 1;
  2350. const UA_DataType *type = &UA_TYPES[UA_TYPES_EXPANDEDNODEID];
  2351. UA_String namespaces[3] = {UA_STRING("ns0"),UA_STRING("ns1"),UA_STRING("ns2")};
  2352. UA_String serverUris[3] = {UA_STRING("uri0"),UA_STRING("uri1"),UA_STRING("uri2")};
  2353. size_t size = UA_calcSizeJson((void *) src, type, namespaces, 3, serverUris, 3, UA_FALSE);
  2354. UA_ByteString buf;
  2355. UA_ByteString_allocBuffer(&buf, size+1);
  2356. UA_Byte *bufPos = &buf.data[0];
  2357. const UA_Byte *bufEnd = &buf.data[size+1];
  2358. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, namespaces, 3, serverUris, 3, UA_FALSE);
  2359. *bufPos = 0;
  2360. // then
  2361. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2362. char* result = "{\"IdType\":1,\"Id\":\"testtestTest\",\"Namespace\":\"ns2\",\"ServerUri\":\"uri1\"}";
  2363. ck_assert_str_eq(result, (char*)buf.data);
  2364. UA_ByteString_deleteMembers(&buf);
  2365. UA_ExpandedNodeId_delete(src);
  2366. }
  2367. END_TEST
  2368. START_TEST(UA_ExpandedNodeId_NonReversible_NamespaceUriGiven_json_encode) {
  2369. UA_ExpandedNodeId *src = UA_ExpandedNodeId_new();
  2370. UA_ExpandedNodeId_init(src);
  2371. *src = UA_EXPANDEDNODEID_STRING_ALLOC(2, "testtestTest");
  2372. src->namespaceUri = UA_STRING_ALLOC("NamespaceUri");
  2373. src->serverIndex = 1;
  2374. UA_String namespaces[3] = {UA_STRING("ns0"),UA_STRING("ns1"),UA_STRING("ns2")};
  2375. UA_String serverUris[3] = {UA_STRING("uri0"),UA_STRING("uri1"),UA_STRING("uri2")};
  2376. const UA_DataType *type = &UA_TYPES[UA_TYPES_EXPANDEDNODEID];
  2377. size_t size = UA_calcSizeJson((void *) src, type, namespaces, 3, serverUris, 3, UA_FALSE);
  2378. UA_ByteString buf;
  2379. UA_ByteString_allocBuffer(&buf, size+1);
  2380. UA_Byte *bufPos = &buf.data[0];
  2381. const UA_Byte *bufEnd = &buf.data[size+1];
  2382. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, namespaces, 3, serverUris, 3, UA_FALSE);
  2383. *bufPos = 0;
  2384. // then
  2385. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2386. char* result = "{\"IdType\":1,\"Id\":\"testtestTest\",\"Namespace\":\"NamespaceUri\",\"ServerUri\":\"uri1\"}";
  2387. ck_assert_str_eq(result, (char*)buf.data);
  2388. UA_ByteString_deleteMembers(&buf);
  2389. UA_ExpandedNodeId_delete(src);
  2390. }
  2391. END_TEST
  2392. /* -------------------------DataValue------------------------ */
  2393. START_TEST(UA_DataValue_json_encode) {
  2394. UA_DataValue *src = UA_DataValue_new();
  2395. UA_DataValue_init(src);
  2396. src->hasServerPicoseconds = UA_TRUE;
  2397. src->hasServerTimestamp = UA_TRUE;
  2398. src->hasSourcePicoseconds = UA_TRUE;
  2399. src->hasSourceTimestamp = UA_TRUE;
  2400. src->hasStatus = UA_TRUE;
  2401. src->hasValue = UA_TRUE;
  2402. UA_DateTime srcts = UA_DateTime_fromUnixTime(1234567) + 8901234;
  2403. UA_DateTime srvts = UA_DateTime_fromUnixTime(2345678) + 9012345;
  2404. src->sourceTimestamp = srcts;
  2405. src->serverTimestamp = srvts;
  2406. src->sourcePicoseconds = 5678;
  2407. src->serverPicoseconds = 6789;
  2408. UA_Variant variant;
  2409. UA_Variant_init(&variant);
  2410. UA_Boolean variantContent = true;
  2411. UA_Variant_setScalarCopy(&variant, &variantContent, &UA_TYPES[UA_TYPES_BOOLEAN]);
  2412. src->value = variant;
  2413. src->status = UA_STATUSCODE_BADAPPLICATIONSIGNATUREINVALID;
  2414. const UA_DataType *type = &UA_TYPES[UA_TYPES_DATAVALUE];
  2415. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  2416. UA_ByteString buf;
  2417. UA_ByteString_allocBuffer(&buf, size+1);
  2418. UA_Byte *bufPos = &buf.data[0];
  2419. const UA_Byte *bufEnd = &buf.data[size+1];
  2420. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2421. *bufPos = 0;
  2422. // then
  2423. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2424. char* result = "{\"Value\":{\"Type\":1,\"Body\":true},\"Status\":2153250816,\"SourceTimestamp\":\"1970-01-15T06:56:07.8901234Z\",\"SourcePicoseconds\":5678,\"ServerTimestamp\":\"1970-01-28T03:34:38.9012345Z\",\"ServerPicoseconds\":6789}";
  2425. ck_assert_str_eq(result, (char*)buf.data);
  2426. UA_ByteString_deleteMembers(&buf);
  2427. UA_DataValue_delete(src);
  2428. }
  2429. END_TEST
  2430. START_TEST(UA_DataValue_null_json_encode) {
  2431. UA_DataValue *src = UA_DataValue_new();
  2432. UA_DataValue_init(src);
  2433. const UA_DataType *type = &UA_TYPES[UA_TYPES_DATAVALUE];
  2434. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  2435. UA_ByteString buf;
  2436. UA_ByteString_allocBuffer(&buf, size+1);
  2437. UA_Byte *bufPos = &buf.data[0];
  2438. const UA_Byte *bufEnd = &buf.data[size+1];
  2439. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2440. *bufPos = 0;
  2441. // then
  2442. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2443. char* result = "null";
  2444. ck_assert_str_eq(result, (char*)buf.data);
  2445. UA_ByteString_deleteMembers(&buf);
  2446. UA_DataValue_delete(src);
  2447. }
  2448. END_TEST
  2449. START_TEST(UA_MessageReadResponse_json_encode) {
  2450. UA_ReadResponse src;
  2451. UA_ReadResponse_init(&src);
  2452. UA_DiagnosticInfo innerDiag;
  2453. innerDiag.hasAdditionalInfo = UA_TRUE;
  2454. innerDiag.additionalInfo = UA_STRING_ALLOC("INNER ADDITION INFO");
  2455. innerDiag.hasInnerDiagnosticInfo = UA_FALSE;
  2456. innerDiag.hasInnerStatusCode = UA_FALSE;
  2457. innerDiag.hasLocale = UA_FALSE;
  2458. innerDiag.hasSymbolicId = UA_FALSE;
  2459. innerDiag.hasLocalizedText = UA_FALSE;
  2460. innerDiag.hasNamespaceUri = UA_FALSE;
  2461. UA_DiagnosticInfo *info = (UA_DiagnosticInfo*)UA_calloc(1, sizeof(UA_DiagnosticInfo));
  2462. info[0] = innerDiag;
  2463. src.diagnosticInfos = info;
  2464. src.diagnosticInfosSize = 1;
  2465. UA_DataValue dv;
  2466. UA_DataValue_init(&dv);
  2467. dv.hasServerPicoseconds = UA_TRUE;
  2468. dv.hasServerTimestamp = UA_TRUE;
  2469. dv.hasSourcePicoseconds = UA_TRUE;
  2470. dv.hasSourceTimestamp = UA_TRUE;
  2471. dv.hasStatus = UA_TRUE;
  2472. dv.hasValue = UA_TRUE;
  2473. UA_DateTime srcts = UA_DateTime_fromUnixTime(1234567);
  2474. UA_DateTime srvts = UA_DateTime_fromUnixTime(1234567);
  2475. dv.sourceTimestamp = srcts;
  2476. dv.serverTimestamp = srvts;
  2477. dv.sourcePicoseconds = 0;
  2478. dv.serverPicoseconds = 0;
  2479. UA_Variant variant;
  2480. UA_Variant_init(&variant);
  2481. UA_Boolean variantContent = true;
  2482. UA_Variant_setScalarCopy(&variant, &variantContent, &UA_TYPES[UA_TYPES_BOOLEAN]);
  2483. dv.value = variant;
  2484. dv.status = UA_STATUSCODE_BADAPPLICATIONSIGNATUREINVALID;
  2485. UA_DataValue *values = (UA_DataValue*)UA_calloc(1, sizeof(UA_DataValue));
  2486. values[0] = dv;
  2487. src.results = values;
  2488. src.resultsSize = 1;
  2489. UA_ResponseHeader rh;
  2490. UA_ResponseHeader_init(&rh);
  2491. rh.stringTableSize = 0;
  2492. rh.requestHandle = 123123;
  2493. rh.serviceResult = UA_STATUSCODE_GOOD;
  2494. rh.timestamp = UA_DateTime_fromUnixTime(1234567);
  2495. UA_DiagnosticInfo serverDiag;
  2496. UA_DiagnosticInfo_init(&serverDiag);
  2497. serverDiag.hasAdditionalInfo = UA_TRUE;
  2498. serverDiag.additionalInfo = UA_STRING_ALLOC("serverDiag");
  2499. serverDiag.hasInnerDiagnosticInfo = UA_FALSE;
  2500. serverDiag.hasInnerStatusCode = UA_FALSE;
  2501. serverDiag.hasLocale = UA_FALSE;
  2502. serverDiag.hasSymbolicId = UA_FALSE;
  2503. serverDiag.hasLocalizedText = UA_FALSE;
  2504. serverDiag.hasNamespaceUri = UA_FALSE;
  2505. rh.serviceDiagnostics = serverDiag;
  2506. UA_ExtensionObject e;
  2507. UA_ExtensionObject_init(&e);
  2508. e.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
  2509. e.content.decoded.type = &UA_TYPES[UA_TYPES_BOOLEAN];
  2510. UA_Boolean b = UA_FALSE;
  2511. e.content.decoded.data = &b;
  2512. rh.additionalHeader = e;
  2513. src.responseHeader = rh;
  2514. const UA_DataType *type = &UA_TYPES[UA_TYPES_READRESPONSE];
  2515. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  2516. UA_ByteString buf;
  2517. UA_ByteString_allocBuffer(&buf, size+1);
  2518. UA_Byte *bufPos = &buf.data[0];
  2519. const UA_Byte *bufEnd = &buf.data[size+1];
  2520. status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2521. *bufPos = 0;
  2522. // then
  2523. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2524. char* result = "{\"ResponseHeader\":{\"Timestamp\":\"1970-01-15T06:56:07Z\",\"RequestHandle\":123123,\"ServiceResult\":0,\"ServiceDiagnostics\":{\"AdditionalInfo\":\"serverDiag\"},\"StringTable\":[],\"AdditionalHeader\":{\"TypeId\":{\"Id\":1},\"Body\":false}},\"Results\":[{\"Value\":{\"Type\":1,\"Body\":true},\"Status\":2153250816,\"SourceTimestamp\":\"1970-01-15T06:56:07Z\",\"ServerTimestamp\":\"1970-01-15T06:56:07Z\"}],\"DiagnosticInfos\":[{\"AdditionalInfo\":\"INNER ADDITION INFO\"}]}";
  2525. ck_assert_str_eq(result, (char*)buf.data);
  2526. UA_ByteString_deleteMembers(&buf);
  2527. UA_ReadResponse_deleteMembers(&src); //TODO
  2528. }
  2529. END_TEST
  2530. START_TEST(UA_ViewDescription_json_encode) {
  2531. UA_ViewDescription src;
  2532. UA_ViewDescription_init(&src);
  2533. UA_DateTime srvts = UA_DateTime_fromUnixTime(1234567);
  2534. src.timestamp = srvts;
  2535. src.viewVersion = 1236;
  2536. src.viewId = UA_NODEID_NUMERIC(0,99999);
  2537. const UA_DataType *type = &UA_TYPES[UA_TYPES_VIEWDESCRIPTION];
  2538. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  2539. UA_ByteString buf;
  2540. UA_ByteString_allocBuffer(&buf, size+1);
  2541. UA_Byte *bufPos = &buf.data[0];
  2542. const UA_Byte *bufEnd = &buf.data[size+1];
  2543. status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2544. *bufPos = 0;
  2545. // then
  2546. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2547. char* result = "{\"ViewId\":{\"Id\":99999},\"Timestamp\":\"1970-01-15T06:56:07Z\",\"ViewVersion\":1236}";
  2548. ck_assert_str_eq(result, (char*)buf.data);
  2549. UA_ByteString_deleteMembers(&buf);
  2550. UA_ViewDescription_deleteMembers(&src);
  2551. }
  2552. END_TEST
  2553. START_TEST(UA_WriteRequest_json_encode) {
  2554. UA_WriteRequest src;
  2555. UA_WriteRequest_init(&src);
  2556. UA_RequestHeader rh;
  2557. rh.returnDiagnostics = 1;
  2558. rh.auditEntryId = UA_STRING_ALLOC("Auditentryid");
  2559. rh.requestHandle = 123123;
  2560. rh.authenticationToken = UA_NODEID_STRING_ALLOC(0,"authToken");
  2561. rh.timestamp = UA_DateTime_fromUnixTime(1234567);
  2562. rh.timeoutHint = 120;
  2563. UA_ExtensionObject e;
  2564. UA_ExtensionObject_init(&e);
  2565. e.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
  2566. e.content.decoded.type = &UA_TYPES[UA_TYPES_BOOLEAN];
  2567. UA_Boolean b = UA_FALSE;
  2568. e.content.decoded.data = &b;
  2569. rh.additionalHeader = e;
  2570. UA_DataValue dv;
  2571. UA_DataValue_init(&dv);
  2572. dv.hasServerPicoseconds = UA_TRUE;
  2573. dv.hasServerTimestamp = UA_TRUE;
  2574. dv.hasSourcePicoseconds = UA_TRUE;
  2575. dv.hasSourceTimestamp = UA_TRUE;
  2576. dv.hasStatus = UA_TRUE;
  2577. dv.hasValue = UA_TRUE;
  2578. UA_DateTime srcts = UA_DateTime_fromUnixTime(1234567);
  2579. UA_DateTime srvts = UA_DateTime_fromUnixTime(1234567);
  2580. dv.sourceTimestamp = srcts;
  2581. dv.serverTimestamp = srvts;
  2582. dv.sourcePicoseconds = 0;
  2583. dv.serverPicoseconds = 0;
  2584. UA_Variant variant;
  2585. UA_Variant_init(&variant);
  2586. UA_Boolean variantContent = true;
  2587. UA_Variant_setScalarCopy(&variant, &variantContent, &UA_TYPES[UA_TYPES_BOOLEAN]);
  2588. dv.value = variant;
  2589. dv.status = UA_STATUSCODE_BADAPPLICATIONSIGNATUREINVALID;
  2590. UA_DataValue dv2;
  2591. UA_DataValue_init(&dv2);
  2592. dv2.hasServerPicoseconds = UA_TRUE;
  2593. dv2.hasServerTimestamp = UA_TRUE;
  2594. dv2.hasSourcePicoseconds = UA_TRUE;
  2595. dv2.hasSourceTimestamp = UA_TRUE;
  2596. dv2.hasStatus = UA_TRUE;
  2597. dv2.hasValue = UA_TRUE;
  2598. UA_DateTime srcts2 = UA_DateTime_fromUnixTime(1234567);
  2599. UA_DateTime srvts2 = UA_DateTime_fromUnixTime(1234567);
  2600. dv2.sourceTimestamp = srcts2;
  2601. dv2.serverTimestamp = srvts2;
  2602. dv2.sourcePicoseconds = 0;
  2603. dv2.serverPicoseconds = 0;
  2604. UA_Variant variant2;
  2605. UA_Variant_init(&variant2);
  2606. UA_Boolean variantContent2 = true;
  2607. UA_Variant_setScalarCopy(&variant2, &variantContent2, &UA_TYPES[UA_TYPES_BOOLEAN]);
  2608. dv2.value = variant2;
  2609. dv2.status = UA_STATUSCODE_BADAPPLICATIONSIGNATUREINVALID;
  2610. UA_WriteValue value;
  2611. UA_WriteValue_init(&value);
  2612. value.value = dv;
  2613. value.attributeId = 12;
  2614. value.indexRange = UA_STRING_ALLOC("BLOAB");
  2615. value.nodeId = UA_NODEID_STRING_ALLOC(0, "a1111");
  2616. UA_WriteValue value2;
  2617. UA_WriteValue_init(&value2);
  2618. value2.value = dv2;
  2619. value2.attributeId = 12;
  2620. value2.indexRange = UA_STRING_ALLOC("BLOAB");
  2621. value2.nodeId = UA_NODEID_STRING_ALLOC(0, "a2222");
  2622. UA_WriteValue *values = (UA_WriteValue*)UA_calloc(2,sizeof(UA_WriteValue));
  2623. values[0] = value;
  2624. values[1] = value2;
  2625. src.nodesToWrite = values;
  2626. src.nodesToWriteSize = 2;
  2627. src.requestHeader = rh;
  2628. const UA_DataType *type = &UA_TYPES[UA_TYPES_WRITEREQUEST];
  2629. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  2630. UA_ByteString buf;
  2631. UA_ByteString_allocBuffer(&buf, size+1);
  2632. UA_Byte *bufPos = &buf.data[0];
  2633. const UA_Byte *bufEnd = &buf.data[size+1];
  2634. status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2635. *bufPos = 0;
  2636. // then
  2637. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2638. char* result = "{\"RequestHeader\":{\"AuthenticationToken\":{\"IdType\":1,\"Id\":\"authToken\"},\"Timestamp\":\"1970-01-15T06:56:07Z\",\"RequestHandle\":123123,\"ReturnDiagnostics\":1,\"AuditEntryId\":\"Auditentryid\",\"TimeoutHint\":120,\"AdditionalHeader\":{\"TypeId\":{\"Id\":1},\"Body\":false}},\"NodesToWrite\":[{\"NodeId\":{\"IdType\":1,\"Id\":\"a1111\"},\"AttributeId\":12,\"IndexRange\":\"BLOAB\",\"Value\":{\"Value\":{\"Type\":1,\"Body\":true},\"Status\":2153250816,\"SourceTimestamp\":\"1970-01-15T06:56:07Z\",\"ServerTimestamp\":\"1970-01-15T06:56:07Z\"}},{\"NodeId\":{\"IdType\":1,\"Id\":\"a2222\"},\"AttributeId\":12,\"IndexRange\":\"BLOAB\",\"Value\":{\"Value\":{\"Type\":1,\"Body\":true},\"Status\":2153250816,\"SourceTimestamp\":\"1970-01-15T06:56:07Z\",\"ServerTimestamp\":\"1970-01-15T06:56:07Z\"}}]}";
  2639. ck_assert_str_eq(result, (char*)buf.data);
  2640. UA_ByteString_deleteMembers(&buf);
  2641. UA_WriteRequest_deleteMembers(&src);
  2642. }
  2643. END_TEST
  2644. START_TEST(UA_VariableAttributes_json_encode) {
  2645. const UA_VariableTypeAttributes UA_VariableTypeAttributes_default = {
  2646. 0, /* specifiedAttributes */
  2647. {{0, NULL}, {0, NULL}}, /* displayName */
  2648. {{0, NULL}, {0, NULL}}, /* description */
  2649. 0, 0, /* writeMask (userWriteMask) */
  2650. {NULL, UA_VARIANT_DATA, 0, NULL, 0, NULL}, /* value */
  2651. {0, UA_NODEIDTYPE_NUMERIC, {0}}, /* dataType */
  2652. UA_VALUERANK_ANY, /* valueRank */
  2653. 0, NULL, /* arrayDimensions */
  2654. true /* isAbstract */
  2655. };
  2656. UA_VariableTypeAttributes src = UA_VariableTypeAttributes_default;
  2657. UA_Int32 myInteger = 42;
  2658. UA_Variant_setScalar(&src.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
  2659. src.description = UA_LOCALIZEDTEXT("en-US","the answer");
  2660. src.displayName = UA_LOCALIZEDTEXT("en-US","the answer");
  2661. src.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
  2662. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES];
  2663. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  2664. UA_ByteString buf;
  2665. UA_ByteString_allocBuffer(&buf, size+1);
  2666. UA_Byte *bufPos = &buf.data[0];
  2667. const UA_Byte *bufEnd = &buf.data[size+1];
  2668. status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2669. *bufPos = 0;
  2670. // then
  2671. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2672. char* result = "{\"SpecifiedAttributes\":0,"
  2673. "\"DisplayName\":{\"Locale\":\"en-US\",\"Text\":\"the answer\"},"
  2674. "\"Description\":{\"Locale\":\"en-US\",\"Text\":\"the answer\"},"
  2675. "\"WriteMask\":0,\"UserWriteMask\":0,"
  2676. "\"Value\":{\"Type\":6,\"Body\":42},"
  2677. "\"DataType\":{\"Id\":6},\"ValueRank\":-2,"
  2678. "\"ArrayDimensions\":[],"
  2679. "\"IsAbstract\":true}";
  2680. ck_assert_str_eq(result, (char*)buf.data);
  2681. UA_ByteString_deleteMembers(&buf);
  2682. }
  2683. END_TEST
  2684. // ---------------------------DECODE-------------------------------------
  2685. START_TEST(UA_Byte_Min_json_decode) {
  2686. UA_Variant out;
  2687. UA_Variant_init(&out);
  2688. UA_ByteString buf = UA_STRING("{\"Type\":3,\"Body\":0}");
  2689. // when
  2690. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2691. // then
  2692. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2693. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_BYTE);
  2694. ck_assert_uint_eq(*((UA_Byte*)out.data), 0);
  2695. UA_Variant_deleteMembers(&out);
  2696. }
  2697. END_TEST
  2698. START_TEST(UA_Byte_Max_json_decode) {
  2699. UA_Variant out;
  2700. UA_Variant_init(&out);
  2701. UA_ByteString buf = UA_STRING("{\"Type\":3,\"Body\":255}");
  2702. // when
  2703. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2704. // then
  2705. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2706. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_BYTE);
  2707. ck_assert_uint_eq(*((UA_Byte*)out.data), 255);
  2708. UA_Variant_deleteMembers(&out);
  2709. }
  2710. END_TEST
  2711. /* ----UInt16---- */
  2712. START_TEST(UA_UInt16_Min_json_decode) {
  2713. UA_Variant out;
  2714. UA_Variant_init(&out);
  2715. UA_ByteString buf = UA_STRING("{\"Type\":5,\"Body\":0}");
  2716. // when
  2717. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2718. // then
  2719. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2720. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT16);
  2721. ck_assert_uint_eq(*((UA_UInt16*)out.data), 0);
  2722. UA_Variant_deleteMembers(&out);
  2723. }
  2724. END_TEST
  2725. START_TEST(UA_UInt16_Max_json_decode) {
  2726. UA_Variant out;
  2727. UA_Variant_init(&out);
  2728. UA_ByteString buf = UA_STRING("{\"Type\":5,\"Body\":65535}");
  2729. // when
  2730. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2731. // then
  2732. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2733. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT16);
  2734. ck_assert_uint_eq(*((UA_UInt16*)out.data), 65535);
  2735. UA_Variant_deleteMembers(&out);
  2736. }
  2737. END_TEST
  2738. START_TEST(UA_UInt32_Min_json_decode) {
  2739. UA_Variant out;
  2740. UA_Variant_init(&out);
  2741. UA_ByteString buf = UA_STRING("{\"Type\":7,\"Body\":0}");
  2742. // when
  2743. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2744. // then
  2745. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2746. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT32);
  2747. ck_assert_uint_eq(*((UA_UInt32*)out.data), 0);
  2748. UA_Variant_deleteMembers(&out);
  2749. }
  2750. END_TEST
  2751. START_TEST(UA_UInt32_Max_json_decode) {
  2752. UA_Variant out;
  2753. UA_Variant_init(&out);
  2754. UA_ByteString buf = UA_STRING("{\"Type\":7,\"Body\":4294967295}");
  2755. // when
  2756. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2757. // then
  2758. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2759. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT32);
  2760. ck_assert_uint_eq(*((UA_UInt32*)out.data), 4294967295);
  2761. UA_Variant_deleteMembers(&out);
  2762. }
  2763. END_TEST
  2764. START_TEST(UA_UInt64_Min_json_decode) {
  2765. UA_Variant out;
  2766. UA_Variant_init(&out);
  2767. UA_ByteString buf = UA_STRING("{\"Type\":9,\"Body\":\"0\"}");
  2768. // when
  2769. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2770. // then
  2771. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2772. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT64);
  2773. ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
  2774. ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  2775. ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
  2776. ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
  2777. ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
  2778. ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
  2779. ck_assert_int_eq(((u8*)(out.data))[6], 0x00);
  2780. ck_assert_int_eq(((u8*)(out.data))[7], 0x00);
  2781. UA_Variant_deleteMembers(&out);
  2782. }
  2783. END_TEST
  2784. START_TEST(UA_UInt64_Max_json_decode) {
  2785. UA_Variant out;
  2786. UA_Variant_init(&out);
  2787. UA_ByteString buf = UA_STRING("{\"Type\":9,\"Body\":\"18446744073709551615\"}");
  2788. // when
  2789. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2790. // then
  2791. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2792. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT64);
  2793. ck_assert_int_eq(((u8*)(out.data))[0], 0xFF);
  2794. ck_assert_int_eq(((u8*)(out.data))[1], 0xFF);
  2795. ck_assert_int_eq(((u8*)(out.data))[2], 0xFF);
  2796. ck_assert_int_eq(((u8*)(out.data))[3], 0xFF);
  2797. ck_assert_int_eq(((u8*)(out.data))[4], 0xFF);
  2798. ck_assert_int_eq(((u8*)(out.data))[5], 0xFF);
  2799. ck_assert_int_eq(((u8*)(out.data))[6], 0xFF);
  2800. ck_assert_int_eq(((u8*)(out.data))[7], 0xFF);
  2801. UA_Variant_deleteMembers(&out);
  2802. }
  2803. END_TEST
  2804. START_TEST(UA_UInt64_Overflow_json_decode) {
  2805. UA_Variant out;
  2806. UA_Variant_init(&out);
  2807. UA_ByteString buf = UA_STRING("{\"Type\":9,\"Body\":\"18446744073709551616\"}");
  2808. // when
  2809. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2810. // then
  2811. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  2812. UA_Variant_deleteMembers(&out);
  2813. }
  2814. END_TEST
  2815. START_TEST(UA_SByte_Min_json_decode) {
  2816. UA_Variant out;
  2817. UA_Variant_init(&out);
  2818. UA_ByteString buf = UA_STRING("{\"Type\":2,\"Body\":-128}");
  2819. // when
  2820. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2821. // then
  2822. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2823. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_SBYTE);
  2824. ck_assert_int_eq(*((UA_SByte*)out.data), -128);
  2825. UA_Variant_deleteMembers(&out);
  2826. }
  2827. END_TEST
  2828. START_TEST(UA_SByte_Max_json_decode) {
  2829. UA_Variant out;
  2830. UA_Variant_init(&out);
  2831. UA_ByteString buf = UA_STRING("{\"Type\":2,\"Body\":127}");
  2832. // when
  2833. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2834. // then
  2835. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2836. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_SBYTE);
  2837. ck_assert_int_eq(*((UA_SByte*)out.data), 127);
  2838. UA_Variant_deleteMembers(&out);
  2839. }
  2840. END_TEST
  2841. START_TEST(UA_Int16_Min_json_decode) {
  2842. UA_Variant out;
  2843. UA_Variant_init(&out);
  2844. UA_ByteString buf = UA_STRING("{\"Type\":4,\"Body\":-32768}");
  2845. // when
  2846. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2847. // then
  2848. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2849. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT16);
  2850. ck_assert_int_eq(*((UA_Int16*)out.data), -32768);
  2851. UA_Variant_deleteMembers(&out);
  2852. }
  2853. END_TEST
  2854. START_TEST(UA_Int16_Max_json_decode) {
  2855. UA_Variant out;
  2856. UA_Variant_init(&out);
  2857. UA_ByteString buf = UA_STRING("{\"Type\":4,\"Body\":32767}");
  2858. // when
  2859. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2860. // then
  2861. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2862. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT16);
  2863. ck_assert_int_eq(*((UA_Int16*)out.data), 32767);
  2864. UA_Variant_deleteMembers(&out);
  2865. }
  2866. END_TEST
  2867. START_TEST(UA_Int32_Min_json_decode) {
  2868. UA_Variant out;
  2869. UA_Variant_init(&out);
  2870. UA_ByteString buf = UA_STRING("{\"Type\":6,\"Body\":-2147483648}");
  2871. // when
  2872. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2873. // then
  2874. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2875. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT32);
  2876. ck_assert(*(UA_Int32*)out.data == -2147483648);
  2877. UA_Variant_deleteMembers(&out);
  2878. }
  2879. END_TEST
  2880. START_TEST(UA_Int32_Max_json_decode) {
  2881. UA_Variant out;
  2882. UA_Variant_init(&out);
  2883. UA_ByteString buf = UA_STRING("{\"Type\":6,\"Body\":2147483647}");
  2884. // when
  2885. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2886. // then
  2887. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2888. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT32);
  2889. ck_assert_int_eq(*((UA_Int32*)out.data), 2147483647);
  2890. UA_Variant_deleteMembers(&out);
  2891. }
  2892. END_TEST
  2893. START_TEST(UA_Int64_Min_json_decode) {
  2894. UA_Variant out;
  2895. UA_Variant_init(&out);
  2896. UA_ByteString buf = UA_STRING("{\"Type\":8,\"Body\":\"-9223372036854775808\"}");
  2897. // when
  2898. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2899. // then
  2900. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2901. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT64);
  2902. ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
  2903. ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  2904. ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
  2905. ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
  2906. ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
  2907. ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
  2908. ck_assert_int_eq(((u8*)(out.data))[6], 0x00);
  2909. ck_assert_int_eq(((u8*)(out.data))[7], 0x80);
  2910. UA_Variant_deleteMembers(&out);
  2911. }
  2912. END_TEST
  2913. START_TEST(UA_Int64_Max_json_decode) {
  2914. UA_Variant out;
  2915. UA_Variant_init(&out);
  2916. UA_ByteString buf = UA_STRING("{\"Type\":8,\"Body\":\"9223372036854775807\"}");
  2917. // when
  2918. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2919. // then
  2920. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2921. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT64);
  2922. ck_assert_int_eq(((u8*)(out.data))[0], 0xFF);
  2923. ck_assert_int_eq(((u8*)(out.data))[1], 0xFF);
  2924. ck_assert_int_eq(((u8*)(out.data))[2], 0xFF);
  2925. ck_assert_int_eq(((u8*)(out.data))[3], 0xFF);
  2926. ck_assert_int_eq(((u8*)(out.data))[4], 0xFF);
  2927. ck_assert_int_eq(((u8*)(out.data))[5], 0xFF);
  2928. ck_assert_int_eq(((u8*)(out.data))[6], 0xFF);
  2929. ck_assert_int_eq(((u8*)(out.data))[7], 0x7F);
  2930. UA_Variant_deleteMembers(&out);
  2931. }
  2932. END_TEST
  2933. START_TEST(UA_Int64_Overflow_json_decode) {
  2934. UA_Variant out;
  2935. UA_Variant_init(&out);
  2936. UA_ByteString buf = UA_STRING("{\"Type\":8,\"Body\":\"9223372036854775808\"}");
  2937. // when
  2938. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2939. // then
  2940. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  2941. UA_Variant_deleteMembers(&out);
  2942. }
  2943. END_TEST
  2944. START_TEST(UA_Int64_TooBig_json_decode) {
  2945. UA_Variant out;
  2946. UA_Variant_init(&out);
  2947. UA_ByteString buf = UA_STRING("{\"Type\":8,\"Body\":\"111111111111111111111111111111\"}");
  2948. // when
  2949. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2950. // then
  2951. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  2952. UA_Variant_deleteMembers(&out);
  2953. }
  2954. END_TEST
  2955. START_TEST(UA_Int64_NoDigit_json_decode) {
  2956. UA_Variant out;
  2957. UA_Variant_init(&out);
  2958. UA_ByteString buf = UA_STRING("{\"Type\":8,\"Body\":\"a\"}");
  2959. // when
  2960. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2961. // then
  2962. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  2963. UA_Variant_deleteMembers(&out);
  2964. }
  2965. END_TEST
  2966. START_TEST(UA_Float_json_decode) {
  2967. UA_Variant out;
  2968. UA_Variant_init(&out);
  2969. UA_ByteString buf = UA_STRING("{\"Type\":10,\"Body\":3.1415927410}");
  2970. // when
  2971. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2972. // then
  2973. //0 10000000 10010010000111111011011 = 40 49 0f db
  2974. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2975. ck_assert_int_eq(((u8*)(out.data))[0], 0xdb);
  2976. ck_assert_int_eq(((u8*)(out.data))[1], 0x0f);
  2977. ck_assert_int_eq(((u8*)(out.data))[2], 0x49);
  2978. ck_assert_int_eq(((u8*)(out.data))[3], 0x40);
  2979. UA_Variant_deleteMembers(&out);
  2980. }
  2981. END_TEST
  2982. START_TEST(UA_Float_json_one_decode) {
  2983. UA_Variant out;
  2984. UA_Variant_init(&out);
  2985. UA_ByteString buf = UA_STRING("{\"Type\":10,\"Body\":1}");
  2986. // when
  2987. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2988. // then
  2989. //0 01111111 00000000000000000000000 = 3f80 0000
  2990. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2991. ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
  2992. ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  2993. ck_assert_int_eq(((u8*)(out.data))[2], 0x80);
  2994. ck_assert_int_eq(((u8*)(out.data))[3], 0x3f);
  2995. UA_Variant_deleteMembers(&out);
  2996. }
  2997. END_TEST
  2998. START_TEST(UA_Float_json_inf_decode) {
  2999. UA_Variant out;
  3000. UA_Variant_init(&out);
  3001. UA_ByteString buf = UA_STRING("{\"Type\":10,\"Body\":\"Infinity\"}");
  3002. // when
  3003. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3004. // then
  3005. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3006. ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
  3007. ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  3008. ck_assert_int_eq(((u8*)(out.data))[2], 0x80);
  3009. ck_assert_int_eq(((u8*)(out.data))[3], 0x7f);
  3010. UA_Variant_deleteMembers(&out);
  3011. }
  3012. END_TEST
  3013. START_TEST(UA_Float_json_neginf_decode) {
  3014. UA_Variant out;
  3015. UA_Variant_init(&out);
  3016. UA_ByteString buf = UA_STRING("{\"Type\":10,\"Body\":\"-Infinity\"}");
  3017. // when
  3018. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3019. // then
  3020. //0 01111111 00000000000000000000000 = 3f80 0000
  3021. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3022. ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
  3023. ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  3024. ck_assert_int_eq(((u8*)(out.data))[2], 0x80);
  3025. ck_assert_int_eq(((u8*)(out.data))[3], 0xff);
  3026. UA_Variant_deleteMembers(&out);
  3027. }
  3028. END_TEST
  3029. START_TEST(UA_Float_json_nan_decode) {
  3030. UA_Variant out;
  3031. UA_Variant_init(&out);
  3032. UA_ByteString buf = UA_STRING("{\"Type\":10,\"Body\":\"NaN\"}");
  3033. // when
  3034. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3035. // then
  3036. //0 01111111 00000000000000000000000 = 3f80 0000
  3037. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3038. //ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
  3039. //ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  3040. //ck_assert_int_eq(((u8*)(out.data))[2], 0x80);
  3041. //ck_assert_int_eq(((u8*)(out.data))[3], 0x3f);
  3042. UA_Float val = *((UA_Float*)out.data);
  3043. ck_assert(val != val);
  3044. UA_Variant_deleteMembers(&out);
  3045. }
  3046. END_TEST
  3047. START_TEST(UA_Float_json_negnan_decode) {
  3048. UA_Variant out;
  3049. UA_Variant_init(&out);
  3050. UA_ByteString buf = UA_STRING("{\"Type\":10,\"Body\":\"-NaN\"}");
  3051. // when
  3052. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3053. // then
  3054. //0 01111111 00000000000000000000000 = 3f80 0000
  3055. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3056. //ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
  3057. //ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  3058. //ck_assert_int_eq(((u8*)(out.data))[2], 0x80);
  3059. //ck_assert_int_eq(((u8*)(out.data))[3], 0x3f);
  3060. UA_Float val = *((UA_Float*)out.data);
  3061. ck_assert(val != val); /* check if not a number */
  3062. UA_Variant_deleteMembers(&out);
  3063. }
  3064. END_TEST
  3065. START_TEST(UA_Double_json_decode) {
  3066. UA_Variant out;
  3067. UA_Variant_init(&out);
  3068. UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":1.1234}");
  3069. // when
  3070. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3071. // then
  3072. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3073. ck_assert_int_eq(((u8*)(out.data))[0], 0xef);
  3074. ck_assert_int_eq(((u8*)(out.data))[1], 0x38);
  3075. ck_assert_int_eq(((u8*)(out.data))[2], 0x45);
  3076. ck_assert_int_eq(((u8*)(out.data))[3], 0x47);
  3077. ck_assert_int_eq(((u8*)(out.data))[4], 0x72);
  3078. ck_assert_int_eq(((u8*)(out.data))[5], 0xf9);
  3079. ck_assert_int_eq(((u8*)(out.data))[6], 0xf1);
  3080. ck_assert_int_eq(((u8*)(out.data))[7], 0x3f);
  3081. UA_Variant_deleteMembers(&out);
  3082. }
  3083. END_TEST
  3084. START_TEST(UA_Double_corrupt_json_decode) {
  3085. UA_Variant out;
  3086. UA_Variant_init(&out);
  3087. UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":1.12.34}");
  3088. // when
  3089. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3090. // then
  3091. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  3092. UA_Variant_deleteMembers(&out);
  3093. }
  3094. END_TEST
  3095. START_TEST(UA_Double_one_json_decode) {
  3096. UA_Variant out;
  3097. UA_Variant_init(&out);
  3098. //UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":1}");
  3099. UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":1}");
  3100. // when
  3101. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3102. // then
  3103. // 0 01111111111 0000000000000000000000000000000000000000000000000000
  3104. // 3FF0000000000000
  3105. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3106. ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
  3107. ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  3108. ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
  3109. ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
  3110. ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
  3111. ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
  3112. ck_assert_int_eq(((u8*)(out.data))[6], 0xF0);
  3113. ck_assert_int_eq(((u8*)(out.data))[7], 0x3F);
  3114. UA_Variant_deleteMembers(&out);
  3115. }
  3116. END_TEST
  3117. START_TEST(UA_Double_onepointsmallest_json_decode) {
  3118. UA_Variant out;
  3119. UA_Variant_init(&out);
  3120. UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":1.0000000000000002}");
  3121. // when
  3122. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3123. // then
  3124. // 0 01111111111 0000000000000000000000000000000000000000000000000001
  3125. // 3FF0000000000001
  3126. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3127. ck_assert_int_eq(((u8*)(out.data))[0], 0x01);
  3128. ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  3129. ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
  3130. ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
  3131. ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
  3132. ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
  3133. ck_assert_int_eq(((u8*)(out.data))[6], 0xF0);
  3134. ck_assert_int_eq(((u8*)(out.data))[7], 0x3F);
  3135. UA_Variant_deleteMembers(&out);
  3136. }
  3137. END_TEST
  3138. START_TEST(UA_Double_nan_json_decode) {
  3139. UA_Variant out;
  3140. UA_Variant_init(&out);
  3141. UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":\"NaN\"}");
  3142. // when
  3143. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3144. // then
  3145. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3146. UA_Double val = *((UA_Double*)out.data);
  3147. ck_assert(val != val); /* check if not a number */
  3148. UA_Variant_deleteMembers(&out);
  3149. }
  3150. END_TEST
  3151. START_TEST(UA_Double_negnan_json_decode) {
  3152. UA_Variant out;
  3153. UA_Variant_init(&out);
  3154. UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":\"-NaN\"}");
  3155. // when
  3156. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3157. // then
  3158. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3159. UA_Double val = *((UA_Double*)out.data);
  3160. ck_assert(val != val); /* check if not a number */
  3161. UA_Variant_deleteMembers(&out);
  3162. }
  3163. END_TEST
  3164. START_TEST(UA_Double_inf_json_decode) {
  3165. UA_Variant out;
  3166. UA_Variant_init(&out);
  3167. UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":\"Infinity\"}");
  3168. // when
  3169. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3170. // then
  3171. // 0 111 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
  3172. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3173. ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
  3174. ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  3175. ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
  3176. ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
  3177. ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
  3178. ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
  3179. ck_assert_int_eq(((u8*)(out.data))[6], 0xF0);
  3180. ck_assert_int_eq(((u8*)(out.data))[7], 0x7F);
  3181. UA_Variant_deleteMembers(&out);
  3182. }
  3183. END_TEST
  3184. START_TEST(UA_Double_neginf_json_decode) {
  3185. UA_Variant out;
  3186. UA_Variant_init(&out);
  3187. UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":\"-Infinity\"}");
  3188. // when
  3189. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3190. // then
  3191. // 1 111 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
  3192. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3193. ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
  3194. ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  3195. ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
  3196. ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
  3197. ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
  3198. ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
  3199. ck_assert_int_eq(((u8*)(out.data))[6], 0xF0);
  3200. ck_assert_int_eq(((u8*)(out.data))[7], 0xFF);
  3201. UA_Variant_deleteMembers(&out);
  3202. }
  3203. END_TEST
  3204. START_TEST(UA_Double_zero_json_decode) {
  3205. UA_Variant out;
  3206. UA_Variant_init(&out);
  3207. UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":0}");
  3208. // when
  3209. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3210. // then
  3211. // 0 000 0000 0000 0000 0000 0000 00000000 00000000 00000000 00000000 00000000
  3212. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3213. ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
  3214. ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  3215. ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
  3216. ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
  3217. ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
  3218. ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
  3219. ck_assert_int_eq(((u8*)(out.data))[6], 0x00);
  3220. ck_assert_int_eq(((u8*)(out.data))[7], 0x00);
  3221. UA_Variant_deleteMembers(&out);
  3222. }
  3223. END_TEST
  3224. START_TEST(UA_Double_negzero_json_decode) {
  3225. UA_Variant out;
  3226. UA_Variant_init(&out);
  3227. UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":-0}");
  3228. // when
  3229. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3230. // then
  3231. // 1 000 0000 0000 0000 00000000 00000000 00000000 00000000 00000000 00000000
  3232. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3233. ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
  3234. ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  3235. ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
  3236. ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
  3237. ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
  3238. ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
  3239. ck_assert_int_eq(((u8*)(out.data))[6], 0x00);
  3240. ck_assert_int_eq(((u8*)(out.data))[7], 0x80);
  3241. UA_Variant_deleteMembers(&out);
  3242. }
  3243. END_TEST
  3244. START_TEST(UA_String_json_decode) {
  3245. UA_Variant out;
  3246. UA_Variant_init(&out);
  3247. UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"abcdef\"}");
  3248. // when
  3249. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3250. // then
  3251. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3252. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING);
  3253. ck_assert_int_eq( ((UA_String*)out.data)->length, 6);
  3254. ck_assert_int_eq( ((UA_String*)out.data)->data[0], 'a');
  3255. ck_assert_int_eq(((UA_String*)out.data)->data[1], 'b');
  3256. ck_assert_int_eq(((UA_String*)out.data)->data[2], 'c');
  3257. ck_assert_int_eq(((UA_String*)out.data)->data[3], 'd');
  3258. ck_assert_int_eq(((UA_String*)out.data)->data[4], 'e');
  3259. ck_assert_int_eq(((UA_String*)out.data)->data[5], 'f');
  3260. UA_Variant_deleteMembers(&out);
  3261. }
  3262. END_TEST
  3263. START_TEST(UA_String_empty_json_decode) {
  3264. UA_Variant out;
  3265. UA_Variant_init(&out);
  3266. UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"\"}");
  3267. // when
  3268. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3269. // then
  3270. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3271. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING);
  3272. ck_assert_int_eq( ((UA_String*)out.data)->length, 0);
  3273. ck_assert_ptr_eq( ((UA_String*)out.data)->data, UA_EMPTY_ARRAY_SENTINEL);
  3274. UA_Variant_deleteMembers(&out);
  3275. }
  3276. END_TEST
  3277. START_TEST(UA_String_unescapeBS_json_decode) {
  3278. UA_Variant out;
  3279. UA_Variant_init(&out);
  3280. UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"ab\\tcdef\"}");
  3281. // when
  3282. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3283. // then
  3284. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3285. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING);
  3286. ck_assert_int_eq( ((UA_String*)out.data)->length, 7);
  3287. ck_assert_int_eq( ((UA_String*)out.data)->data[0], 'a');
  3288. ck_assert_int_eq(((UA_String*)out.data)->data[1], 'b');
  3289. ck_assert_int_eq(((UA_String*)out.data)->data[2], '\t');
  3290. ck_assert_int_eq(((UA_String*)out.data)->data[3], 'c');
  3291. ck_assert_int_eq(((UA_String*)out.data)->data[4], 'd');
  3292. ck_assert_int_eq(((UA_String*)out.data)->data[5], 'e');
  3293. ck_assert_int_eq(((UA_String*)out.data)->data[6], 'f');
  3294. UA_Variant_deleteMembers(&out);
  3295. }
  3296. END_TEST
  3297. START_TEST(UA_String_escape_unicode_json_decode) {
  3298. UA_Variant out;
  3299. UA_Variant_init(&out);
  3300. UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"\\u002c\"}");
  3301. // when
  3302. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3303. // then
  3304. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3305. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING);
  3306. ck_assert_int_eq( ((UA_String*)out.data)->length, 1);
  3307. ck_assert_int_eq( ((UA_String*)out.data)->data[0], ',');
  3308. UA_Variant_deleteMembers(&out);
  3309. }
  3310. END_TEST
  3311. START_TEST(UA_String_escape2_json_decode) {
  3312. UA_Variant out;
  3313. UA_Variant_init(&out);
  3314. UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"\\b\\th\\\"e\\fl\\nl\\\\o\\r\"}");
  3315. // when
  3316. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3317. // then
  3318. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3319. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING);
  3320. ck_assert_int_eq( ((UA_String*)out.data)->length, 12);// \b\th\"e\fl\nl\\o\r
  3321. ck_assert_int_eq( ((UA_String*)out.data)->data[0], '\b');
  3322. ck_assert_int_eq( ((UA_String*)out.data)->data[1], '\t');
  3323. ck_assert_int_eq( ((UA_String*)out.data)->data[2], 'h');
  3324. ck_assert_int_eq( ((UA_String*)out.data)->data[3], '\"');
  3325. ck_assert_int_eq( ((UA_String*)out.data)->data[4], 'e');
  3326. ck_assert_int_eq( ((UA_String*)out.data)->data[5], '\f');
  3327. ck_assert_int_eq( ((UA_String*)out.data)->data[6], 'l');
  3328. ck_assert_int_eq( ((UA_String*)out.data)->data[7], '\n');
  3329. ck_assert_int_eq( ((UA_String*)out.data)->data[8], 'l');
  3330. ck_assert_int_eq( ((UA_String*)out.data)->data[9], '\\');
  3331. ck_assert_int_eq( ((UA_String*)out.data)->data[10], 'o');
  3332. ck_assert_int_eq( ((UA_String*)out.data)->data[11], '\r');
  3333. UA_Variant_deleteMembers(&out);
  3334. }
  3335. END_TEST
  3336. START_TEST(UA_String_surrogatePair_json_decode) {
  3337. UA_Variant out;
  3338. UA_Variant_init(&out);
  3339. UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"\\uD800\\uDC00\"}");
  3340. // when
  3341. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3342. // then
  3343. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3344. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING);
  3345. ck_assert_int_eq( ((UA_String*)out.data)->length, 4);//U+10000 => 0xF0 0x90 0x80 0x80
  3346. ck_assert_uint_eq( ((UA_String*)out.data)->data[0], 0xF0);
  3347. ck_assert_uint_eq( ((UA_String*)out.data)->data[1], 0x90);
  3348. ck_assert_uint_eq( ((UA_String*)out.data)->data[2], 0x80);
  3349. ck_assert_uint_eq( ((UA_String*)out.data)->data[3], 0x80);
  3350. UA_Variant_deleteMembers(&out);
  3351. }
  3352. END_TEST
  3353. /* ---------------ByteString---------------------------*/
  3354. START_TEST(UA_ByteString_json_decode) {
  3355. UA_Variant out;
  3356. UA_Variant_init(&out);
  3357. UA_ByteString buf = UA_STRING("{\"Type\":15,\"Body\":\"YXNkZmFzZGY=\"}");
  3358. // when
  3359. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3360. // then
  3361. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3362. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_BYTESTRING);
  3363. ck_assert_int_eq(((UA_ByteString*)out.data)->length, 8);
  3364. ck_assert_int_eq(((UA_ByteString*)out.data)->data[0], 'a');
  3365. ck_assert_int_eq(((UA_ByteString*)out.data)->data[1], 's');
  3366. ck_assert_int_eq(((UA_ByteString*)out.data)->data[2], 'd');
  3367. ck_assert_int_eq(((UA_ByteString*)out.data)->data[3], 'f');
  3368. ck_assert_int_eq(((UA_ByteString*)out.data)->data[4], 'a');
  3369. ck_assert_int_eq(((UA_ByteString*)out.data)->data[5], 's');
  3370. ck_assert_int_eq(((UA_ByteString*)out.data)->data[6], 'd');
  3371. ck_assert_int_eq(((UA_ByteString*)out.data)->data[7], 'f');
  3372. UA_Variant_deleteMembers(&out);
  3373. }
  3374. END_TEST
  3375. START_TEST(UA_ByteString_bad_json_decode) {
  3376. UA_ByteString out;
  3377. UA_ByteString_init(&out);
  3378. UA_ByteString buf = UA_STRING("\"\x90!\xc5 c{\",");
  3379. // when
  3380. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_BYTESTRING]);
  3381. // then
  3382. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3383. UA_ByteString_deleteMembers(&out);
  3384. }
  3385. END_TEST
  3386. START_TEST(UA_ByteString_null_json_decode) {
  3387. UA_Variant out;
  3388. UA_Variant_init(&out);
  3389. UA_ByteString buf = UA_STRING("{\"Type\":15,\"Body\":null}");
  3390. // when
  3391. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3392. // then
  3393. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3394. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_BYTESTRING);
  3395. ck_assert_ptr_eq(out.data, NULL);
  3396. UA_Variant_deleteMembers(&out);
  3397. }
  3398. END_TEST
  3399. /* ---------GUID--------------------------- */
  3400. START_TEST(UA_Guid_json_decode) {
  3401. UA_Variant out;
  3402. UA_Variant_init(&out);
  3403. UA_ByteString buf = UA_STRING("{\"Type\":14,\"Body\":\"00000001-0002-0003-0405-060708090A0B\"}");
  3404. // when
  3405. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3406. // then
  3407. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3408. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_GUID);
  3409. ck_assert_int_eq(((UA_Guid*)out.data)->data1, 1);
  3410. ck_assert_int_eq(((UA_Guid*)out.data)->data2, 2);
  3411. ck_assert_int_eq(((UA_Guid*)out.data)->data3, 3);
  3412. ck_assert_int_eq(((UA_Guid*)out.data)->data4[0], 4);
  3413. ck_assert_int_eq(((UA_Guid*)out.data)->data4[1], 5);
  3414. ck_assert_int_eq(((UA_Guid*)out.data)->data4[2], 6);
  3415. ck_assert_int_eq(((UA_Guid*)out.data)->data4[3], 7);
  3416. ck_assert_int_eq(((UA_Guid*)out.data)->data4[4], 8);
  3417. ck_assert_int_eq(((UA_Guid*)out.data)->data4[5], 9);
  3418. ck_assert_int_eq(((UA_Guid*)out.data)->data4[6], 10);
  3419. ck_assert_int_eq(((UA_Guid*)out.data)->data4[7], 11);
  3420. UA_Variant_deleteMembers(&out);
  3421. }
  3422. END_TEST
  3423. START_TEST(UA_Guid_lower_json_decode) {
  3424. UA_Variant out;
  3425. UA_Variant_init(&out);
  3426. UA_ByteString buf = UA_STRING("{\"Type\":14,\"Body\":\"00000001-0002-0003-0405-060708090a0b\"}");
  3427. // when
  3428. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3429. // then
  3430. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3431. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_GUID);
  3432. ck_assert_int_eq(((UA_Guid*)out.data)->data1, 1);
  3433. ck_assert_int_eq(((UA_Guid*)out.data)->data2, 2);
  3434. ck_assert_int_eq(((UA_Guid*)out.data)->data3, 3);
  3435. ck_assert_int_eq(((UA_Guid*)out.data)->data4[0], 4);
  3436. ck_assert_int_eq(((UA_Guid*)out.data)->data4[1], 5);
  3437. ck_assert_int_eq(((UA_Guid*)out.data)->data4[2], 6);
  3438. ck_assert_int_eq(((UA_Guid*)out.data)->data4[3], 7);
  3439. ck_assert_int_eq(((UA_Guid*)out.data)->data4[4], 8);
  3440. ck_assert_int_eq(((UA_Guid*)out.data)->data4[5], 9);
  3441. ck_assert_int_eq(((UA_Guid*)out.data)->data4[6], 10);
  3442. ck_assert_int_eq(((UA_Guid*)out.data)->data4[7], 11);
  3443. UA_Variant_deleteMembers(&out);
  3444. }
  3445. END_TEST
  3446. START_TEST(UA_Guid_tooShort_json_decode) {
  3447. UA_Variant out;
  3448. UA_Variant_init(&out);
  3449. UA_ByteString buf = UA_STRING("{\"Type\":14,\"Body\":\"00000001-00\"}");
  3450. // when
  3451. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3452. // then
  3453. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  3454. UA_Variant_deleteMembers(&out);
  3455. }
  3456. END_TEST
  3457. START_TEST(UA_Guid_tooLong_json_decode) {
  3458. UA_Variant out;
  3459. UA_Variant_init(&out);
  3460. UA_ByteString buf = UA_STRING("{\"Type\":14,\"Body\":\"00000001-0002-0003-0405-060708090A0B00000001\"}");
  3461. // when
  3462. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3463. // then
  3464. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  3465. UA_Variant_deleteMembers(&out);
  3466. }
  3467. END_TEST
  3468. START_TEST(UA_Guid_wrong_json_decode) {
  3469. UA_Variant out;
  3470. UA_Variant_init(&out);
  3471. UA_ByteString buf = UA_STRING("{\"Type\":14,\"Body\":\"00000=01-0002-0003-0405-060708090A0B\"}");
  3472. // when
  3473. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3474. // then
  3475. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  3476. UA_Variant_deleteMembers(&out);
  3477. }
  3478. END_TEST
  3479. /* ------Statuscode----------- */
  3480. START_TEST(UA_StatusCode_2_json_decode) {
  3481. UA_Variant out;
  3482. UA_Variant_init(&out);
  3483. UA_ByteString buf = UA_STRING("{\"Type\":19,\"Body\":2}");
  3484. // when
  3485. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3486. // then
  3487. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3488. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STATUSCODE);
  3489. ck_assert_uint_eq(*((UA_StatusCode*)out.data), 2);
  3490. UA_Variant_deleteMembers(&out);
  3491. }
  3492. END_TEST
  3493. START_TEST(UA_StatusCode_3_json_decode) {
  3494. UA_Variant out;
  3495. UA_Variant_init(&out);
  3496. UA_ByteString buf = UA_STRING("{\"Type\":19,\"Body\":222222222222222222222222222222222222}");
  3497. // when
  3498. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3499. // then
  3500. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  3501. UA_Variant_deleteMembers(&out);
  3502. }
  3503. END_TEST
  3504. START_TEST(UA_StatusCode_0_json_decode) {
  3505. UA_Variant out;
  3506. UA_Variant_init(&out);
  3507. UA_ByteString buf = UA_STRING("{\"Type\":19,\"Body\":0}");
  3508. // when
  3509. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3510. // then
  3511. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3512. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STATUSCODE);
  3513. ck_assert_uint_eq(*((UA_StatusCode*)out.data), 0);
  3514. UA_Variant_deleteMembers(&out);
  3515. }
  3516. END_TEST
  3517. /* ----------DateTime---------------- */
  3518. START_TEST(UA_DateTime_json_decode) {
  3519. // given
  3520. UA_DateTime out;
  3521. UA_DateTime_init(&out);
  3522. UA_ByteString buf = UA_STRING("\"1970-01-02T01:02:03.005Z\"");
  3523. // when
  3524. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DATETIME]);
  3525. // then
  3526. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3527. UA_DateTimeStruct dts = UA_DateTime_toStruct(out);
  3528. ck_assert_int_eq(dts.year, 1970);
  3529. ck_assert_int_eq(dts.month, 1);
  3530. ck_assert_int_eq(dts.day, 2);
  3531. ck_assert_int_eq(dts.hour, 1);
  3532. ck_assert_int_eq(dts.min, 2);
  3533. ck_assert_int_eq(dts.sec, 3);
  3534. ck_assert_int_eq(dts.milliSec, 5);
  3535. ck_assert_int_eq(dts.microSec, 0);
  3536. ck_assert_int_eq(dts.nanoSec, 0);
  3537. UA_DateTime_deleteMembers(&out);
  3538. }
  3539. END_TEST
  3540. START_TEST(UA_DateTime_micro_json_decode) {
  3541. // given
  3542. UA_DateTime out;
  3543. UA_DateTime_init(&out);
  3544. UA_ByteString buf = UA_STRING("\"1970-01-02T01:02:03.042Z\"");
  3545. // when
  3546. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DATETIME]);
  3547. // then
  3548. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3549. UA_DateTimeStruct dts = UA_DateTime_toStruct(out);
  3550. ck_assert_int_eq(dts.year, 1970);
  3551. ck_assert_int_eq(dts.month, 1);
  3552. ck_assert_int_eq(dts.day, 2);
  3553. ck_assert_int_eq(dts.hour, 1);
  3554. ck_assert_int_eq(dts.min, 2);
  3555. ck_assert_int_eq(dts.sec, 3);
  3556. ck_assert_int_eq(dts.milliSec, 42);
  3557. ck_assert_int_eq(dts.microSec, 0);
  3558. ck_assert_int_eq(dts.nanoSec, 0);
  3559. UA_DateTime_deleteMembers(&out);
  3560. }
  3561. END_TEST
  3562. /* ---------------QualifiedName----------------------- */
  3563. START_TEST(UA_QualifiedName_json_decode) {
  3564. // given
  3565. UA_QualifiedName out;
  3566. UA_QualifiedName_init(&out);
  3567. UA_ByteString buf = UA_STRING("{\"Name\":\"derName\",\"Uri\":1}");
  3568. // when
  3569. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]);
  3570. // then
  3571. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3572. ck_assert_int_eq(out.name.length, 7);
  3573. ck_assert_int_eq(out.name.data[1], 'e');
  3574. ck_assert_int_eq(out.name.data[6], 'e');
  3575. ck_assert_int_eq(out.namespaceIndex, 1);
  3576. UA_QualifiedName_deleteMembers(&out);
  3577. }
  3578. END_TEST
  3579. START_TEST(UA_QualifiedName_null_json_decode) {
  3580. UA_Variant out;
  3581. UA_Variant_init(&out);
  3582. UA_ByteString buf = UA_STRING("{\"Type\":20,\"Body\":null}");
  3583. // when
  3584. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3585. // then
  3586. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3587. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_QUALIFIEDNAME);
  3588. ck_assert_ptr_eq(out.data, NULL);
  3589. UA_Variant_deleteMembers(&out);
  3590. }
  3591. END_TEST
  3592. /* --------LocalizedText------------ */
  3593. START_TEST(UA_LocalizedText_json_decode) {
  3594. // given
  3595. UA_LocalizedText out;
  3596. UA_LocalizedText_init(&out);
  3597. UA_ByteString buf = UA_STRING("{\"Locale\":\"t1\",\"Text\":\"t2\"}");
  3598. // when
  3599. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
  3600. // then
  3601. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3602. ck_assert_int_eq(out.locale.data[0], 't');
  3603. ck_assert_int_eq(out.text.data[0], 't');
  3604. ck_assert_int_eq(out.locale.data[1], '1');
  3605. ck_assert_int_eq(out.text.data[1], '2');
  3606. UA_LocalizedText_deleteMembers(&out);
  3607. }
  3608. END_TEST
  3609. START_TEST(UA_LocalizedText_missing_json_decode) {
  3610. // given
  3611. UA_LocalizedText out;
  3612. UA_LocalizedText_init(&out);
  3613. UA_ByteString buf = UA_STRING("{\"Locale\":\"t1\"}");
  3614. // when
  3615. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
  3616. // then
  3617. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3618. ck_assert_int_eq(out.locale.length, 2);
  3619. ck_assert_int_eq(out.locale.data[0], 't');
  3620. ck_assert_int_eq(out.locale.data[1], '1');
  3621. ck_assert_ptr_eq(out.text.data, NULL);
  3622. ck_assert_int_eq(out.text.length, 0);
  3623. UA_LocalizedText_deleteMembers(&out);
  3624. }
  3625. END_TEST
  3626. START_TEST(UA_LocalizedText_null_json_decode) {
  3627. UA_Variant out;
  3628. UA_Variant_init(&out);
  3629. UA_ByteString buf = UA_STRING("{\"Type\":21,\"Body\":null}");
  3630. // when
  3631. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3632. // then
  3633. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3634. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_LOCALIZEDTEXT);
  3635. ck_assert_ptr_eq(out.data, NULL);
  3636. UA_Variant_deleteMembers(&out);
  3637. }
  3638. END_TEST
  3639. START_TEST(UA_ViewDescription_json_decode) {
  3640. // given
  3641. UA_ViewDescription out;
  3642. UA_ViewDescription_init(&out);
  3643. UA_ByteString buf = UA_STRING("{\"Timestamp\":\"1970-01-15T06:56:07Z\",\"ViewVersion\":1236,\"ViewId\":{\"Id\":\"00000009-0002-027C-F3BF-BB7BEEFEEFBE\",\"IdType\":2}}");
  3644. // when
  3645. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]);
  3646. // then
  3647. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3648. ck_assert_int_eq(out.viewVersion, 1236);
  3649. ck_assert_int_eq(out.viewId.identifierType, UA_NODEIDTYPE_GUID);
  3650. UA_DateTimeStruct dts = UA_DateTime_toStruct(out.timestamp);
  3651. ck_assert_int_eq(dts.year, 1970);
  3652. ck_assert_int_eq(dts.month, 1);
  3653. ck_assert_int_eq(dts.day, 15);
  3654. ck_assert_int_eq(dts.hour, 6);
  3655. ck_assert_int_eq(dts.min, 56);
  3656. ck_assert_int_eq(dts.sec, 7);
  3657. ck_assert_int_eq(dts.milliSec, 0);
  3658. ck_assert_int_eq(dts.microSec, 0);
  3659. ck_assert_int_eq(dts.nanoSec, 0);
  3660. ck_assert_int_eq(out.viewId.identifier.guid.data1, 9);
  3661. ck_assert_int_eq(out.viewId.identifier.guid.data2, 2);
  3662. UA_ViewDescription_deleteMembers(&out);
  3663. }
  3664. END_TEST
  3665. /* -----------------NodeId----------------------------- */
  3666. START_TEST(UA_NodeId_Nummeric_json_decode) {
  3667. // given
  3668. UA_NodeId out;
  3669. UA_NodeId_init(&out);
  3670. UA_ByteString buf = UA_STRING("{\"Id\":42}");
  3671. // when
  3672. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_NODEID]);
  3673. // then
  3674. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3675. ck_assert_int_eq(out.identifier.numeric, 42);
  3676. ck_assert_int_eq(out.namespaceIndex, 0);
  3677. ck_assert_int_eq(out.identifierType, UA_NODEIDTYPE_NUMERIC);
  3678. UA_NodeId_deleteMembers(&out);
  3679. }
  3680. END_TEST
  3681. START_TEST(UA_NodeId_Nummeric_Namespace_json_decode) {
  3682. // given
  3683. UA_NodeId out;
  3684. UA_NodeId_init(&out);
  3685. UA_ByteString buf = UA_STRING("{\"Id\":42,\"Namespace\":123}");
  3686. // when
  3687. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_NODEID]);
  3688. // then
  3689. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3690. ck_assert_int_eq(out.identifier.numeric, 42);
  3691. ck_assert_int_eq(out.namespaceIndex, 123);
  3692. ck_assert_int_eq(out.identifierType, UA_NODEIDTYPE_NUMERIC);
  3693. UA_NodeId_deleteMembers(&out);
  3694. }
  3695. END_TEST
  3696. START_TEST(UA_NodeId_String_json_decode) {
  3697. // given
  3698. UA_NodeId out;
  3699. UA_NodeId_init(&out);
  3700. UA_ByteString buf = UA_STRING("{\"IdType\":1,\"Id\":\"test123\"}");
  3701. // when
  3702. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_NODEID]);
  3703. // then
  3704. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3705. ck_assert_int_eq(out.identifier.string.length, 7);
  3706. ck_assert_int_eq(out.identifier.string.data[0], 't');
  3707. ck_assert_int_eq(out.identifier.string.data[1], 'e');
  3708. ck_assert_int_eq(out.identifier.string.data[2], 's');
  3709. ck_assert_int_eq(out.identifier.string.data[3], 't');
  3710. ck_assert_int_eq(out.identifier.string.data[4], '1');
  3711. ck_assert_int_eq(out.identifier.string.data[5], '2');
  3712. ck_assert_int_eq(out.identifier.string.data[6], '3');
  3713. ck_assert_int_eq(out.namespaceIndex, 0);
  3714. ck_assert_int_eq(out.identifierType, UA_NODEIDTYPE_STRING);
  3715. UA_NodeId_deleteMembers(&out);
  3716. }
  3717. END_TEST
  3718. START_TEST(UA_NodeId_Guid_json_decode) {
  3719. // given
  3720. UA_NodeId out;
  3721. UA_NodeId_init(&out);
  3722. UA_ByteString buf = UA_STRING("{\"IdType\":2,\"Id\":\"00000001-0002-0003-0405-060708090A0B\"}");
  3723. // when
  3724. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_NODEID]);
  3725. // then
  3726. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3727. ck_assert_int_eq(out.namespaceIndex, 0);
  3728. ck_assert_int_eq(out.identifierType, UA_NODEIDTYPE_GUID);
  3729. ck_assert_int_eq(out.identifier.guid.data1, 1);
  3730. ck_assert_int_eq(out.identifier.guid.data2, 2);
  3731. ck_assert_int_eq(out.identifier.guid.data3, 3);
  3732. ck_assert_int_eq(out.identifier.guid.data4[0], 4);
  3733. ck_assert_int_eq(out.identifier.guid.data4[1], 5);
  3734. ck_assert_int_eq(out.identifier.guid.data4[2], 6);
  3735. ck_assert_int_eq(out.identifier.guid.data4[3], 7);
  3736. ck_assert_int_eq(out.identifier.guid.data4[4], 8);
  3737. ck_assert_int_eq(out.identifier.guid.data4[5], 9);
  3738. ck_assert_int_eq(out.identifier.guid.data4[6], 10);
  3739. ck_assert_int_eq(out.identifier.guid.data4[7], 11);
  3740. UA_NodeId_deleteMembers(&out);
  3741. }
  3742. END_TEST
  3743. START_TEST(UA_NodeId_ByteString_json_decode) {
  3744. // given
  3745. UA_NodeId out;
  3746. UA_NodeId_init(&out);
  3747. UA_ByteString buf = UA_STRING("{\"IdType\":3,\"Id\":\"YXNkZmFzZGY=\"}");
  3748. // when
  3749. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_NODEID]);
  3750. // then
  3751. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3752. ck_assert_int_eq(out.namespaceIndex, 0);
  3753. ck_assert_int_eq(out.identifierType, UA_NODEIDTYPE_BYTESTRING);
  3754. ck_assert_int_eq(out.identifier.byteString.length, 8);
  3755. ck_assert_int_eq(out.identifier.byteString.data[0], 'a');
  3756. ck_assert_int_eq(out.identifier.byteString.data[1], 's');
  3757. ck_assert_int_eq(out.identifier.byteString.data[2], 'd');
  3758. ck_assert_int_eq(out.identifier.byteString.data[3], 'f');
  3759. ck_assert_int_eq(out.identifier.byteString.data[4], 'a');
  3760. ck_assert_int_eq(out.identifier.byteString.data[5], 's');
  3761. ck_assert_int_eq(out.identifier.byteString.data[6], 'd');
  3762. ck_assert_int_eq(out.identifier.byteString.data[7], 'f');
  3763. UA_NodeId_deleteMembers(&out);
  3764. }
  3765. END_TEST
  3766. /* -----------------------ExpandedNodeId---------------------------*/
  3767. START_TEST(UA_ExpandedNodeId_Nummeric_json_decode) {
  3768. // given
  3769. UA_ExpandedNodeId out;
  3770. UA_ExpandedNodeId_init(&out);
  3771. UA_ByteString buf = UA_STRING("{\"Id\":42}");
  3772. // when
  3773. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
  3774. // then
  3775. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3776. ck_assert_int_eq(out.nodeId.identifier.numeric, 42);
  3777. ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_NUMERIC);
  3778. ck_assert_ptr_eq(out.namespaceUri.data, NULL);
  3779. ck_assert_int_eq(out.namespaceUri.length, 0);
  3780. ck_assert_int_eq(out.serverIndex, 0);
  3781. UA_ExpandedNodeId_deleteMembers(&out);
  3782. }
  3783. END_TEST
  3784. START_TEST(UA_ExpandedNodeId_String_json_decode) {
  3785. // given
  3786. UA_ExpandedNodeId out;
  3787. UA_ExpandedNodeId_init(&out);
  3788. UA_ByteString buf = UA_STRING("{\"IdType\":1,\"Id\":\"test\"}");
  3789. // when
  3790. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
  3791. // then
  3792. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3793. ck_assert_int_eq(out.nodeId.identifier.string.length, 4);
  3794. ck_assert_int_eq(out.nodeId.identifier.string.data[0], 't');
  3795. ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_STRING);
  3796. ck_assert_ptr_eq(out.namespaceUri.data, NULL);
  3797. ck_assert_int_eq(out.namespaceUri.length, 0);
  3798. ck_assert_int_eq(out.serverIndex, 0);
  3799. UA_ExpandedNodeId_deleteMembers(&out);
  3800. }
  3801. END_TEST
  3802. START_TEST(UA_ExpandedNodeId_String_Namespace_json_decode) {
  3803. // given
  3804. UA_ExpandedNodeId out;
  3805. UA_ExpandedNodeId_init(&out);
  3806. UA_ByteString buf = UA_STRING("{\"IdType\":1,\"Id\":\"test\",\"Namespace\":\"abcdef\"}");
  3807. // when
  3808. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
  3809. // then
  3810. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3811. ck_assert_int_eq(out.nodeId.identifier.string.length, 4);
  3812. ck_assert_int_eq(out.nodeId.identifier.string.data[0], 't');
  3813. ck_assert_int_eq(out.nodeId.identifier.string.data[1], 'e');
  3814. ck_assert_int_eq(out.nodeId.identifier.string.data[2], 's');
  3815. ck_assert_int_eq(out.nodeId.identifier.string.data[3], 't');
  3816. ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_STRING);
  3817. ck_assert_int_eq(out.namespaceUri.length, 6);
  3818. ck_assert_int_eq(out.namespaceUri.data[0], 'a');
  3819. ck_assert_int_eq(out.namespaceUri.data[1], 'b');
  3820. ck_assert_int_eq(out.namespaceUri.data[2], 'c');
  3821. ck_assert_int_eq(out.namespaceUri.data[3], 'd');
  3822. ck_assert_int_eq(out.namespaceUri.data[4], 'e');
  3823. ck_assert_int_eq(out.namespaceUri.data[5], 'f');
  3824. ck_assert_int_eq(out.serverIndex, 0);
  3825. UA_ExpandedNodeId_deleteMembers(&out);
  3826. }
  3827. END_TEST
  3828. START_TEST(UA_ExpandedNodeId_String_NamespaceAsIndex_json_decode) {
  3829. // given
  3830. UA_ExpandedNodeId out;
  3831. UA_ExpandedNodeId_init(&out);
  3832. UA_ByteString buf = UA_STRING("{\"IdType\":1,\"Id\":\"test\",\"Namespace\":42}");
  3833. // when
  3834. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
  3835. // then
  3836. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3837. ck_assert_int_eq(out.nodeId.identifier.string.length, 4);
  3838. ck_assert_int_eq(out.nodeId.identifier.string.data[0], 't');
  3839. ck_assert_int_eq(out.nodeId.identifier.string.data[1], 'e');
  3840. ck_assert_int_eq(out.nodeId.identifier.string.data[2], 's');
  3841. ck_assert_int_eq(out.nodeId.identifier.string.data[3], 't');
  3842. ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_STRING);
  3843. ck_assert_int_eq(out.namespaceUri.length, 0);
  3844. ck_assert_ptr_eq(out.namespaceUri.data, NULL);
  3845. ck_assert_int_eq(out.nodeId.namespaceIndex, 42);
  3846. ck_assert_int_eq(out.serverIndex, 0);
  3847. UA_ExpandedNodeId_deleteMembers(&out);
  3848. }
  3849. END_TEST
  3850. START_TEST(UA_ExpandedNodeId_String_Namespace_ServerUri_json_decode) {
  3851. // given
  3852. UA_ExpandedNodeId out;
  3853. UA_ExpandedNodeId_init(&out);
  3854. UA_ByteString buf = UA_STRING("{\"IdType\":1,\"Id\":\"test\",\"Namespace\":\"test\",\"ServerUri\":13}");
  3855. // when
  3856. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
  3857. // then
  3858. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3859. ck_assert_int_eq(out.nodeId.identifier.string.length, 4);
  3860. ck_assert_int_eq(out.nodeId.identifier.string.data[0], 't');
  3861. ck_assert_int_eq(out.nodeId.identifier.string.data[1], 'e');
  3862. ck_assert_int_eq(out.nodeId.identifier.string.data[2], 's');
  3863. ck_assert_int_eq(out.nodeId.identifier.string.data[3], 't');
  3864. ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_STRING);
  3865. ck_assert_int_eq(out.serverIndex, 13);
  3866. ck_assert_int_eq(out.namespaceUri.data[0], 't');
  3867. ck_assert_int_eq(out.namespaceUri.data[1], 'e');
  3868. ck_assert_int_eq(out.namespaceUri.data[2], 's');
  3869. ck_assert_int_eq(out.namespaceUri.data[3], 't');
  3870. UA_ExpandedNodeId_deleteMembers(&out);
  3871. }
  3872. END_TEST
  3873. START_TEST(UA_ExpandedNodeId_ByteString_json_decode) {
  3874. // given
  3875. UA_ExpandedNodeId out;
  3876. UA_ExpandedNodeId_init(&out);
  3877. UA_ByteString buf = UA_STRING("{\"IdType\":3,\"Id\":\"YXNkZmFzZGY=\",\"Namespace\":\"test\",\"ServerUri\":13}");
  3878. // when
  3879. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
  3880. // then
  3881. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3882. ck_assert_int_eq(out.nodeId.identifier.string.length, 8);
  3883. ck_assert_int_eq(out.nodeId.identifier.string.data[0], 'a');
  3884. ck_assert_int_eq(out.nodeId.identifier.string.data[1], 's');
  3885. ck_assert_int_eq(out.nodeId.identifier.string.data[2], 'd');
  3886. ck_assert_int_eq(out.nodeId.identifier.string.data[3], 'f');
  3887. ck_assert_int_eq(out.nodeId.identifier.string.data[4], 'a');
  3888. ck_assert_int_eq(out.nodeId.identifier.string.data[5], 's');
  3889. ck_assert_int_eq(out.nodeId.identifier.string.data[6], 'd');
  3890. ck_assert_int_eq(out.nodeId.identifier.string.data[7], 'f');
  3891. ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_BYTESTRING);
  3892. ck_assert_int_eq(out.serverIndex, 13);
  3893. ck_assert_int_eq(out.namespaceUri.data[0], 't');
  3894. ck_assert_int_eq(out.namespaceUri.data[1], 'e');
  3895. ck_assert_int_eq(out.namespaceUri.data[2], 's');
  3896. ck_assert_int_eq(out.namespaceUri.data[3], 't');
  3897. UA_ExpandedNodeId_deleteMembers(&out);
  3898. }
  3899. END_TEST
  3900. START_TEST(UA_DiagnosticInfo_json_decode) {
  3901. // given
  3902. UA_DiagnosticInfo out;
  3903. UA_DiagnosticInfo_init(&out);
  3904. out.innerDiagnosticInfo = NULL;
  3905. UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,"
  3906. "\"LocalizedText\":14,"
  3907. "\"Locale\":12,"
  3908. "\"AdditionalInfo\":\"additionalInfo\","
  3909. "\"InnerStatusCode\":2155216896,"
  3910. "\"InnerDiagnosticInfo\":{\"AdditionalInfo\":\"INNER ADDITION INFO\"}}");
  3911. // when
  3912. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DIAGNOSTICINFO]);
  3913. // then
  3914. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3915. ck_assert_int_eq(out.locale, 12);
  3916. ck_assert_int_eq(out.symbolicId, 13);
  3917. ck_assert_int_eq(out.localizedText, 14);
  3918. ck_assert_int_eq(out.innerStatusCode, 2155216896);
  3919. ck_assert_int_eq(out.additionalInfo.length, 14);
  3920. ck_assert_int_eq(out.innerDiagnosticInfo->additionalInfo.length, 19);
  3921. UA_DiagnosticInfo_deleteMembers(&out);
  3922. }
  3923. END_TEST
  3924. START_TEST(UA_DiagnosticInfo_null_json_decode) {
  3925. UA_Variant out;
  3926. UA_Variant_init(&out);
  3927. UA_ByteString buf = UA_STRING("{\"Type\":25,\"Body\":null}");
  3928. // when
  3929. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3930. // then
  3931. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3932. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_DIAGNOSTICINFO);
  3933. ck_assert_ptr_eq(out.data, NULL);
  3934. //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasAdditionalInfo, 0);
  3935. //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasInnerDiagnosticInfo, 0);
  3936. //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasInnerStatusCode, 0);
  3937. //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasLocale, 0);
  3938. //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasLocalizedText, 0);
  3939. //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasNamespaceUri, 0);
  3940. //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasSymbolicId, 0);
  3941. UA_Variant_deleteMembers(&out);
  3942. }
  3943. END_TEST
  3944. /* --------------------DataValue--------------------------- */
  3945. START_TEST(UA_DataValue_json_decode) {
  3946. // given
  3947. UA_DataValue out;
  3948. UA_DataValue_init(&out);
  3949. UA_ByteString buf = UA_STRING("{\"Value\":{\"Type\":1,\"Body\":true},\"Status\":2153250816,\"SourceTimestamp\":\"1970-01-15T06:56:07Z\",\"SourcePicoseconds\":0,\"ServerTimestamp\":\"1970-01-15T06:56:07Z\",\"ServerPicoseconds\":0}");
  3950. // when
  3951. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DATAVALUE]);
  3952. //UA_DiagnosticInfo inner = *out.innerDiagnosticInfo;
  3953. // then
  3954. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3955. ck_assert_int_eq(out.hasStatus, 1);
  3956. ck_assert_int_eq(out.hasServerPicoseconds, 1);
  3957. ck_assert_int_eq(out.hasServerTimestamp, 1);
  3958. ck_assert_int_eq(out.hasSourcePicoseconds, 1);
  3959. ck_assert_int_eq(out.hasSourceTimestamp, 1);
  3960. ck_assert_int_eq(out.hasValue, 1);
  3961. ck_assert_int_eq(out.status, 2153250816);
  3962. ck_assert_int_eq(out.value.type->typeIndex, 0);
  3963. ck_assert_int_eq((*((UA_Boolean*)out.value.data)), 1);
  3964. UA_DataValue_deleteMembers(&out);
  3965. }
  3966. END_TEST
  3967. START_TEST(UA_DataValueMissingFields_json_decode) {
  3968. // given
  3969. UA_DataValue out;
  3970. UA_DataValue_init(&out);
  3971. UA_ByteString buf = UA_STRING("{\"Value\":{\"Type\":1,\"Body\":true}}");
  3972. // when
  3973. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DATAVALUE]);
  3974. //UA_DiagnosticInfo inner = *out.innerDiagnosticInfo;
  3975. // then
  3976. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3977. ck_assert_int_eq(out.hasStatus, 0);
  3978. ck_assert_int_eq(out.hasServerPicoseconds, 0);
  3979. ck_assert_int_eq(out.hasServerTimestamp, 0);
  3980. ck_assert_int_eq(out.hasSourcePicoseconds, 0);
  3981. ck_assert_int_eq(out.hasSourceTimestamp, 0);
  3982. ck_assert_int_eq(out.hasValue, 1);
  3983. UA_DataValue_deleteMembers(&out);
  3984. }
  3985. END_TEST
  3986. START_TEST(UA_DataValue_null_json_decode) {
  3987. // given
  3988. UA_Variant out;
  3989. UA_Variant_init(&out);
  3990. UA_ByteString buf = UA_STRING("{\"Type\":23,\"Body\":null}");
  3991. // when
  3992. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3993. //UA_DiagnosticInfo inner = *out.innerDiagnosticInfo;
  3994. // then
  3995. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3996. ck_assert_ptr_eq(out.data, NULL);
  3997. UA_Variant_deleteMembers(&out);
  3998. }
  3999. END_TEST
  4000. /*----------------------ExtensionObject------------------------*/
  4001. START_TEST(UA_ExtensionObject_json_decode) {
  4002. // given
  4003. UA_ExtensionObject out;
  4004. UA_ExtensionObject_init(&out);
  4005. UA_ByteString buf = UA_STRING("{\"TypeId\":{\"Id\":1},\"Body\":true}");
  4006. // when
  4007. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]);
  4008. // then
  4009. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4010. ck_assert_int_eq(out.encoding, UA_EXTENSIONOBJECT_DECODED);
  4011. ck_assert_int_eq(*((UA_Boolean*)out.content.decoded.data), UA_TRUE);
  4012. ck_assert_int_eq(out.content.decoded.type->typeIndex, UA_TYPES_BOOLEAN);
  4013. UA_ExtensionObject_deleteMembers(&out);
  4014. }
  4015. END_TEST
  4016. START_TEST(UA_ExtensionObject_EncodedByteString_json_decode) {
  4017. // given
  4018. UA_ExtensionObject out;
  4019. UA_ExtensionObject_init(&out);
  4020. UA_ByteString buf = UA_STRING("{\"Encoding\":1,\"TypeId\":{\"Id\":42},\"Body\":\"YXNkZmFzZGY=\"}");
  4021. // when
  4022. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]);
  4023. // then
  4024. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4025. ck_assert_int_eq(out.encoding, UA_EXTENSIONOBJECT_ENCODED_BYTESTRING);
  4026. //TODO: Not base64 decoded, correct?
  4027. ck_assert_int_eq(out.content.encoded.body.data[0], 'Y');
  4028. ck_assert_int_eq(out.content.encoded.body.data[0], 'Y');
  4029. ck_assert_int_eq(out.content.encoded.body.data[1], 'X');
  4030. ck_assert_int_eq(out.content.encoded.body.data[2], 'N');
  4031. ck_assert_int_eq(out.content.encoded.body.data[3], 'k');
  4032. ck_assert_int_eq(out.content.encoded.body.data[4], 'Z');
  4033. ck_assert_int_eq(out.content.encoded.body.data[5], 'm');
  4034. ck_assert_int_eq(out.content.encoded.body.data[6], 'F');
  4035. ck_assert_int_eq(out.content.encoded.typeId.identifier.numeric, 42);
  4036. UA_ExtensionObject_deleteMembers(&out);
  4037. }
  4038. END_TEST
  4039. START_TEST(UA_ExtensionObject_EncodedXml_json_decode) {
  4040. // given
  4041. UA_ExtensionObject out;
  4042. UA_ExtensionObject_init(&out);
  4043. UA_ByteString buf = UA_STRING("{\"Encoding\":2,\"TypeId\":{\"Id\":42},\"Body\":\"<Element></Element>\"}");
  4044. // when
  4045. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]);
  4046. // then
  4047. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4048. ck_assert_int_eq(out.encoding, UA_EXTENSIONOBJECT_ENCODED_XML);
  4049. ck_assert_int_eq(out.content.encoded.body.data[0], '<');
  4050. ck_assert_int_eq(out.content.encoded.body.data[1], 'E');
  4051. ck_assert_int_eq(out.content.encoded.body.data[2], 'l');
  4052. ck_assert_int_eq(out.content.encoded.body.data[3], 'e');
  4053. ck_assert_int_eq(out.content.encoded.typeId.identifier.numeric, 42);
  4054. UA_ExtensionObject_deleteMembers(&out);
  4055. }
  4056. END_TEST
  4057. START_TEST(UA_ExtensionObject_Unkown_json_decode) {
  4058. // given
  4059. UA_ExtensionObject out;
  4060. UA_ExtensionObject_init(&out);
  4061. UA_ByteString buf = UA_STRING("{\"TypeId\":{\"Id\":4711},\"Body\":{\"unknown\":\"body\",\"saveas\":\"Bytestring\"}}");
  4062. // when
  4063. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]);
  4064. // then
  4065. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4066. ck_assert_int_eq(out.encoding, UA_EXTENSIONOBJECT_ENCODED_BYTESTRING);
  4067. ck_assert_int_eq(out.content.encoded.typeId.identifier.numeric, 4711);
  4068. //{"unknown":"body","saveas":"Bytestring"}Q
  4069. ck_assert_int_eq(out.content.encoded.body.length, 40);
  4070. ck_assert_int_eq(out.content.encoded.body.data[2], 'u');
  4071. ck_assert_int_eq(out.content.encoded.body.data[3], 'n');
  4072. ck_assert_int_eq(out.content.encoded.body.data[4], 'k');
  4073. ck_assert_int_eq(out.content.encoded.body.data[5], 'n');
  4074. ck_assert_int_eq(out.content.encoded.body.data[6], 'o');
  4075. ck_assert_int_eq(out.content.encoded.body.data[7], 'w');
  4076. UA_ExtensionObject_deleteMembers(&out);
  4077. }
  4078. END_TEST
  4079. /* ----------------- Variant ---------------------*/
  4080. START_TEST(UA_VariantBool_json_decode) {
  4081. // given
  4082. UA_Variant out;
  4083. UA_Variant_init(&out);
  4084. UA_ByteString buf = UA_STRING("{\"Type\":1,\"Body\":false}");
  4085. // when
  4086. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4087. // then
  4088. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4089. ck_assert_int_eq(out.type->typeIndex, 0);
  4090. ck_assert_uint_eq(*((UA_Boolean*)out.data), 0);
  4091. UA_Variant_deleteMembers(&out);
  4092. }
  4093. END_TEST
  4094. START_TEST(UA_VariantBoolNull_json_decode) {
  4095. // given
  4096. UA_Variant out;
  4097. UA_Variant_init(&out);
  4098. UA_ByteString buf = UA_STRING("{\"Type\":1,\"Body\":null}");
  4099. // when
  4100. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4101. // then
  4102. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  4103. UA_Variant_deleteMembers(&out);
  4104. }
  4105. END_TEST
  4106. START_TEST(UA_VariantStringArray_json_decode) {
  4107. // given
  4108. UA_Variant *out = UA_Variant_new();
  4109. UA_Variant_init(out);
  4110. UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\"],\"Dimension\":[2,4]}");
  4111. //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}");
  4112. // when
  4113. UA_StatusCode retval = UA_decodeJson(&buf, out, &UA_TYPES[UA_TYPES_VARIANT]);
  4114. UA_String *testArray;
  4115. testArray = (UA_String*)(out->data);
  4116. // then
  4117. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4118. ck_assert_int_eq((char)testArray[0].data[0], '1');
  4119. ck_assert_int_eq((char)testArray[1].data[0], '2');
  4120. ck_assert_int_eq((char)testArray[2].data[0], '3');
  4121. ck_assert_int_eq((char)testArray[3].data[0], '4');
  4122. ck_assert_int_eq((char)testArray[4].data[0], '5');
  4123. ck_assert_int_eq((char)testArray[5].data[0], '6');
  4124. ck_assert_int_eq((char)testArray[6].data[0], '7');
  4125. ck_assert_int_eq((char)testArray[7].data[0], '8');
  4126. ck_assert_int_eq(out->arrayDimensionsSize, 2);
  4127. ck_assert_int_eq(out->arrayDimensions[0], 2);
  4128. ck_assert_int_eq(out->arrayDimensions[1], 4);
  4129. ck_assert_int_eq(out->arrayLength, 8);
  4130. ck_assert_int_eq(out->type->typeIndex, 11);
  4131. UA_Variant_delete(out);
  4132. }
  4133. END_TEST
  4134. START_TEST(UA_VariantStringArrayNull_json_decode) {
  4135. // given
  4136. UA_Variant out;
  4137. UA_Variant_init(&out);
  4138. UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":[null, null, null, null, null, null, null, null],\"Dimension\":[2,4]}");
  4139. //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}");
  4140. // when
  4141. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4142. UA_String *testArray;
  4143. testArray = (UA_String*)(out.data);
  4144. // then
  4145. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4146. ck_assert_ptr_eq(testArray[0].data, NULL);
  4147. ck_assert_ptr_eq(testArray[1].data, NULL);
  4148. ck_assert_ptr_eq(testArray[2].data, NULL);
  4149. ck_assert_ptr_eq(testArray[3].data, NULL);
  4150. ck_assert_ptr_eq(testArray[4].data, NULL);
  4151. ck_assert_ptr_eq(testArray[5].data, NULL);
  4152. ck_assert_ptr_eq(testArray[6].data, NULL);
  4153. ck_assert_ptr_eq(testArray[7].data, NULL);
  4154. ck_assert_int_eq(out.arrayDimensionsSize, 2);
  4155. ck_assert_int_eq(out.arrayDimensions[0], 2);
  4156. ck_assert_int_eq(out.arrayDimensions[1], 4);
  4157. ck_assert_int_eq(out.arrayLength, 8);
  4158. ck_assert_int_eq(out.type->typeIndex, 11);
  4159. UA_Variant_deleteMembers(&out);
  4160. }
  4161. END_TEST
  4162. START_TEST(UA_VariantLocalizedTextArrayNull_json_decode) {
  4163. // given
  4164. UA_Variant out;
  4165. UA_Variant_init(&out);
  4166. UA_ByteString buf = UA_STRING("{\"Type\":21,\"Body\":[null, null, null, null, null, null, null, null],\"Dimension\":[2,4]}");
  4167. //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}");
  4168. // when
  4169. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4170. UA_LocalizedText *testArray;
  4171. testArray = (UA_LocalizedText*)(out.data);
  4172. // then
  4173. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4174. ck_assert_ptr_eq(testArray[0].locale.data, NULL);
  4175. ck_assert_ptr_eq(testArray[1].locale.data, NULL);
  4176. ck_assert_ptr_eq(testArray[2].locale.data, NULL);
  4177. ck_assert_ptr_eq(testArray[3].locale.data, NULL);
  4178. ck_assert_ptr_eq(testArray[4].locale.data, NULL);
  4179. ck_assert_ptr_eq(testArray[5].locale.data, NULL);
  4180. ck_assert_ptr_eq(testArray[6].locale.data, NULL);
  4181. ck_assert_ptr_eq(testArray[7].locale.data, NULL);
  4182. ck_assert_int_eq(out.arrayDimensionsSize, 2);
  4183. ck_assert_int_eq(out.arrayDimensions[0], 2);
  4184. ck_assert_int_eq(out.arrayDimensions[1], 4);
  4185. ck_assert_int_eq(out.arrayLength, 8);
  4186. ck_assert_int_eq(out.type->typeIndex, 20);
  4187. UA_Variant_deleteMembers(&out);
  4188. }
  4189. END_TEST
  4190. START_TEST(UA_VariantVariantArrayNull_json_decode) {
  4191. // given
  4192. UA_Variant out;
  4193. UA_Variant_init(&out);
  4194. UA_ByteString buf = UA_STRING("{\"Type\":22,\"Body\":[null, null, null, null, null, null, null, null],\"Dimension\":[2,4]}");
  4195. //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}");
  4196. // when
  4197. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4198. UA_Variant *testArray;
  4199. testArray = (UA_Variant*)(out.data);
  4200. // then
  4201. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4202. ck_assert(!testArray[0].type);
  4203. ck_assert_int_eq(out.arrayDimensionsSize, 2);
  4204. ck_assert_int_eq(out.arrayDimensions[0], 2);
  4205. ck_assert_int_eq(out.arrayDimensions[1], 4);
  4206. ck_assert_int_eq(out.arrayLength, 8);
  4207. ck_assert_int_eq(out.type->typeIndex, 21);
  4208. UA_Variant_deleteMembers(&out);
  4209. }
  4210. END_TEST
  4211. START_TEST(UA_VariantVariantArrayEmpty_json_decode) {
  4212. // given
  4213. UA_Variant out;
  4214. UA_Variant_init(&out);
  4215. UA_ByteString buf = UA_STRING("{\"Type\":22,\"Body\":[]}");
  4216. // when
  4217. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4218. // then
  4219. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4220. ck_assert_int_eq(out.arrayLength, 0);
  4221. ck_assert_ptr_eq(out.data, UA_EMPTY_ARRAY_SENTINEL);
  4222. UA_Variant_deleteMembers(&out);
  4223. }
  4224. END_TEST
  4225. START_TEST(UA_VariantStringArray_WithoutDimension_json_decode) {
  4226. // given
  4227. UA_Variant out;
  4228. UA_Variant_init(&out);
  4229. UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\"]}");
  4230. // when
  4231. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4232. UA_String *testArray;
  4233. testArray = (UA_String*)(out.data);
  4234. // then
  4235. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4236. ck_assert_int_eq((char)testArray[0].data[0], '1');
  4237. ck_assert_int_eq((char)testArray[1].data[0], '2');
  4238. ck_assert_int_eq((char)testArray[2].data[0], '3');
  4239. ck_assert_int_eq((char)testArray[3].data[0], '4');
  4240. ck_assert_int_eq((char)testArray[4].data[0], '5');
  4241. ck_assert_int_eq((char)testArray[5].data[0], '6');
  4242. ck_assert_int_eq((char)testArray[6].data[0], '7');
  4243. ck_assert_int_eq((char)testArray[7].data[0], '8');
  4244. ck_assert_int_eq(out.arrayDimensionsSize, 0);
  4245. ck_assert_int_eq(out.arrayLength, 8);
  4246. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING);
  4247. UA_Variant_deleteMembers(&out);
  4248. }
  4249. END_TEST
  4250. START_TEST(UA_Variant_BooleanArray_json_decode) {
  4251. // given
  4252. UA_Variant out;
  4253. UA_Variant_init(&out);
  4254. UA_ByteString buf = UA_STRING("{\"Type\":1,\"Body\":[true, false, true]}");
  4255. // when
  4256. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4257. UA_Boolean *testArray;
  4258. testArray = (UA_Boolean*)(out.data);
  4259. // then
  4260. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4261. //decoded as False
  4262. ck_assert_int_eq(testArray[0], 1);
  4263. ck_assert_int_eq(testArray[1], 0);
  4264. ck_assert_int_eq(testArray[2], 1);
  4265. ck_assert_int_eq(out.arrayDimensionsSize, 0);
  4266. ck_assert_int_eq(out.arrayLength, 3);
  4267. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_BOOLEAN);
  4268. UA_Variant_deleteMembers(&out);
  4269. }
  4270. END_TEST
  4271. START_TEST(UA_Variant_bad1_json_decode) {
  4272. // given
  4273. UA_Variant out;
  4274. UA_Variant_init(&out);
  4275. UA_ByteString buf = UA_STRING("{\"Type\":1,\"Body\":\"\"}");
  4276. // when
  4277. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4278. // then
  4279. UA_Variant_deleteMembers(&out);
  4280. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  4281. }
  4282. END_TEST
  4283. START_TEST(UA_Variant_ExtensionObjectWrap_json_decode) {
  4284. // given
  4285. UA_Variant out;
  4286. UA_Variant_init(&out);
  4287. UA_ByteString buf = UA_STRING("{\"Type\":22,\"Body\":{\"TypeId\":{\"Id\":511},\"Body\":{\"ViewId\":{\"Id\":99999},\"Timestamp\":\"1970-01-15T06:56:07.000Z\",\"ViewVersion\":1236}}}");
  4288. // when
  4289. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4290. // then
  4291. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4292. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_VIEWDESCRIPTION);
  4293. UA_ViewDescription *vd = (UA_ViewDescription*)out.data;
  4294. ck_assert_int_eq(vd->viewId.identifier.numeric, 99999);
  4295. ck_assert_int_eq(vd->viewVersion, 1236);
  4296. UA_Variant_deleteMembers(&out);
  4297. }
  4298. END_TEST
  4299. START_TEST(UA_duplicate_json_decode) {
  4300. // given
  4301. UA_Variant out;
  4302. UA_Variant_init(&out);
  4303. UA_ByteString buf = UA_STRING("{\"Type\":1, \"Body\":false, \"Type\":1}");
  4304. // when
  4305. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4306. // then
  4307. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  4308. UA_Variant_deleteMembers(&out);
  4309. }
  4310. END_TEST
  4311. START_TEST(UA_wrongBoolean_json_decode) {
  4312. // given
  4313. UA_Variant out;
  4314. UA_Variant_init(&out);
  4315. UA_ByteString buf = UA_STRING("{\"Type\":1, \"Body\":\"asdfaaaaaaaaaaaaaaaaaaaa\"}");
  4316. // when
  4317. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4318. // then
  4319. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  4320. UA_Variant_deleteMembers(&out);
  4321. }
  4322. END_TEST
  4323. START_TEST(UA_DataTypeAttributes_json_decode) {
  4324. // given
  4325. UA_DataTypeAttributes out;
  4326. UA_DataTypeAttributes_init(&out);
  4327. UA_ByteString buf = UA_STRING("{\"SpecifiedAttributes\":1,"
  4328. "\"DisplayName\":{\"Locale\":\"t1\",\"Text\":\"t2\"},"
  4329. "\"Description\":{\"Locale\":\"t3\",\"Text\":\"t4\"},"
  4330. "\"WriteMask\":53,"
  4331. "\"UserWriteMask\":63,"
  4332. "\"IsAbstract\":false}");
  4333. // when
  4334. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES]);
  4335. // then
  4336. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4337. ck_assert_int_eq(out.isAbstract, 0);
  4338. ck_assert_int_eq(out.writeMask, 53);
  4339. ck_assert_int_eq(out.userWriteMask, 63);
  4340. ck_assert_int_eq(out.specifiedAttributes, 1);
  4341. ck_assert_int_eq(out.displayName.locale.data[1], '1');
  4342. ck_assert_int_eq(out.displayName.text.data[1], '2');
  4343. ck_assert_int_eq(out.description.locale.data[1], '3');
  4344. ck_assert_int_eq(out.description.text.data[1], '4');
  4345. UA_DataTypeAttributes_deleteMembers(&out);
  4346. }
  4347. END_TEST
  4348. //-------------------MISC heap free test cases--------------------------
  4349. START_TEST(UA_VariantStringArrayBad_shouldFreeArray_json_decode) {
  4350. // given
  4351. UA_Variant out;
  4352. UA_Variant_init(&out); //not a string V
  4353. UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":[\"1\",\"2\",true,\"4\",\"5\",\"6\",\"7\",\"8\"],\"Dimension\":[2,4]}");
  4354. //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}");
  4355. // when
  4356. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4357. // then
  4358. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  4359. UA_Variant_deleteMembers(&out);
  4360. }
  4361. END_TEST
  4362. START_TEST(UA_VariantFuzzer1_json_decode) {
  4363. // given
  4364. UA_Variant out;
  4365. UA_Variant_init(&out);
  4366. UA_ByteString buf = UA_STRING("\\x0a{\"Type\",\"Bode\",\"Body\":{\"se\":}}");
  4367. //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}");
  4368. // when
  4369. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4370. // then
  4371. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  4372. UA_Variant_deleteMembers(&out);
  4373. }
  4374. END_TEST
  4375. //This test succeeds: Double will be parsed to zero if unparsable
  4376. // TODO: Verify against the spec
  4377. START_TEST(UA_VariantFuzzer2_json_decode) {
  4378. // given
  4379. UA_Variant out;
  4380. UA_Variant_init(&out);
  4381. UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":2E+}");
  4382. //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}");
  4383. // when
  4384. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4385. // then
  4386. ck_assert(retval == UA_STATUSCODE_GOOD || retval == UA_STATUSCODE_BADDECODINGERROR);
  4387. UA_Variant_deleteMembers(&out);
  4388. }
  4389. END_TEST
  4390. START_TEST(UA_Variant_Bad_Type_decode) {
  4391. UA_Variant out;
  4392. UA_Variant_init(&out);
  4393. UA_ByteString buf = UA_STRING("{\"Type\":1000,\"Body\":0}");
  4394. // when
  4395. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4396. // then
  4397. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  4398. UA_Variant_deleteMembers(&out);
  4399. }
  4400. END_TEST
  4401. START_TEST(UA_Variant_Bad_Type2_decode) {
  4402. for(int i = 0; i < 100; i++){
  4403. UA_Variant out;
  4404. UA_Variant_init(&out);
  4405. char str[80];
  4406. sprintf(str, "{\"Type\":%d}", i);
  4407. UA_ByteString buf = UA_STRING(str);
  4408. // when
  4409. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4410. // then
  4411. ck_assert_int_eq(retval, retval);
  4412. UA_Variant_deleteMembers(&out);
  4413. }
  4414. }
  4415. END_TEST
  4416. START_TEST(UA_Variant_Null_decode) {
  4417. for(int i = 0; i < 100; i++){
  4418. UA_Variant out;
  4419. UA_Variant_init(&out);
  4420. char str[80];
  4421. sprintf(str, "{\"Type\":%d, \"Body:\":null}", i);
  4422. UA_ByteString buf = UA_STRING(str);
  4423. // when
  4424. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4425. // then
  4426. ck_assert_int_eq(retval, retval);
  4427. UA_Variant_deleteMembers(&out);
  4428. }
  4429. }
  4430. END_TEST
  4431. START_TEST(UA_Variant_Malformed_decode) {
  4432. for(int i = 0; i < 100; i++){
  4433. UA_Variant out;
  4434. UA_Variant_init(&out);
  4435. char str[80];
  4436. sprintf(str, "{\"Type\":%d, \"Body:\"}", i);
  4437. UA_ByteString buf = UA_STRING(str);
  4438. // when
  4439. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4440. // then
  4441. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  4442. UA_Variant_deleteMembers(&out);
  4443. }
  4444. }
  4445. END_TEST
  4446. START_TEST(UA_Variant_Malformed2_decode) {
  4447. UA_Variant out;
  4448. UA_Variant_init(&out);
  4449. char str[80];
  4450. sprintf(str, "{\"Type\":, \"Body:\"}");
  4451. UA_ByteString buf = UA_STRING(str);
  4452. // when
  4453. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4454. // then
  4455. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  4456. UA_Variant_deleteMembers(&out);
  4457. }
  4458. END_TEST
  4459. START_TEST(UA_JsonHelper) {
  4460. // given
  4461. CtxJson ctx;
  4462. memset(&ctx, 0, sizeof(ctx));
  4463. ck_assert_int_eq(writeJsonArrStart(&ctx), UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  4464. ck_assert_int_eq(writeJsonObjStart(&ctx), UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  4465. ck_assert_int_eq(writeJsonObjEnd(&ctx), UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  4466. ck_assert_int_eq(writeJsonArrEnd(&ctx), UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  4467. ck_assert_int_eq(writeJsonNull(&ctx), UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  4468. ctx.calcOnly = true;
  4469. ctx.end = (const UA_Byte*)(uintptr_t)SIZE_MAX;
  4470. ck_assert_int_eq(calcJsonArrStart(&ctx), UA_STATUSCODE_GOOD);
  4471. ck_assert_int_eq(calcJsonObjStart(&ctx), UA_STATUSCODE_GOOD);
  4472. ck_assert_int_eq(calcJsonObjEnd(&ctx), UA_STATUSCODE_GOOD);
  4473. ck_assert_int_eq(calcJsonArrEnd(&ctx), UA_STATUSCODE_GOOD);
  4474. }
  4475. END_TEST
  4476. static Suite *testSuite_builtin_json(void) {
  4477. Suite *s = suite_create("Built-in Data Types 62541-6 Json");
  4478. TCase *tc_json_encode = tcase_create("json_encode");
  4479. tcase_add_test(tc_json_encode, UA_Boolean_true_json_encode);
  4480. tcase_add_test(tc_json_encode, UA_Boolean_false_json_encode);
  4481. tcase_add_test(tc_json_encode, UA_Boolean_true_bufferTooSmall_json_encode);
  4482. tcase_add_test(tc_json_encode, UA_String_json_encode);
  4483. tcase_add_test(tc_json_encode, UA_String_Empty_json_encode);
  4484. tcase_add_test(tc_json_encode, UA_String_Null_json_encode);
  4485. tcase_add_test(tc_json_encode, UA_String_escapesimple_json_encode);
  4486. tcase_add_test(tc_json_encode, UA_String_escapeutf_json_encode);
  4487. tcase_add_test(tc_json_encode, UA_String_special_json_encode);
  4488. tcase_add_test(tc_json_encode, UA_Byte_Max_Number_json_encode);
  4489. tcase_add_test(tc_json_encode, UA_Byte_Min_Number_json_encode);
  4490. tcase_add_test(tc_json_encode, UA_Byte_smallbuf_Number_json_encode);
  4491. tcase_add_test(tc_json_encode, UA_SByte_Max_Number_json_encode);
  4492. tcase_add_test(tc_json_encode, UA_SByte_Min_Number_json_encode);
  4493. tcase_add_test(tc_json_encode, UA_SByte_Zero_Number_json_encode);
  4494. tcase_add_test(tc_json_encode, UA_SByte_smallbuf_Number_json_encode);
  4495. tcase_add_test(tc_json_encode, UA_UInt16_Max_Number_json_encode);
  4496. tcase_add_test(tc_json_encode, UA_UInt16_Min_Number_json_encode);
  4497. tcase_add_test(tc_json_encode, UA_UInt16_smallbuf_Number_json_encode);
  4498. tcase_add_test(tc_json_encode, UA_Int16_Max_Number_json_encode);
  4499. tcase_add_test(tc_json_encode, UA_Int16_Min_Number_json_encode);
  4500. tcase_add_test(tc_json_encode, UA_Int16_Zero_Number_json_encode);
  4501. tcase_add_test(tc_json_encode, UA_Int16_smallbuf_Number_json_encode);
  4502. tcase_add_test(tc_json_encode, UA_UInt32_Max_Number_json_encode);
  4503. tcase_add_test(tc_json_encode, UA_UInt32_Min_Number_json_encode);
  4504. tcase_add_test(tc_json_encode, UA_UInt32_smallbuf_Number_json_encode);
  4505. tcase_add_test(tc_json_encode, UA_Int32_Max_Number_json_encode);
  4506. tcase_add_test(tc_json_encode, UA_Int32_Min_Number_json_encode);
  4507. tcase_add_test(tc_json_encode, UA_Int32_Zero_Number_json_encode);
  4508. tcase_add_test(tc_json_encode, UA_Int32_smallbuf_Number_json_encode);
  4509. tcase_add_test(tc_json_encode, UA_UInt64_Max_Number_json_encode);
  4510. tcase_add_test(tc_json_encode, UA_UInt64_Min_Number_json_encode);
  4511. tcase_add_test(tc_json_encode, UA_UInt64_smallbuf_Number_json_encode);
  4512. tcase_add_test(tc_json_encode, UA_Int64_Max_Number_json_encode);
  4513. tcase_add_test(tc_json_encode, UA_Int64_Min_Number_json_encode);
  4514. tcase_add_test(tc_json_encode, UA_Int64_Zero_Number_json_encode);
  4515. tcase_add_test(tc_json_encode, UA_Int64_smallbuf_Number_json_encode);
  4516. //Double Float
  4517. tcase_add_test(tc_json_encode, UA_Double_json_encode);
  4518. tcase_add_test(tc_json_encode, UA_Double_onesmallest_json_encode);
  4519. tcase_add_test(tc_json_encode, UA_Double_pluszero_json_encode);
  4520. tcase_add_test(tc_json_encode, UA_Double_minuszero_json_encode);
  4521. tcase_add_test(tc_json_encode, UA_Double_plusInf_json_encode);
  4522. tcase_add_test(tc_json_encode, UA_Double_minusInf_json_encode);
  4523. tcase_add_test(tc_json_encode, UA_Double_nan_json_encode);
  4524. tcase_add_test(tc_json_encode, UA_Float_json_encode);
  4525. tcase_add_test(tc_json_encode, UA_Variant_Float_json_encode);
  4526. tcase_add_test(tc_json_encode, UA_Variant_DoubleInf_json_encode);
  4527. tcase_add_test(tc_json_encode, UA_Variant_DoubleNan_json_encode);
  4528. //LocalizedText
  4529. tcase_add_test(tc_json_encode, UA_LocText_json_encode);
  4530. tcase_add_test(tc_json_encode, UA_LocText_NonReversible_json_encode);
  4531. tcase_add_test(tc_json_encode, UA_LocText_smallBuffer_json_encode);
  4532. //Guid
  4533. tcase_add_test(tc_json_encode, UA_Guid_json_encode);
  4534. tcase_add_test(tc_json_encode, UA_Guid_smallbuf_json_encode);
  4535. //DateTime
  4536. tcase_add_test(tc_json_encode, UA_DateTime_json_encode);
  4537. tcase_add_test(tc_json_encode, UA_DateTime_with_nanoseconds_json_encode);
  4538. //StatusCode
  4539. tcase_add_test(tc_json_encode, UA_StatusCode_json_encode);
  4540. tcase_add_test(tc_json_encode, UA_StatusCode_nonReversible_json_encode);
  4541. tcase_add_test(tc_json_encode, UA_StatusCode_nonReversible_good_json_encode);
  4542. tcase_add_test(tc_json_encode, UA_StatusCode_smallbuf_json_encode);
  4543. //NodeId
  4544. tcase_add_test(tc_json_encode, UA_NodeId_Numeric_json_encode);
  4545. tcase_add_test(tc_json_encode, UA_NodeId_Numeric_Namespace_json_encode);
  4546. tcase_add_test(tc_json_encode, UA_NodeId_String_json_encode);
  4547. tcase_add_test(tc_json_encode, UA_NodeId_String_Namespace_json_encode);
  4548. tcase_add_test(tc_json_encode, UA_NodeId_Guid_json_encode);
  4549. tcase_add_test(tc_json_encode, UA_NodeId_Guid_Namespace_json_encode);
  4550. tcase_add_test(tc_json_encode, UA_NodeId_ByteString_json_encode);
  4551. tcase_add_test(tc_json_encode, UA_NodeId_ByteString_Namespace_json_encode);
  4552. tcase_add_test(tc_json_encode, UA_NodeId_NonReversible_Numeric_Namespace_json_encode);
  4553. //ExpandedNodeId
  4554. tcase_add_test(tc_json_encode, UA_ExpandedNodeId_json_encode);
  4555. tcase_add_test(tc_json_encode, UA_ExpandedNodeId_MissingNamespaceUri_json_encode);
  4556. tcase_add_test(tc_json_encode, UA_ExpandedNodeId_NonReversible_Ns1_json_encode);
  4557. tcase_add_test(tc_json_encode, UA_ExpandedNodeId_NonReversible_Namespace_json_encode);
  4558. tcase_add_test(tc_json_encode, UA_ExpandedNodeId_NonReversible_NamespaceUriGiven_json_encode);
  4559. //DiagnosticInfo
  4560. tcase_add_test(tc_json_encode, UA_DiagInfo_json_encode);
  4561. tcase_add_test(tc_json_encode, UA_DiagInfo_withInner_json_encode);
  4562. tcase_add_test(tc_json_encode, UA_DiagInfo_withTwoInner_json_encode);
  4563. tcase_add_test(tc_json_encode, UA_DiagInfo_noFields_json_encode);
  4564. tcase_add_test(tc_json_encode, UA_DiagInfo_smallBuffer_json_encode);
  4565. //ByteString
  4566. tcase_add_test(tc_json_encode, UA_ByteString_json_encode);
  4567. tcase_add_test(tc_json_encode, UA_ByteString2_json_encode);
  4568. tcase_add_test(tc_json_encode, UA_ByteString3_json_encode);
  4569. //QualifiedName
  4570. tcase_add_test(tc_json_encode, UA_QualName_json_encode);
  4571. tcase_add_test(tc_json_encode, UA_QualName_NonReversible_json_encode);
  4572. tcase_add_test(tc_json_encode, UA_QualName_NonReversible_Namespace_json_encode);
  4573. tcase_add_test(tc_json_encode, UA_QualName_NonReversible_NoNamespaceAsNumber_json_encode);
  4574. //Variant -REVERSIBLE-
  4575. tcase_add_test(tc_json_encode, UA_Variant_Bool_json_encode);
  4576. tcase_add_test(tc_json_encode, UA_Variant_Number_json_encode);
  4577. tcase_add_test(tc_json_encode, UA_Variant_Double_json_encode);
  4578. tcase_add_test(tc_json_encode, UA_Variant_Double2_json_encode);
  4579. tcase_add_test(tc_json_encode, UA_Variant_Double3_json_encode);
  4580. tcase_add_test(tc_json_encode, UA_Variant_NodeId_json_encode);
  4581. tcase_add_test(tc_json_encode, UA_Variant_LocText_json_encode);
  4582. tcase_add_test(tc_json_encode, UA_Variant_QualName_json_encode);
  4583. //Array
  4584. tcase_add_test(tc_json_encode, UA_Variant_Array_UInt16_json_encode);
  4585. tcase_add_test(tc_json_encode, UA_Variant_Array_Byte_json_encode);
  4586. tcase_add_test(tc_json_encode, UA_Variant_Array_String_json_encode);
  4587. //Matrix
  4588. tcase_add_test(tc_json_encode, UA_Variant_Matrix_UInt16_json_encode);
  4589. //Wrap
  4590. tcase_add_test(tc_json_encode, UA_Variant_Wrap_json_encode);
  4591. tcase_add_test(tc_json_encode, UA_Variant_Wrap_Array_json_encode);
  4592. //Variant -NON-REVERSIBLE-
  4593. tcase_add_test(tc_json_encode, UA_Variant_StatusCode_NonReversible_json_encode);
  4594. //Array
  4595. tcase_add_test(tc_json_encode, UA_Variant_Array_String_NonReversible_json_encode);
  4596. //Matrix
  4597. tcase_add_test(tc_json_encode, UA_Variant_Matrix_String_NonReversible_json_encode);
  4598. tcase_add_test(tc_json_encode, UA_Variant_Matrix_NodeId_NonReversible_json_encode);
  4599. //Wrap non reversible
  4600. tcase_add_test(tc_json_encode, UA_Variant_Wrap_Array_NonReversible_json_encode);
  4601. //ExtensionObject
  4602. tcase_add_test(tc_json_encode, UA_ExtensionObject_json_encode);
  4603. tcase_add_test(tc_json_encode, UA_ExtensionObject_xml_json_encode);
  4604. tcase_add_test(tc_json_encode, UA_ExtensionObject_byteString_json_encode);
  4605. tcase_add_test(tc_json_encode, UA_ExtensionObject_NonReversible_StatusCode_json_encode);
  4606. //DataValue
  4607. tcase_add_test(tc_json_encode, UA_DataValue_json_encode);
  4608. tcase_add_test(tc_json_encode, UA_DataValue_null_json_encode);
  4609. tcase_add_test(tc_json_encode, UA_MessageReadResponse_json_encode);
  4610. tcase_add_test(tc_json_encode, UA_ViewDescription_json_encode);
  4611. tcase_add_test(tc_json_encode, UA_WriteRequest_json_encode);
  4612. tcase_add_test(tc_json_encode, UA_VariableAttributes_json_encode);
  4613. suite_add_tcase(s, tc_json_encode);
  4614. TCase *tc_json_decode = tcase_create("json_decode");
  4615. tcase_add_test(tc_json_decode, UA_SByte_Min_json_decode);
  4616. tcase_add_test(tc_json_decode, UA_SByte_Max_json_decode);
  4617. tcase_add_test(tc_json_decode, UA_Byte_Min_json_decode);
  4618. tcase_add_test(tc_json_decode, UA_Byte_Max_json_decode);
  4619. tcase_add_test(tc_json_decode, UA_Int16_Min_json_decode);
  4620. tcase_add_test(tc_json_decode, UA_Int16_Max_json_decode);
  4621. tcase_add_test(tc_json_decode, UA_UInt16_Min_json_decode);
  4622. tcase_add_test(tc_json_decode, UA_UInt16_Max_json_decode);
  4623. tcase_add_test(tc_json_decode, UA_UInt32_Min_json_decode);
  4624. tcase_add_test(tc_json_decode, UA_UInt32_Max_json_decode);
  4625. tcase_add_test(tc_json_decode, UA_Int32_Min_json_decode);
  4626. tcase_add_test(tc_json_decode, UA_Int32_Max_json_decode);
  4627. tcase_add_test(tc_json_decode, UA_Int64_Min_json_decode);
  4628. tcase_add_test(tc_json_decode, UA_Int64_Max_json_decode);
  4629. tcase_add_test(tc_json_decode, UA_Int64_Overflow_json_decode);
  4630. tcase_add_test(tc_json_decode, UA_Int64_TooBig_json_decode);
  4631. tcase_add_test(tc_json_decode, UA_Int64_NoDigit_json_decode);
  4632. tcase_add_test(tc_json_decode, UA_UInt64_Min_json_decode);
  4633. tcase_add_test(tc_json_decode, UA_UInt64_Max_json_decode);
  4634. tcase_add_test(tc_json_decode, UA_UInt64_Overflow_json_decode);
  4635. tcase_add_test(tc_json_decode, UA_Float_json_decode);
  4636. tcase_add_test(tc_json_decode, UA_Float_json_one_decode);
  4637. tcase_add_test(tc_json_decode, UA_Float_json_inf_decode);
  4638. tcase_add_test(tc_json_decode, UA_Float_json_neginf_decode);
  4639. tcase_add_test(tc_json_decode, UA_Float_json_nan_decode);
  4640. tcase_add_test(tc_json_decode, UA_Float_json_negnan_decode);
  4641. tcase_add_test(tc_json_decode, UA_Double_json_decode);
  4642. tcase_add_test(tc_json_decode, UA_Double_one_json_decode);
  4643. tcase_add_test(tc_json_decode, UA_Double_corrupt_json_decode);
  4644. tcase_add_test(tc_json_decode, UA_Double_onepointsmallest_json_decode);
  4645. tcase_add_test(tc_json_decode, UA_Double_nan_json_decode);
  4646. tcase_add_test(tc_json_decode, UA_Double_negnan_json_decode);
  4647. tcase_add_test(tc_json_decode, UA_Double_negzero_json_decode);
  4648. tcase_add_test(tc_json_decode, UA_Double_zero_json_decode);
  4649. tcase_add_test(tc_json_decode, UA_Double_inf_json_decode);
  4650. tcase_add_test(tc_json_decode, UA_Double_neginf_json_decode);
  4651. //String
  4652. tcase_add_test(tc_json_decode, UA_String_json_decode);
  4653. tcase_add_test(tc_json_decode, UA_String_empty_json_decode);
  4654. tcase_add_test(tc_json_decode, UA_String_unescapeBS_json_decode);
  4655. tcase_add_test(tc_json_decode, UA_String_escape_unicode_json_decode);
  4656. tcase_add_test(tc_json_decode, UA_String_escape2_json_decode);
  4657. tcase_add_test(tc_json_decode, UA_String_surrogatePair_json_decode);
  4658. //ByteString
  4659. tcase_add_test(tc_json_decode, UA_ByteString_json_decode);
  4660. tcase_add_test(tc_json_decode, UA_ByteString_bad_json_decode);
  4661. tcase_add_test(tc_json_decode, UA_ByteString_null_json_decode);
  4662. //DateTime
  4663. tcase_add_test(tc_json_decode, UA_DateTime_json_decode);
  4664. tcase_add_test(tc_json_decode, UA_DateTime_micro_json_decode);
  4665. //Guid
  4666. tcase_add_test(tc_json_decode, UA_Guid_json_decode);
  4667. tcase_add_test(tc_json_decode, UA_Guid_lower_json_decode);
  4668. tcase_add_test(tc_json_decode, UA_Guid_tooShort_json_decode);
  4669. tcase_add_test(tc_json_decode, UA_Guid_tooLong_json_decode);
  4670. tcase_add_test(tc_json_decode, UA_Guid_wrong_json_decode);
  4671. //StatusCode
  4672. tcase_add_test(tc_json_decode, UA_StatusCode_2_json_decode);
  4673. tcase_add_test(tc_json_decode, UA_StatusCode_3_json_decode);
  4674. tcase_add_test(tc_json_decode, UA_StatusCode_0_json_decode);
  4675. //QualName
  4676. tcase_add_test(tc_json_decode, UA_QualifiedName_json_decode);
  4677. tcase_add_test(tc_json_decode, UA_QualifiedName_null_json_decode);
  4678. //LocalizedText
  4679. tcase_add_test(tc_json_decode, UA_LocalizedText_json_decode);
  4680. tcase_add_test(tc_json_decode, UA_LocalizedText_missing_json_decode);
  4681. tcase_add_test(tc_json_decode, UA_LocalizedText_null_json_decode);
  4682. //-NodeId-
  4683. tcase_add_test(tc_json_decode, UA_NodeId_Nummeric_json_decode);
  4684. tcase_add_test(tc_json_decode, UA_NodeId_Nummeric_Namespace_json_decode);
  4685. tcase_add_test(tc_json_decode, UA_NodeId_String_json_decode);
  4686. tcase_add_test(tc_json_decode, UA_NodeId_Guid_json_decode);
  4687. tcase_add_test(tc_json_decode, UA_NodeId_ByteString_json_decode);
  4688. //expandednodeid
  4689. tcase_add_test(tc_json_decode, UA_ExpandedNodeId_Nummeric_json_decode);
  4690. tcase_add_test(tc_json_decode, UA_ExpandedNodeId_String_json_decode);
  4691. tcase_add_test(tc_json_decode, UA_ExpandedNodeId_String_Namespace_json_decode);
  4692. tcase_add_test(tc_json_decode, UA_ExpandedNodeId_String_NamespaceAsIndex_json_decode);
  4693. tcase_add_test(tc_json_decode, UA_ExpandedNodeId_String_Namespace_ServerUri_json_decode);
  4694. tcase_add_test(tc_json_decode, UA_ExpandedNodeId_ByteString_json_decode);
  4695. //Diaginfo
  4696. tcase_add_test(tc_json_decode, UA_DiagnosticInfo_json_decode);
  4697. tcase_add_test(tc_json_decode, UA_DiagnosticInfo_null_json_decode);
  4698. //Variant
  4699. tcase_add_test(tc_json_decode, UA_VariantBool_json_decode);
  4700. tcase_add_test(tc_json_decode, UA_VariantBoolNull_json_decode);
  4701. tcase_add_test(tc_json_decode, UA_VariantStringArray_json_decode);
  4702. tcase_add_test(tc_json_decode, UA_VariantStringArrayNull_json_decode);
  4703. tcase_add_test(tc_json_decode, UA_VariantLocalizedTextArrayNull_json_decode);
  4704. tcase_add_test(tc_json_decode, UA_VariantVariantArrayNull_json_decode);
  4705. tcase_add_test(tc_json_decode, UA_VariantVariantArrayEmpty_json_decode);
  4706. tcase_add_test(tc_json_decode, UA_VariantStringArray_WithoutDimension_json_decode);
  4707. tcase_add_test(tc_json_decode, UA_Variant_BooleanArray_json_decode);
  4708. tcase_add_test(tc_json_decode, UA_Variant_bad1_json_decode);
  4709. tcase_add_test(tc_json_decode, UA_Variant_ExtensionObjectWrap_json_decode);
  4710. //DataValue
  4711. tcase_add_test(tc_json_decode, UA_DataValue_json_decode);
  4712. tcase_add_test(tc_json_decode, UA_DataValueMissingFields_json_decode);
  4713. tcase_add_test(tc_json_decode, UA_DataValue_null_json_decode);
  4714. //extensionobject
  4715. tcase_add_test(tc_json_decode, UA_ExtensionObject_json_decode);
  4716. tcase_add_test(tc_json_decode, UA_ExtensionObject_EncodedByteString_json_decode);
  4717. tcase_add_test(tc_json_decode, UA_ExtensionObject_EncodedXml_json_decode);
  4718. tcase_add_test(tc_json_decode, UA_ExtensionObject_Unkown_json_decode);
  4719. //Others
  4720. tcase_add_test(tc_json_decode, UA_duplicate_json_decode);
  4721. tcase_add_test(tc_json_decode, UA_wrongBoolean_json_decode);
  4722. tcase_add_test(tc_json_decode, UA_ViewDescription_json_decode);
  4723. tcase_add_test(tc_json_decode, UA_DataTypeAttributes_json_decode);
  4724. tcase_add_test(tc_json_decode, UA_VariantStringArrayBad_shouldFreeArray_json_decode);
  4725. tcase_add_test(tc_json_decode, UA_VariantFuzzer1_json_decode);
  4726. tcase_add_test(tc_json_decode, UA_VariantFuzzer2_json_decode);
  4727. tcase_add_test(tc_json_decode, UA_Variant_Bad_Type_decode);
  4728. tcase_add_test(tc_json_decode, UA_Variant_Bad_Type2_decode);
  4729. tcase_add_test(tc_json_decode, UA_Variant_Null_decode);
  4730. tcase_add_test(tc_json_decode, UA_Variant_Malformed_decode);
  4731. tcase_add_test(tc_json_decode, UA_Variant_Malformed2_decode);
  4732. suite_add_tcase(s, tc_json_decode);
  4733. TCase *tc_json_helper = tcase_create("json_helper");
  4734. tcase_add_test(tc_json_decode, UA_JsonHelper);
  4735. suite_add_tcase(s, tc_json_helper);
  4736. return s;
  4737. }
  4738. int main(void) {
  4739. int number_failed = 0;
  4740. Suite *s;
  4741. SRunner *sr;
  4742. s = testSuite_builtin_json();
  4743. sr = srunner_create(s);
  4744. srunner_set_fork_status(sr, CK_NOFORK);
  4745. srunner_run_all(sr, CK_NORMAL);
  4746. number_failed += srunner_ntests_failed(sr);
  4747. srunner_free(sr);
  4748. return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
  4749. }