check_types_builtin_json.c 201 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017
  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 <stdio.h>
  5. #include <stdlib.h>
  6. #include <math.h>
  7. #include <float.h>
  8. #include "ua_types.h"
  9. #include "ua_types_encoding_binary.h"
  10. #include "ua_types_encoding_json.h"
  11. #include "ua_types_generated.h"
  12. #include "ua_types_generated_handling.h"
  13. #include "ua_types_generated_encoding_binary.h"
  14. #include "ua_util.h"
  15. #include "check.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:07.000Z\"";
  984. ck_assert_str_eq(result, (char*)buf.data);
  985. UA_ByteString_deleteMembers(&buf);
  986. UA_DateTime_delete(src);
  987. }
  988. END_TEST
  989. /* ------------------------Statuscode--------------------------------- */
  990. START_TEST(UA_StatusCode_json_encode) {
  991. UA_StatusCode *src = UA_StatusCode_new();
  992. *src = UA_STATUSCODE_BADAGGREGATECONFIGURATIONREJECTED;
  993. const UA_DataType *type = &UA_TYPES[UA_TYPES_STATUSCODE];
  994. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  995. UA_ByteString buf;
  996. UA_ByteString_allocBuffer(&buf, size+1);
  997. UA_Byte *bufPos = &buf.data[0];
  998. const UA_Byte *bufEnd = &buf.data[size+1];
  999. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1000. *bufPos = 0;
  1001. // then
  1002. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1003. char* result = "2161770496";
  1004. ck_assert_str_eq(result, (char*)buf.data);
  1005. UA_ByteString_deleteMembers(&buf);
  1006. UA_StatusCode_delete(src);
  1007. }
  1008. END_TEST
  1009. START_TEST(UA_StatusCode_nonReversible_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_FALSE);
  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_FALSE);
  1019. *bufPos = 0;
  1020. // then
  1021. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1022. char* result = "{\"Code\":2161770496,\"Symbol\":\"BadAggregateConfigurationRejected\"}";
  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_good_json_encode) {
  1029. UA_StatusCode *src = UA_StatusCode_new();
  1030. *src = UA_STATUSCODE_GOOD;
  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 = "null";
  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_smallbuf_json_encode) {
  1048. UA_StatusCode *src = UA_StatusCode_new();
  1049. *src = UA_STATUSCODE_BADAGGREGATECONFIGURATIONREJECTED;
  1050. const UA_DataType *type = &UA_TYPES[UA_TYPES_STATUSCODE];
  1051. UA_ByteString buf;
  1052. UA_ByteString_allocBuffer(&buf, 1);
  1053. UA_Byte *bufPos = &buf.data[0];
  1054. const UA_Byte *bufEnd = &buf.data[1];
  1055. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
  1056. // then
  1057. ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  1058. UA_ByteString_deleteMembers(&buf);
  1059. UA_StatusCode_delete(src);
  1060. }
  1061. END_TEST
  1062. /* -------------------------------NodeId--------------------------------*/
  1063. /* Numeric */
  1064. START_TEST(UA_NodeId_Numeric_json_encode) {
  1065. UA_NodeId *src = UA_NodeId_new();
  1066. *src = UA_NODEID_NUMERIC(0, 5555);
  1067. const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
  1068. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1069. UA_ByteString buf;
  1070. UA_ByteString_allocBuffer(&buf, size+1);
  1071. UA_Byte *bufPos = &buf.data[0];
  1072. const UA_Byte *bufEnd = &buf.data[size+1];
  1073. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1074. *bufPos = 0;
  1075. // then
  1076. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1077. char* result = "{\"Id\":5555}";
  1078. ck_assert_str_eq(result, (char*)buf.data);
  1079. UA_ByteString_deleteMembers(&buf);
  1080. UA_NodeId_delete(src);
  1081. }
  1082. END_TEST
  1083. START_TEST(UA_NodeId_Numeric_Namespace_json_encode) {
  1084. UA_NodeId *src = UA_NodeId_new();
  1085. *src = UA_NODEID_NUMERIC(4, 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,\"Namespace\":4}";
  1097. ck_assert_str_eq(result, (char*)buf.data);
  1098. UA_ByteString_deleteMembers(&buf);
  1099. UA_NodeId_delete(src);
  1100. }
  1101. END_TEST
  1102. /* String */
  1103. START_TEST(UA_NodeId_String_json_encode) {
  1104. UA_NodeId *src = UA_NodeId_new();
  1105. *src = UA_NODEID_STRING_ALLOC(0, "foobar");
  1106. const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
  1107. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1108. UA_ByteString buf;
  1109. UA_ByteString_allocBuffer(&buf, size+1);
  1110. UA_Byte *bufPos = &buf.data[0];
  1111. const UA_Byte *bufEnd = &buf.data[size+1];
  1112. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1113. *bufPos = 0;
  1114. // then
  1115. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1116. char* result = "{\"IdType\":1,\"Id\":\"foobar\"}";
  1117. ck_assert_str_eq(result, (char*)buf.data);
  1118. UA_ByteString_deleteMembers(&buf);
  1119. UA_NodeId_delete(src);
  1120. }
  1121. END_TEST
  1122. START_TEST(UA_NodeId_String_Namespace_json_encode) {
  1123. UA_NodeId *src = UA_NodeId_new();
  1124. *src = UA_NODEID_STRING_ALLOC(5, "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\",\"Namespace\":5}";
  1136. ck_assert_str_eq(result, (char*)buf.data);
  1137. UA_ByteString_deleteMembers(&buf);
  1138. UA_NodeId_delete(src);
  1139. }
  1140. END_TEST
  1141. /* Guid */
  1142. START_TEST(UA_NodeId_Guid_json_encode) {
  1143. UA_NodeId *src = UA_NodeId_new();
  1144. UA_NodeId_init(src);
  1145. UA_Guid g = {3, 9, 10, {8, 7, 6, 5, 4, 3, 2, 1}};
  1146. *src = UA_NODEID_GUID(0, g);
  1147. const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
  1148. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1149. UA_ByteString buf;
  1150. UA_ByteString_allocBuffer(&buf, size+1);
  1151. UA_Byte *bufPos = &buf.data[0];
  1152. const UA_Byte *bufEnd = &buf.data[size+1];
  1153. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1154. *bufPos = 0;
  1155. // then
  1156. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1157. char* result = "{\"IdType\":2,\"Id\":\"00000003-0009-000A-0807-060504030201\"}";
  1158. ck_assert_str_eq(result, (char*)buf.data);
  1159. UA_ByteString_deleteMembers(&buf);
  1160. UA_NodeId_delete(src);
  1161. }
  1162. END_TEST
  1163. START_TEST(UA_NodeId_Guid_Namespace_json_encode) {
  1164. UA_NodeId *src = UA_NodeId_new();
  1165. UA_Guid g = {3, 9, 10, {8, 7, 6, 5, 4, 3, 2, 1}};
  1166. *src = UA_NODEID_GUID(5, g);
  1167. const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
  1168. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1169. UA_ByteString buf;
  1170. // {"IdType":2,"Id":"00000003-0009-000A-0807-060504030201","Namespace":5}
  1171. ck_assert_int_eq(size, 70);
  1172. UA_ByteString_allocBuffer(&buf, size+1);
  1173. UA_Byte *bufPos = &buf.data[0];
  1174. const UA_Byte *bufEnd = &buf.data[size+1];
  1175. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1176. *bufPos = 0;
  1177. // then
  1178. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1179. char* result = "{\"IdType\":2,\"Id\":\"00000003-0009-000A-0807-060504030201\",\"Namespace\":5}";
  1180. ck_assert_str_eq(result, (char*)buf.data);
  1181. UA_ByteString_deleteMembers(&buf);
  1182. UA_NodeId_delete(src);
  1183. }
  1184. END_TEST
  1185. /* ByteString */
  1186. START_TEST(UA_NodeId_ByteString_json_encode) {
  1187. UA_NodeId *src = UA_NodeId_new();
  1188. *src = UA_NODEID_BYTESTRING_ALLOC(0, "asdfasdf");
  1189. const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
  1190. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1191. UA_ByteString buf;
  1192. UA_ByteString_allocBuffer(&buf, size+1);
  1193. UA_Byte *bufPos = &buf.data[0];
  1194. const UA_Byte *bufEnd = &buf.data[size+1];
  1195. //{"IdType":3,"Id":"YXNkZmFzZGY="}
  1196. ck_assert_int_eq(size, 32);
  1197. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1198. *bufPos = 0;
  1199. // then
  1200. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1201. char* result = "{\"IdType\":3,\"Id\":\"YXNkZmFzZGY=\"}";
  1202. ck_assert_str_eq(result, (char*)buf.data);
  1203. UA_ByteString_deleteMembers(&buf);
  1204. UA_NodeId_delete(src);
  1205. }
  1206. END_TEST
  1207. START_TEST(UA_NodeId_ByteString_Namespace_json_encode) {
  1208. UA_NodeId *src = UA_NodeId_new();
  1209. *src = UA_NODEID_BYTESTRING_ALLOC(5, "asdfasdf");
  1210. const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
  1211. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1212. UA_ByteString buf;
  1213. UA_ByteString_allocBuffer(&buf, size+1);
  1214. UA_Byte *bufPos = &buf.data[0];
  1215. const UA_Byte *bufEnd = &buf.data[size+1];
  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=\",\"Namespace\":5}";
  1221. ck_assert_str_eq(result, (char*)buf.data);
  1222. UA_ByteString_deleteMembers(&buf);
  1223. UA_NodeId_delete(src);
  1224. }
  1225. END_TEST
  1226. /* Non-reversible, Namespace */
  1227. START_TEST(UA_NodeId_NonReversible_Numeric_Namespace_json_encode) {
  1228. UA_NodeId *src = UA_NodeId_new();
  1229. *src = UA_NODEID_NUMERIC(2, 5555);
  1230. const UA_DataType *type = &UA_TYPES[UA_TYPES_NODEID];
  1231. UA_String namespaces[3] = {UA_STRING("ns0"),UA_STRING("ns1"),UA_STRING("ns2")};
  1232. size_t size = UA_calcSizeJson((void *) src, type, namespaces, 3, NULL, 0, UA_FALSE);
  1233. ck_assert_int_ne(size, 0);
  1234. UA_ByteString buf;
  1235. UA_ByteString_allocBuffer(&buf, size+1);
  1236. UA_Byte *bufPos = &buf.data[0];
  1237. const UA_Byte *bufEnd = &buf.data[size+1];
  1238. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, namespaces, 3, NULL, 0, UA_FALSE);
  1239. *bufPos = 0;
  1240. // then
  1241. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1242. char* result = "{\"Id\":5555,\"Namespace\":\"ns2\"}";
  1243. ck_assert_str_eq(result, (char*)buf.data);
  1244. UA_ByteString_deleteMembers(&buf);
  1245. UA_NodeId_delete(src);
  1246. }
  1247. END_TEST
  1248. /* --------------------Diagnostic Info------------------------- */
  1249. START_TEST(UA_DiagInfo_json_encode) {
  1250. UA_DiagnosticInfo *src = UA_DiagnosticInfo_new();
  1251. UA_DiagnosticInfo_init(src);
  1252. src->hasAdditionalInfo = UA_TRUE;
  1253. src->hasInnerDiagnosticInfo = UA_FALSE;
  1254. src->hasInnerStatusCode = UA_TRUE;
  1255. src->hasLocale = UA_TRUE;
  1256. src->hasSymbolicId = UA_TRUE;
  1257. src->hasLocalizedText = UA_TRUE;
  1258. src->hasNamespaceUri = UA_TRUE;
  1259. UA_StatusCode statusCode = UA_STATUSCODE_BADARGUMENTSMISSING;
  1260. src->additionalInfo = UA_STRING_ALLOC("additionalInfo");
  1261. src->innerStatusCode = statusCode;
  1262. src->locale = 12;
  1263. src->symbolicId = 13;
  1264. src->localizedText = 14;
  1265. src->namespaceUri = 15;
  1266. const UA_DataType *type = &UA_TYPES[UA_TYPES_DIAGNOSTICINFO];
  1267. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1268. UA_ByteString buf;
  1269. UA_ByteString_allocBuffer(&buf, size+1);
  1270. UA_Byte *bufPos = &buf.data[0];
  1271. const UA_Byte *bufEnd = &buf.data[size+1];
  1272. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1273. *bufPos = 0;
  1274. // then
  1275. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1276. char* result = "{\"SymbolicId\":13,\"NamespaceUri\":15,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}";
  1277. ck_assert_str_eq(result, (char*)buf.data);
  1278. UA_ByteString_deleteMembers(&buf);
  1279. UA_DiagnosticInfo_delete(src);
  1280. }
  1281. END_TEST
  1282. START_TEST(UA_DiagInfo_withInner_json_encode) {
  1283. UA_DiagnosticInfo *innerDiag = UA_DiagnosticInfo_new();
  1284. UA_DiagnosticInfo_init(innerDiag);
  1285. innerDiag->hasAdditionalInfo = UA_TRUE;
  1286. innerDiag->additionalInfo = UA_STRING_ALLOC("INNER ADDITION INFO");
  1287. innerDiag->hasInnerDiagnosticInfo = UA_FALSE;
  1288. innerDiag->hasInnerStatusCode = UA_FALSE;
  1289. innerDiag->hasLocale = UA_FALSE;
  1290. innerDiag->hasSymbolicId = UA_FALSE;
  1291. innerDiag->hasLocalizedText = UA_FALSE;
  1292. innerDiag->hasNamespaceUri = UA_FALSE;
  1293. UA_DiagnosticInfo *src = UA_DiagnosticInfo_new();
  1294. UA_DiagnosticInfo_init(src);
  1295. src->hasAdditionalInfo = UA_TRUE;
  1296. src->hasInnerDiagnosticInfo = UA_TRUE;
  1297. src->hasInnerStatusCode = UA_TRUE;
  1298. src->hasLocale = UA_TRUE;
  1299. src->hasSymbolicId = UA_TRUE;
  1300. src->hasLocalizedText = UA_TRUE;
  1301. src->hasNamespaceUri = UA_FALSE;
  1302. UA_StatusCode statusCode = UA_STATUSCODE_BADARGUMENTSMISSING;
  1303. src->additionalInfo = UA_STRING_ALLOC("additionalInfo");
  1304. src->innerDiagnosticInfo = innerDiag;
  1305. src->innerStatusCode = statusCode;
  1306. src->locale = 12;
  1307. src->symbolicId = 13;
  1308. src->localizedText = 14;
  1309. const UA_DataType *type = &UA_TYPES[UA_TYPES_DIAGNOSTICINFO];
  1310. UA_ByteString buf;
  1311. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1312. UA_ByteString_allocBuffer(&buf, size+1);
  1313. UA_Byte *bufPos = &buf.data[0];
  1314. const UA_Byte *bufEnd = &buf.data[size+1];
  1315. //{"SymbolicId":13,"LocalizedText":14,"Locale":12,"AdditionalInfo":"additionalInfo","InnerStatusCode":2155216896,"InnerDiagnosticInfo":{"AdditionalInfo":"INNER ADDITION INFO"}}
  1316. ck_assert_int_eq(size, 174);
  1317. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1318. *bufPos = 0;
  1319. // then
  1320. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1321. char* result = "{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896,\"InnerDiagnosticInfo\":{\"AdditionalInfo\":\"INNER ADDITION INFO\"}}";
  1322. ck_assert_str_eq(result, (char*)buf.data);
  1323. UA_ByteString_deleteMembers(&buf);
  1324. UA_DiagnosticInfo_delete(src);
  1325. }
  1326. END_TEST
  1327. START_TEST(UA_DiagInfo_withTwoInner_json_encode) {
  1328. UA_DiagnosticInfo *innerDiag2 = UA_DiagnosticInfo_new();
  1329. UA_DiagnosticInfo_init(innerDiag2);
  1330. innerDiag2->hasAdditionalInfo = UA_TRUE;
  1331. innerDiag2->additionalInfo = UA_STRING_ALLOC("INNER ADDITION INFO2");
  1332. innerDiag2->hasInnerDiagnosticInfo = UA_FALSE;
  1333. innerDiag2->hasInnerStatusCode = UA_FALSE;
  1334. innerDiag2->hasLocale = UA_FALSE;
  1335. innerDiag2->hasSymbolicId = UA_FALSE;
  1336. innerDiag2->hasLocalizedText = UA_FALSE;
  1337. innerDiag2->hasNamespaceUri = UA_FALSE;
  1338. UA_DiagnosticInfo *innerDiag = UA_DiagnosticInfo_new();
  1339. UA_DiagnosticInfo_init(innerDiag);
  1340. innerDiag->hasAdditionalInfo = UA_TRUE;
  1341. innerDiag->additionalInfo = UA_STRING_ALLOC("INNER ADDITION INFO");
  1342. innerDiag->hasInnerDiagnosticInfo = UA_TRUE;
  1343. innerDiag->innerDiagnosticInfo = innerDiag2;
  1344. innerDiag->hasInnerStatusCode = UA_FALSE;
  1345. innerDiag->hasLocale = UA_FALSE;
  1346. innerDiag->hasSymbolicId = UA_FALSE;
  1347. innerDiag->hasLocalizedText = UA_FALSE;
  1348. innerDiag->hasNamespaceUri = UA_FALSE;
  1349. UA_DiagnosticInfo *src = UA_DiagnosticInfo_new();
  1350. UA_DiagnosticInfo_init(src);
  1351. src->hasAdditionalInfo = UA_TRUE;
  1352. src->hasInnerDiagnosticInfo = UA_TRUE;
  1353. src->hasInnerStatusCode = UA_TRUE;
  1354. src->hasLocale = UA_TRUE;
  1355. src->hasSymbolicId = UA_TRUE;
  1356. src->hasLocalizedText = UA_TRUE;
  1357. src->hasNamespaceUri = UA_FALSE;
  1358. UA_StatusCode statusCode = UA_STATUSCODE_BADARGUMENTSMISSING;
  1359. src->additionalInfo = UA_STRING_ALLOC("additionalInfo");
  1360. src->innerDiagnosticInfo = innerDiag;
  1361. src->innerStatusCode = statusCode;
  1362. src->locale = 12;
  1363. src->symbolicId = 13;
  1364. src->localizedText = 14;
  1365. const UA_DataType *type = &UA_TYPES[UA_TYPES_DIAGNOSTICINFO];
  1366. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1367. UA_ByteString buf;
  1368. UA_ByteString_allocBuffer(&buf, size+1);
  1369. UA_Byte *bufPos = &buf.data[0];
  1370. const UA_Byte *bufEnd = &buf.data[size+1];
  1371. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1372. *bufPos = 0;
  1373. // then
  1374. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1375. char* result = "{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896,\"InnerDiagnosticInfo\":{\"AdditionalInfo\":\"INNER ADDITION INFO\",\"InnerDiagnosticInfo\":{\"AdditionalInfo\":\"INNER ADDITION INFO2\"}}}";
  1376. ck_assert_str_eq(result, (char*)buf.data);
  1377. UA_ByteString_deleteMembers(&buf);
  1378. UA_DiagnosticInfo_delete(src);
  1379. }
  1380. END_TEST
  1381. START_TEST(UA_DiagInfo_noFields_json_encode) {
  1382. UA_DiagnosticInfo *src = UA_DiagnosticInfo_new();
  1383. UA_DiagnosticInfo_init(src);
  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 = "null";
  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_smallBuffer_json_encode) {
  1401. UA_DiagnosticInfo *src = UA_DiagnosticInfo_new();
  1402. UA_DiagnosticInfo_init(src);
  1403. src->hasAdditionalInfo = UA_TRUE;
  1404. src->hasInnerDiagnosticInfo = UA_FALSE;
  1405. src->hasInnerStatusCode = UA_TRUE;
  1406. src->hasLocale = UA_TRUE;
  1407. src->hasSymbolicId = UA_TRUE;
  1408. src->hasLocalizedText = UA_TRUE;
  1409. src->hasNamespaceUri = UA_FALSE;
  1410. UA_StatusCode statusCode = UA_STATUSCODE_BADARGUMENTSMISSING;
  1411. src->additionalInfo = UA_STRING_ALLOC("additionalInfo");
  1412. src->innerStatusCode = statusCode;
  1413. src->locale = 12;
  1414. src->symbolicId = 13;
  1415. src->localizedText = 14;
  1416. const UA_DataType *type = &UA_TYPES[UA_TYPES_DIAGNOSTICINFO];
  1417. UA_ByteString buf;
  1418. UA_ByteString_allocBuffer(&buf, 2);
  1419. UA_Byte *bufPos = &buf.data[0];
  1420. const UA_Byte *bufEnd = &buf.data[2];
  1421. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1422. *bufPos = 0;
  1423. // then
  1424. ck_assert_int_eq(s, UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  1425. UA_ByteString_deleteMembers(&buf);
  1426. UA_DiagnosticInfo_delete(src);
  1427. }
  1428. END_TEST
  1429. /* ---------------ByteString----------------- */
  1430. START_TEST(UA_ByteString_json_encode) {
  1431. UA_ByteString *src = UA_ByteString_new();
  1432. UA_ByteString_init(src);
  1433. *src = UA_BYTESTRING_ALLOC("asdfasdf");
  1434. const UA_DataType *type = &UA_TYPES[UA_TYPES_BYTESTRING];
  1435. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1436. UA_ByteString buf;
  1437. UA_ByteString_allocBuffer(&buf, size+1);
  1438. UA_Byte *bufPos = &buf.data[0];
  1439. const UA_Byte *bufEnd = &buf.data[size+1];
  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_GOOD);
  1444. char* result = "\"YXNkZmFzZGY=\"";
  1445. ck_assert_str_eq(result, (char*)buf.data);
  1446. UA_ByteString_deleteMembers(&buf);
  1447. UA_ByteString_delete(src);
  1448. }
  1449. END_TEST
  1450. START_TEST(UA_ByteString2_json_encode) {
  1451. UA_ByteString *src = UA_ByteString_new();
  1452. UA_ByteString_init(src);
  1453. *src = UA_BYTESTRING_ALLOC("Lorem ipsum dolor sit amet, consectetur adipiscing elit.");
  1454. const UA_DataType *type = &UA_TYPES[UA_TYPES_BYTESTRING];
  1455. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1456. UA_ByteString buf;
  1457. UA_ByteString_allocBuffer(&buf, size+1);
  1458. UA_Byte *bufPos = &buf.data[0];
  1459. const UA_Byte *bufEnd = &buf.data[size+1];
  1460. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1461. //s = UA_decodeJson()
  1462. *bufPos = 0;
  1463. // then
  1464. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1465. char* result = "\"TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4=\"";
  1466. ck_assert_str_eq(result, (char*)buf.data);
  1467. UA_ByteString_deleteMembers(&buf);
  1468. UA_ByteString_delete(src);
  1469. }
  1470. END_TEST
  1471. START_TEST(UA_ByteString3_json_encode) {
  1472. UA_Variant *src = UA_Variant_new();
  1473. UA_Variant_init(src);
  1474. UA_ByteString *variantContent = UA_ByteString_new();
  1475. *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.");
  1476. UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_BYTESTRING]);
  1477. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1478. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1479. UA_ByteString buf;
  1480. UA_ByteString_allocBuffer(&buf, size+1);
  1481. UA_Byte *bufPos = &buf.data[0];
  1482. const UA_Byte *bufEnd = &buf.data[size+1];
  1483. status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1484. *bufPos = 0;
  1485. //printf("%s\n\n", (char*)buf.data);
  1486. UA_Variant out;
  1487. UA_Variant_init(&out);
  1488. retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  1489. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  1490. UA_ByteString *srcData = ((UA_ByteString*)src->data);
  1491. UA_ByteString *outData = ((UA_ByteString*)out.data);
  1492. ck_assert(UA_ByteString_equal(srcData, outData));
  1493. UA_ByteString_deleteMembers(&buf);
  1494. UA_Variant_deleteMembers(&out);
  1495. UA_Variant_delete(src);
  1496. }
  1497. END_TEST
  1498. /* ------------------QualifiedName---------------------------- */
  1499. START_TEST(UA_QualName_json_encode) {
  1500. UA_QualifiedName *src = UA_QualifiedName_new();
  1501. UA_QualifiedName_init(src);
  1502. src->name = UA_STRING_ALLOC("derName");
  1503. src->namespaceIndex = 1;
  1504. const UA_DataType *type = &UA_TYPES[UA_TYPES_QUALIFIEDNAME];
  1505. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1506. UA_ByteString buf;
  1507. UA_ByteString_allocBuffer(&buf, size+1);
  1508. UA_Byte *bufPos = &buf.data[0];
  1509. const UA_Byte *bufEnd = &buf.data[size+1];
  1510. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1511. *bufPos = 0;
  1512. // then
  1513. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1514. char* result = "{\"Name\":\"derName\",\"Uri\":1}";
  1515. ck_assert_str_eq(result, (char*)buf.data);
  1516. UA_ByteString_deleteMembers(&buf);
  1517. UA_QualifiedName_delete(src);
  1518. }
  1519. END_TEST
  1520. START_TEST(UA_QualName_NonReversible_json_encode) {
  1521. UA_QualifiedName *src = UA_QualifiedName_new();
  1522. UA_QualifiedName_init(src);
  1523. src->name = UA_STRING_ALLOC("derName");
  1524. src->namespaceIndex = 1;
  1525. const UA_DataType *type = &UA_TYPES[UA_TYPES_QUALIFIEDNAME];
  1526. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE);
  1527. UA_ByteString buf;
  1528. UA_ByteString_allocBuffer(&buf, size+1);
  1529. UA_Byte *bufPos = &buf.data[0];
  1530. const UA_Byte *bufEnd = &buf.data[size+1];
  1531. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
  1532. *bufPos = 0;
  1533. // then
  1534. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1535. char* result = "{\"Name\":\"derName\",\"Uri\":1}";
  1536. ck_assert_str_eq(result, (char*)buf.data);
  1537. UA_ByteString_deleteMembers(&buf);
  1538. UA_QualifiedName_delete(src);
  1539. }
  1540. END_TEST
  1541. START_TEST(UA_QualName_NonReversible_Namespace_json_encode) {
  1542. UA_QualifiedName *src = UA_QualifiedName_new();
  1543. UA_QualifiedName_init(src);
  1544. src->name = UA_STRING_ALLOC("derName");
  1545. src->namespaceIndex = 2;
  1546. const UA_DataType *type = &UA_TYPES[UA_TYPES_QUALIFIEDNAME];
  1547. UA_String namespaces[3] = {UA_STRING("ns0"),UA_STRING("ns1"),UA_STRING("ns2")};
  1548. size_t size = UA_calcSizeJson((void *) src, type, namespaces, 3, NULL, 0, UA_FALSE);
  1549. UA_ByteString buf;
  1550. UA_ByteString_allocBuffer(&buf, size+1);
  1551. UA_Byte *bufPos = &buf.data[0];
  1552. const UA_Byte *bufEnd = &buf.data[size+1];
  1553. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, namespaces, 3, NULL, 0, UA_FALSE);
  1554. *bufPos = 0;
  1555. // then
  1556. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1557. char* result = "{\"Name\":\"derName\",\"Uri\":\"ns2\"}";
  1558. ck_assert_str_eq(result, (char*)buf.data);
  1559. UA_ByteString_deleteMembers(&buf);
  1560. UA_QualifiedName_delete(src);
  1561. }
  1562. END_TEST
  1563. START_TEST(UA_QualName_NonReversible_NoNamespaceAsNumber_json_encode) {
  1564. UA_QualifiedName *src = UA_QualifiedName_new();
  1565. UA_QualifiedName_init(src);
  1566. src->name = UA_STRING_ALLOC("derName");
  1567. src->namespaceIndex = 6789;
  1568. const UA_DataType *type = &UA_TYPES[UA_TYPES_QUALIFIEDNAME];
  1569. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE);
  1570. UA_ByteString buf;
  1571. UA_ByteString_allocBuffer(&buf, size+1);
  1572. UA_Byte *bufPos = &buf.data[0];
  1573. const UA_Byte *bufEnd = &buf.data[size+1];
  1574. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
  1575. *bufPos = 0;
  1576. // then
  1577. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1578. char* result = "{\"Name\":\"derName\",\"Uri\":6789}";
  1579. ck_assert_str_eq(result, (char*)buf.data);
  1580. UA_ByteString_deleteMembers(&buf);
  1581. UA_QualifiedName_delete(src);
  1582. }
  1583. END_TEST
  1584. /* ----------------------------Variant------------------------ */
  1585. /* -----Builtin scalar----- */
  1586. START_TEST(UA_Variant_Bool_json_encode) {
  1587. UA_Variant *src = UA_Variant_new();
  1588. UA_Variant_init(src);
  1589. UA_Boolean *variantContent = UA_Boolean_new();
  1590. *variantContent = true;
  1591. UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_BOOLEAN]);
  1592. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1593. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1594. UA_ByteString buf;
  1595. UA_ByteString_allocBuffer(&buf, size+1);
  1596. UA_Byte *bufPos = &buf.data[0];
  1597. const UA_Byte *bufEnd = &buf.data[size+1];
  1598. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1599. *bufPos = 0;
  1600. // then
  1601. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1602. char* result = "{\"Type\":1,\"Body\":true}";
  1603. ck_assert_str_eq(result, (char*)buf.data);
  1604. UA_ByteString_deleteMembers(&buf);
  1605. UA_Variant_delete(src);
  1606. }
  1607. END_TEST
  1608. START_TEST(UA_Variant_Number_json_encode) {
  1609. UA_Variant *src = UA_Variant_new();
  1610. UA_Variant_init(src);
  1611. UA_UInt64 *variantContent = UA_UInt64_new();
  1612. *variantContent = 345634563456;
  1613. UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_UINT64]);
  1614. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1615. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1616. UA_ByteString buf;
  1617. UA_ByteString_allocBuffer(&buf, size+1);
  1618. UA_Byte *bufPos = &buf.data[0];
  1619. const UA_Byte *bufEnd = &buf.data[size+1];
  1620. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1621. *bufPos = 0;
  1622. // then
  1623. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1624. char* result = "{\"Type\":9,\"Body\":345634563456}";
  1625. ck_assert_str_eq(result, (char*)buf.data);
  1626. UA_ByteString_deleteMembers(&buf);
  1627. UA_Variant_delete(src);
  1628. }
  1629. END_TEST
  1630. START_TEST(UA_Variant_Double_json_encode) {
  1631. /* Encode decode cyle of 100 Doubles */
  1632. UA_Double d = 0.0;
  1633. for(size_t i = 0; i < 100; i++){
  1634. d = nextafter(d,1);
  1635. UA_Variant *src = UA_Variant_new();
  1636. UA_Variant_init(src);
  1637. UA_Double *variantContent = UA_Double_new();
  1638. //*variantContent = 1.0000000000000002;
  1639. *variantContent = d;
  1640. UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_DOUBLE]);
  1641. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1642. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1643. UA_ByteString buf;
  1644. UA_ByteString_allocBuffer(&buf, size+1);
  1645. UA_Byte *bufPos = &buf.data[0];
  1646. const UA_Byte *bufEnd = &buf.data[size+1];
  1647. status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1648. *bufPos = 0;
  1649. //printf("%s\n\n", (char*)buf.data);
  1650. UA_Variant out;
  1651. UA_Variant_init(&out);
  1652. retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  1653. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  1654. UA_Double srcData = *((UA_Double*)src->data);
  1655. UA_Double outData = *((UA_Double*)out.data);
  1656. assert(memcmp(&srcData, &outData, sizeof(UA_Double)) == 0);
  1657. ck_assert(memcmp(&srcData, &outData, sizeof(UA_Double)) == 0);
  1658. UA_ByteString_deleteMembers(&buf);
  1659. UA_Variant_deleteMembers(&out);
  1660. UA_Variant_delete(src);
  1661. }
  1662. }
  1663. END_TEST
  1664. START_TEST(UA_Variant_Double2_json_encode) {
  1665. UA_Variant *src = UA_Variant_new();
  1666. UA_Variant_init(src);
  1667. UA_Double *variantContent = UA_Double_new();
  1668. *variantContent = (pow(2,53)-1)*pow(2,-1074);
  1669. UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_DOUBLE]);
  1670. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1671. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1672. UA_ByteString buf;
  1673. UA_ByteString_allocBuffer(&buf, size+1);
  1674. UA_Byte *bufPos = &buf.data[0];
  1675. const UA_Byte *bufEnd = &buf.data[size+1];
  1676. status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1677. *bufPos = 0;
  1678. //printf("%s\n\n", (char*)buf.data);
  1679. /*{"Type":11,"Body":4.4501477170144022721148195934182639518696390927032912960468522194496444440421538910330590478162701758282983178260792422137401728773891892910553144148156412434867599762821265346585071045737627442980259622449029037796981144446145705102663115100318287949527959668236039986479250965780342141637013812613333119898765515451440315261253813266652951306000184917766328660755595837392240989947807556594098101021612198814605258742579179000071675999344145086087205681577915435923018910334964869420614052182892431445797605163650903606514140377217442262561590244668525767372446430075513332450079650686719491377688478005309963967709758965844137894433796621993967316936280457084866613206797017728916080020698679408551343728867675409720757232455434770912461317493580281734466552734375e-308}*/
  1680. UA_Variant out;
  1681. UA_Variant_init(&out);
  1682. retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  1683. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  1684. UA_Double srcData = *((UA_Double*)src->data);
  1685. UA_Double outData = *((UA_Double*)out.data);
  1686. ck_assert(memcmp(&srcData, &outData, sizeof(UA_Double)) == 0);
  1687. UA_ByteString_deleteMembers(&buf);
  1688. UA_Variant_deleteMembers(&out);
  1689. UA_Variant_delete(src);
  1690. }
  1691. END_TEST
  1692. START_TEST(UA_Variant_Double3_json_encode) {
  1693. UA_Variant *src = UA_Variant_new();
  1694. UA_Variant_init(src);
  1695. UA_Double *variantContent = UA_Double_new();
  1696. *variantContent = 1.1234;
  1697. UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_DOUBLE]);
  1698. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1699. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1700. UA_ByteString buf;
  1701. UA_ByteString_allocBuffer(&buf, size+1);
  1702. UA_Byte *bufPos = &buf.data[0];
  1703. const UA_Byte *bufEnd = &buf.data[size+1];
  1704. status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1705. *bufPos = 0;
  1706. UA_Variant out;
  1707. UA_Variant_init(&out);
  1708. retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  1709. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  1710. UA_Double srcData = *((UA_Double*)src->data);
  1711. UA_Double outData = *((UA_Double*)out.data);
  1712. ck_assert(memcmp(&srcData, &outData, sizeof(UA_Double)) == 0);
  1713. UA_ByteString_deleteMembers(&buf);
  1714. UA_Variant_deleteMembers(&out);
  1715. UA_Variant_delete(src);
  1716. }
  1717. END_TEST
  1718. START_TEST(UA_Variant_DoubleInf_json_encode) {
  1719. UA_Variant *src = UA_Variant_new();
  1720. UA_Variant_init(src);
  1721. UA_Double *variantContent = UA_Double_new();
  1722. *variantContent = (UA_Double)INFINITY;
  1723. UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_DOUBLE]);
  1724. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1725. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1726. UA_ByteString buf;
  1727. UA_ByteString_allocBuffer(&buf, size+1);
  1728. UA_Byte *bufPos = &buf.data[0];
  1729. const UA_Byte *bufEnd = &buf.data[size+1];
  1730. status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1731. *bufPos = 0;
  1732. //printf("%s\n\n", (char*)buf.data);
  1733. UA_Variant out;
  1734. UA_Variant_init(&out);
  1735. retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  1736. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  1737. UA_Double srcData = *((UA_Double*)src->data);
  1738. UA_Double outData = *((UA_Double*)out.data);
  1739. ck_assert(memcmp(&srcData, &outData, sizeof(UA_Double)) == 0);
  1740. UA_ByteString_deleteMembers(&buf);
  1741. UA_Variant_deleteMembers(&out);
  1742. UA_Variant_delete(src);
  1743. }
  1744. END_TEST
  1745. START_TEST(UA_Variant_DoubleNan_json_encode) {
  1746. UA_Variant *src = UA_Variant_new();
  1747. UA_Variant_init(src);
  1748. UA_Double *variantContent = UA_Double_new();
  1749. *variantContent = (UA_Double)NAN;
  1750. UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_DOUBLE]);
  1751. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1752. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1753. UA_ByteString buf;
  1754. UA_ByteString_allocBuffer(&buf, size+1);
  1755. UA_Byte *bufPos = &buf.data[0];
  1756. const UA_Byte *bufEnd = &buf.data[size+1];
  1757. status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1758. *bufPos = 0;
  1759. //printf("%s\n\n", (char*)buf.data);
  1760. UA_Variant out;
  1761. UA_Variant_init(&out);
  1762. retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  1763. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  1764. UA_Double srcData = *((UA_Double*)src->data);
  1765. UA_Double outData = *((UA_Double*)out.data);
  1766. ck_assert(memcmp(&srcData, &outData, sizeof(UA_Double)) == 0);
  1767. UA_ByteString_deleteMembers(&buf);
  1768. UA_Variant_deleteMembers(&out);
  1769. UA_Variant_delete(src);
  1770. }
  1771. END_TEST
  1772. START_TEST(UA_Variant_Float_json_encode) {
  1773. UA_Variant *src = UA_Variant_new();
  1774. UA_Variant_init(src);
  1775. UA_Float *variantContent = UA_Float_new();
  1776. *variantContent = (UA_Float)((pow(2,23)-1)/pow(2,149));
  1777. UA_Variant_setScalar(src, variantContent, &UA_TYPES[UA_TYPES_FLOAT]);
  1778. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1779. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1780. UA_ByteString buf;
  1781. UA_ByteString_allocBuffer(&buf, size+1);
  1782. UA_Byte *bufPos = &buf.data[0];
  1783. const UA_Byte *bufEnd = &buf.data[size+1];
  1784. status retval = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1785. *bufPos = 0;
  1786. UA_Variant out;
  1787. UA_Variant_init(&out);
  1788. retval |= UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  1789. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  1790. UA_Float srcData = *((UA_Float*)src->data);
  1791. UA_Float outData = *((UA_Float*)out.data);
  1792. ck_assert(memcmp(&srcData, &outData, sizeof(UA_Float)) == 0);
  1793. UA_ByteString_deleteMembers(&buf);
  1794. UA_Variant_deleteMembers(&out);
  1795. UA_Variant_delete(src);
  1796. }
  1797. END_TEST
  1798. START_TEST(UA_Variant_NodeId_json_encode) {
  1799. UA_Variant *src = UA_Variant_new();
  1800. UA_Variant_init(src);
  1801. UA_NodeId variantContent = UA_NODEID_STRING(1, "theID");
  1802. UA_Variant_setScalarCopy(src, &variantContent, &UA_TYPES[UA_TYPES_NODEID]);
  1803. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1804. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1805. UA_ByteString buf;
  1806. UA_ByteString_allocBuffer(&buf, size+1);
  1807. UA_Byte *bufPos = &buf.data[0];
  1808. const UA_Byte *bufEnd = &buf.data[size+1];
  1809. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1810. *bufPos = 0;
  1811. // then
  1812. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1813. char* result = "{\"Type\":17,\"Body\":{\"IdType\":1,\"Id\":\"theID\",\"Namespace\":1}}";
  1814. ck_assert_str_eq(result, (char*)buf.data);
  1815. UA_ByteString_deleteMembers(&buf);
  1816. UA_Variant_delete(src);
  1817. }
  1818. END_TEST
  1819. START_TEST(UA_Variant_LocText_json_encode) {
  1820. UA_Variant *src = UA_Variant_new();
  1821. UA_Variant_init(src);
  1822. UA_LocalizedText variantContent;
  1823. variantContent.locale = UA_STRING("localeString");
  1824. variantContent.text = UA_STRING("textString");
  1825. UA_Variant_setScalarCopy(src, &variantContent, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
  1826. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1827. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1828. UA_ByteString buf;
  1829. UA_ByteString_allocBuffer(&buf, size+1);
  1830. UA_Byte *bufPos = &buf.data[0];
  1831. const UA_Byte *bufEnd = &buf.data[size+1];
  1832. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1833. *bufPos = 0;
  1834. // then
  1835. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1836. char* result = "{\"Type\":21,\"Body\":{\"Locale\":\"localeString\",\"Text\":\"textString\"}}";
  1837. ck_assert_str_eq(result, (char*)buf.data);
  1838. UA_ByteString_deleteMembers(&buf);
  1839. UA_Variant_delete(src);
  1840. }
  1841. END_TEST
  1842. START_TEST(UA_Variant_QualName_json_encode) {
  1843. UA_Variant *src = UA_Variant_new();
  1844. UA_Variant_init(src);
  1845. UA_QualifiedName variantContent;
  1846. UA_QualifiedName_init(&variantContent);
  1847. variantContent.name = UA_STRING("derName");
  1848. variantContent.namespaceIndex = 1;
  1849. UA_Variant_setScalarCopy(src, &variantContent, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]);
  1850. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1851. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1852. UA_ByteString buf;
  1853. UA_ByteString_allocBuffer(&buf, size+1);
  1854. UA_Byte *bufPos = &buf.data[0];
  1855. const UA_Byte *bufEnd = &buf.data[size+1];
  1856. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1857. *bufPos = 0;
  1858. // then
  1859. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1860. char* result = "{\"Type\":20,\"Body\":{\"Name\":\"derName\",\"Uri\":1}}";
  1861. ck_assert_str_eq(result, (char*)buf.data);
  1862. UA_ByteString_deleteMembers(&buf);
  1863. UA_Variant_delete(src);
  1864. }
  1865. END_TEST
  1866. /* ---Reversible Variant Array---- */
  1867. START_TEST(UA_Variant_Array_UInt16_json_encode) {
  1868. UA_Variant *src = UA_Variant_new();
  1869. UA_Variant_init(src);
  1870. UA_UInt16 zero[2] = {42,43};
  1871. UA_Variant_setArrayCopy(src, zero, 2, &UA_TYPES[UA_TYPES_UINT16]);
  1872. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1873. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1874. UA_ByteString buf;
  1875. UA_ByteString_allocBuffer(&buf, size+1);
  1876. UA_Byte *bufPos = &buf.data[0];
  1877. const UA_Byte *bufEnd = &buf.data[size+1];
  1878. ck_assert_int_eq(size, 25);
  1879. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1880. *bufPos = 0;
  1881. // then
  1882. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1883. char* result = "{\"Type\":5,\"Body\":[42,43]}";
  1884. ck_assert_str_eq(result, (char*)buf.data);
  1885. UA_ByteString_deleteMembers(&buf);
  1886. UA_Variant_delete(src);
  1887. }
  1888. END_TEST
  1889. START_TEST(UA_Variant_Array_Byte_json_encode) {
  1890. UA_Variant *src = UA_Variant_new();
  1891. UA_Variant_init(src);
  1892. UA_Byte zero[2] = {42,43};
  1893. UA_Variant_setArrayCopy(src, zero, 2, &UA_TYPES[UA_TYPES_BYTE]);
  1894. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1895. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1896. UA_ByteString buf;
  1897. UA_ByteString_allocBuffer(&buf, size+1);
  1898. UA_Byte *bufPos = &buf.data[0];
  1899. const UA_Byte *bufEnd = &buf.data[size+1];
  1900. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1901. *bufPos = 0;
  1902. // then
  1903. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1904. char* result = "{\"Type\":3,\"Body\":[42,43]}";
  1905. ck_assert_str_eq(result, (char*)buf.data);
  1906. UA_ByteString_deleteMembers(&buf);
  1907. UA_Variant_delete(src);
  1908. }
  1909. END_TEST
  1910. START_TEST(UA_Variant_Array_String_json_encode) {
  1911. UA_Variant *src = UA_Variant_new();
  1912. UA_Variant_init(src);
  1913. UA_String zero[2] = {UA_STRING("eins"),UA_STRING("zwei")};
  1914. UA_Variant_setArrayCopy(src, zero, 2, &UA_TYPES[UA_TYPES_STRING]);
  1915. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1916. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  1917. UA_ByteString buf;
  1918. UA_ByteString_allocBuffer(&buf, size+1);
  1919. UA_Byte *bufPos = &buf.data[0];
  1920. const UA_Byte *bufEnd = &buf.data[size+1];
  1921. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1922. *bufPos = 0;
  1923. // then
  1924. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1925. char* result = "{\"Type\":12,\"Body\":[\"eins\",\"zwei\"]}";
  1926. ck_assert_str_eq(result, (char*)buf.data);
  1927. UA_ByteString_deleteMembers(&buf);
  1928. UA_Variant_delete(src);
  1929. }
  1930. END_TEST
  1931. START_TEST(UA_Variant_Matrix_UInt16_json_encode) {
  1932. // Set an array value
  1933. UA_Variant src;
  1934. UA_Variant_init(&src);
  1935. UA_UInt16 d[9] = {1, 2, 3,
  1936. 4, 5, 6,
  1937. 7, 8, 9};
  1938. UA_Variant_setArrayCopy(&src, d, 9, &UA_TYPES[UA_TYPES_UINT16]);
  1939. //Set array dimensions
  1940. src.arrayDimensions = (UA_UInt32 *)UA_Array_new(2, &UA_TYPES[UA_TYPES_UINT32]);
  1941. src.arrayDimensionsSize = 2;
  1942. src.arrayDimensions[0] = 3;
  1943. src.arrayDimensions[1] = 3;
  1944. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1945. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  1946. UA_ByteString buf;
  1947. UA_ByteString_allocBuffer(&buf, size+1);
  1948. UA_Byte *bufPos = &buf.data[0];
  1949. const UA_Byte *bufEnd = &buf.data[size+1];
  1950. //{"Type":5,"Body":[1,2,3,4,5,6,7,8,9],"Dimension":[3,3]}
  1951. size_t sizeOfBytes = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  1952. ck_assert_int_eq(sizeOfBytes, 55);
  1953. status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  1954. *bufPos = 0;
  1955. // then
  1956. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1957. char* result = "{\"Type\":5,\"Body\":[1,2,3,4,5,6,7,8,9],\"Dimension\":[3,3]}";
  1958. ck_assert_str_eq(result, (char*)buf.data);
  1959. UA_ByteString_deleteMembers(&buf);
  1960. UA_Variant_deleteMembers(&src);
  1961. }
  1962. END_TEST
  1963. /* NON-Reversible builtin simple */
  1964. START_TEST(UA_Variant_StatusCode_NonReversible_json_encode) {
  1965. UA_Variant *src = UA_Variant_new();
  1966. UA_Variant_init(src);
  1967. UA_StatusCode variantContent = UA_STATUSCODE_BADAGGREGATECONFIGURATIONREJECTED;
  1968. UA_Variant_setScalarCopy(src, &variantContent, &UA_TYPES[UA_TYPES_STATUSCODE]);
  1969. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1970. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE);
  1971. UA_ByteString buf;
  1972. UA_ByteString_allocBuffer(&buf, size+1);
  1973. UA_Byte *bufPos = &buf.data[0];
  1974. const UA_Byte *bufEnd = &buf.data[size+1];
  1975. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
  1976. *bufPos = 0;
  1977. // then
  1978. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  1979. char* result = "{\"Body\":{\"Code\":2161770496,\"Symbol\":\"BadAggregateConfigurationRejected\"}}";
  1980. ck_assert_str_eq(result, (char*)buf.data);
  1981. UA_ByteString_deleteMembers(&buf);
  1982. UA_Variant_delete(src);
  1983. }
  1984. END_TEST
  1985. /* NON-Reversible Array */
  1986. START_TEST(UA_Variant_Array_String_NonReversible_json_encode) {
  1987. UA_Variant src;
  1988. UA_Variant_init(&src);
  1989. UA_String d[8] = {UA_STRING("1"), UA_STRING("2"), UA_STRING("3"),
  1990. UA_STRING("4"), UA_STRING("5"), UA_STRING("6"),
  1991. UA_STRING("7"), UA_STRING("8")};
  1992. UA_Variant_setArrayCopy(&src, d, 8, &UA_TYPES[UA_TYPES_STRING]);
  1993. src.arrayDimensions = (UA_UInt32 *)UA_Array_new(4, &UA_TYPES[UA_TYPES_UINT32]);
  1994. src.arrayDimensionsSize = 1;
  1995. src.arrayDimensions[0] = 8;
  1996. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  1997. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_FALSE);
  1998. UA_ByteString buf;
  1999. UA_ByteString_allocBuffer(&buf, size+1);
  2000. UA_Byte *bufPos = &buf.data[0];
  2001. const UA_Byte *bufEnd = &buf.data[size+1];
  2002. status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
  2003. *bufPos = 0;
  2004. // then
  2005. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2006. char* result = "{\"Body\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\"]}";
  2007. ck_assert_str_eq(result, (char*)buf.data);
  2008. UA_ByteString_deleteMembers(&buf);
  2009. UA_Variant_deleteMembers(&src);
  2010. }
  2011. END_TEST
  2012. /* NON-Reversible Matrix */
  2013. START_TEST(UA_Variant_Matrix_String_NonReversible_json_encode) {
  2014. UA_Variant src;
  2015. UA_Variant_init(&src);
  2016. UA_String d[8] = {UA_STRING("1"), UA_STRING("2"), UA_STRING("3"),
  2017. UA_STRING("4"), UA_STRING("5"), UA_STRING("6"),
  2018. UA_STRING("7"), UA_STRING("8")};
  2019. UA_Variant_setArrayCopy(&src, d, 8, &UA_TYPES[UA_TYPES_STRING]);
  2020. src.arrayDimensions = (UA_UInt32 *)UA_Array_new(4, &UA_TYPES[UA_TYPES_UINT32]);
  2021. src.arrayDimensionsSize = 4;
  2022. src.arrayDimensions[0] = 2;
  2023. src.arrayDimensions[1] = 2;
  2024. src.arrayDimensions[2] = 2;
  2025. src.arrayDimensions[3] = 1;
  2026. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  2027. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_FALSE);
  2028. UA_ByteString buf;
  2029. UA_ByteString_allocBuffer(&buf, size+1);
  2030. UA_Byte *bufPos = &buf.data[0];
  2031. const UA_Byte *bufEnd = &buf.data[size+1];
  2032. //{"Body":[[[["1"],["2"]],[["3"],["4"]]],[[["5"],["6"]],[["7"],["8"]]]]}
  2033. size_t sizeOfBytes = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_FALSE);
  2034. ck_assert_int_eq(sizeOfBytes, 70);
  2035. status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
  2036. *bufPos = 0;
  2037. // then
  2038. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2039. char* result = "{\"Body\":[[[[\"1\"],[\"2\"]],[[\"3\"],[\"4\"]]],[[[\"5\"],[\"6\"]],[[\"7\"],[\"8\"]]]]}";
  2040. ck_assert_str_eq(result, (char*)buf.data);
  2041. UA_ByteString_deleteMembers(&buf);
  2042. UA_Variant_deleteMembers(&src);
  2043. }
  2044. END_TEST
  2045. START_TEST(UA_Variant_Matrix_NodeId_NonReversible_json_encode) {
  2046. UA_Variant src;
  2047. UA_Variant_init(&src);
  2048. 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)};
  2049. UA_Variant_setArrayCopy(&src, d, 8, &UA_TYPES[UA_TYPES_NODEID]);
  2050. src.arrayDimensions = (UA_UInt32 *)UA_Array_new(4, &UA_TYPES[UA_TYPES_UINT32]);
  2051. src.arrayDimensionsSize = 4;
  2052. src.arrayDimensions[0] = 2;
  2053. src.arrayDimensions[1] = 2;
  2054. src.arrayDimensions[2] = 2;
  2055. src.arrayDimensions[3] = 1;
  2056. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  2057. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_FALSE);
  2058. UA_ByteString buf;
  2059. UA_ByteString_allocBuffer(&buf, size+1);
  2060. UA_Byte *bufPos = &buf.data[0];
  2061. const UA_Byte *bufEnd = &buf.data[size+1];
  2062. status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
  2063. *bufPos = 0;
  2064. // then
  2065. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2066. 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}]]]]}";
  2067. ck_assert_str_eq(result, (char*)buf.data);
  2068. UA_ByteString_deleteMembers(&buf);
  2069. UA_Variant_deleteMembers(&src);
  2070. }
  2071. END_TEST
  2072. START_TEST(UA_Variant_Wrap_json_encode) {
  2073. UA_Variant *src = UA_Variant_new();
  2074. UA_Variant_init(src);
  2075. UA_ViewDescription variantContent;
  2076. UA_DateTime srvts = UA_DateTime_fromUnixTime(1234567);
  2077. variantContent.timestamp = srvts;
  2078. variantContent.viewVersion = 1236;
  2079. variantContent.viewId = UA_NODEID_NUMERIC(0,99999);
  2080. UA_Variant_setScalarCopy(src, &variantContent, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]);
  2081. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  2082. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  2083. UA_ByteString buf;
  2084. UA_ByteString_allocBuffer(&buf, size+1);
  2085. UA_Byte *bufPos = &buf.data[0];
  2086. const UA_Byte *bufEnd = &buf.data[size+1];
  2087. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2088. *bufPos = 0;
  2089. // then
  2090. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2091. char* result = "{\"Type\":22,\"Body\":{\"TypeId\":{\"Id\":511},\"Body\":{\"ViewId\":{\"Id\":99999},\"Timestamp\":\"1970-01-15T06:56:07.000Z\",\"ViewVersion\":1236}}}";
  2092. ck_assert_str_eq(result, (char*)buf.data);
  2093. UA_ByteString_deleteMembers(&buf);
  2094. UA_Variant_delete(src);
  2095. }
  2096. END_TEST
  2097. START_TEST(UA_Variant_Wrap_Array_json_encode) {
  2098. UA_Variant src;
  2099. UA_Variant_init(&src);
  2100. //src.arrayDimensions = (UA_UInt32 *)UA_Array_new(1, &UA_TYPES[UA_TYPES_UINT32]);
  2101. //src.arrayDimensionsSize = 1;
  2102. //src.arrayDimensions[0] = 2;
  2103. UA_ViewDescription variantContent1;
  2104. UA_DateTime srvts1 = UA_DateTime_fromUnixTime(1234567);
  2105. variantContent1.timestamp = srvts1;
  2106. variantContent1.viewVersion = 1;
  2107. variantContent1.viewId = UA_NODEID_NUMERIC(0,1);
  2108. UA_ViewDescription variantContent2;
  2109. UA_DateTime srvts2 = UA_DateTime_fromUnixTime(1234567);
  2110. variantContent2.timestamp = srvts2;
  2111. variantContent2.viewVersion = 2;
  2112. variantContent2.viewId = UA_NODEID_NUMERIC(0,2);
  2113. UA_ViewDescription d[2] = {variantContent1, variantContent2};
  2114. UA_Variant_setArrayCopy(&src, d, 2, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]);
  2115. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  2116. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  2117. UA_ByteString buf;
  2118. UA_ByteString_allocBuffer(&buf, size+1);
  2119. UA_Byte *bufPos = &buf.data[0];
  2120. const UA_Byte *bufEnd = &buf.data[size+1];
  2121. status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2122. *bufPos = 0;
  2123. // then
  2124. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2125. char* result = "{\"Type\":22,\"Body\":[{\"TypeId\":{\"Id\":511},\"Body\":{\"ViewId\":{\"Id\":1},\"Timestamp\":\"1970-01-15T06:56:07.000Z\",\"ViewVersion\":1}},{\"TypeId\":{\"Id\":511},\"Body\":{\"ViewId\":{\"Id\":2},\"Timestamp\":\"1970-01-15T06:56:07.000Z\",\"ViewVersion\":2}}]}";
  2126. ck_assert_str_eq(result, (char*)buf.data);
  2127. UA_ByteString_deleteMembers(&buf);
  2128. UA_Variant_deleteMembers(&src);
  2129. }
  2130. END_TEST
  2131. START_TEST(UA_Variant_Wrap_Array_NonReversible_json_encode) {
  2132. UA_Variant src;
  2133. UA_Variant_init(&src);
  2134. //src.arrayDimensions = (UA_UInt32 *)UA_Array_new(1, &UA_TYPES[UA_TYPES_UINT32]);
  2135. //src.arrayDimensionsSize = 1;
  2136. //src.arrayDimensions[0] = 2;
  2137. UA_ViewDescription variantContent1;
  2138. UA_DateTime srvts1 = UA_DateTime_fromUnixTime(1234567);
  2139. variantContent1.timestamp = srvts1;
  2140. variantContent1.viewVersion = 1;
  2141. variantContent1.viewId = UA_NODEID_NUMERIC(1,1);
  2142. UA_ViewDescription variantContent2;
  2143. UA_DateTime srvts2 = UA_DateTime_fromUnixTime(1234567);
  2144. variantContent2.timestamp = srvts2;
  2145. variantContent2.viewVersion = 2;
  2146. variantContent2.viewId = UA_NODEID_NUMERIC(1,2);
  2147. UA_ViewDescription d[2] = {variantContent1, variantContent2};
  2148. UA_Variant_setArrayCopy(&src, d, 2, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]);
  2149. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIANT];
  2150. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_FALSE);
  2151. UA_ByteString buf;
  2152. UA_ByteString_allocBuffer(&buf, size+1);
  2153. UA_Byte *bufPos = &buf.data[0];
  2154. const UA_Byte *bufEnd = &buf.data[size+1];
  2155. status s = UA_encodeJson(&src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
  2156. *bufPos = 0;
  2157. // then
  2158. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2159. char* result = "{\"Body\":[{\"Body\":{\"ViewId\":{\"Id\":1,\"Namespace\":1},\"Timestamp\":\"1970-01-15T06:56:07.000Z\",\"ViewVersion\":1}},{\"Body\":{\"ViewId\":{\"Id\":2,\"Namespace\":1},\"Timestamp\":\"1970-01-15T06:56:07.000Z\",\"ViewVersion\":2}}]}";
  2160. ck_assert_str_eq(result, (char*)buf.data);
  2161. UA_ByteString_deleteMembers(&buf);
  2162. UA_Variant_deleteMembers(&src);
  2163. }
  2164. END_TEST
  2165. /* -----------ExtensionObject------------------*/
  2166. START_TEST(UA_ExtensionObject_json_encode) {
  2167. UA_ExtensionObject *src = UA_ExtensionObject_new();
  2168. UA_ExtensionObject_init(src);
  2169. src->encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
  2170. src->content.decoded.type = &UA_TYPES[UA_TYPES_BOOLEAN];
  2171. UA_Boolean b = UA_FALSE;
  2172. src->content.decoded.data = &b;
  2173. const UA_DataType *type = &UA_TYPES[UA_TYPES_EXTENSIONOBJECT];
  2174. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  2175. UA_ByteString buf;
  2176. UA_ByteString_allocBuffer(&buf, size+1);
  2177. UA_Byte *bufPos = &buf.data[0];
  2178. const UA_Byte *bufEnd = &buf.data[size+1];
  2179. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2180. *bufPos = 0;
  2181. // then
  2182. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2183. char* result = "{\"TypeId\":{\"Id\":1},\"Body\":false}";
  2184. ck_assert_str_eq(result, (char*)buf.data);
  2185. UA_ByteString_deleteMembers(&buf);
  2186. UA_ExtensionObject_delete(src);
  2187. }
  2188. END_TEST
  2189. START_TEST(UA_ExtensionObject_xml_json_encode) {
  2190. UA_ExtensionObject *src = UA_ExtensionObject_new();
  2191. UA_ExtensionObject_init(src);
  2192. src->encoding = UA_EXTENSIONOBJECT_ENCODED_XML;
  2193. src->content.encoded.typeId = UA_NODEID_NUMERIC(2,1234);
  2194. UA_ByteString b = UA_BYTESTRING_ALLOC("<Elemement></Element>");
  2195. src->content.encoded.body = b;
  2196. const UA_DataType *type = &UA_TYPES[UA_TYPES_EXTENSIONOBJECT];
  2197. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  2198. UA_ByteString buf;
  2199. UA_ByteString_allocBuffer(&buf, size+1);
  2200. UA_Byte *bufPos = &buf.data[0];
  2201. const UA_Byte *bufEnd = &buf.data[size+1];
  2202. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2203. *bufPos = 0;
  2204. // then
  2205. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2206. char* result = "{\"TypeId\":{\"Id\":1234,\"Namespace\":2},\"Encoding\":2,\"Body\":\"<Elemement></Element>\"}";
  2207. ck_assert_str_eq(result, (char*)buf.data);
  2208. UA_ByteString_deleteMembers(&buf);
  2209. UA_ExtensionObject_delete(src);
  2210. }
  2211. END_TEST
  2212. START_TEST(UA_ExtensionObject_byteString_json_encode) {
  2213. UA_ExtensionObject *src = UA_ExtensionObject_new();
  2214. UA_ExtensionObject_init(src);
  2215. src->encoding = UA_EXTENSIONOBJECT_ENCODED_BYTESTRING;
  2216. src->content.encoded.typeId = UA_NODEID_NUMERIC(2,1234);
  2217. UA_ByteString b = UA_BYTESTRING_ALLOC("123456789012345678901234567890");
  2218. src->content.encoded.body = b;
  2219. const UA_DataType *type = &UA_TYPES[UA_TYPES_EXTENSIONOBJECT];
  2220. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  2221. UA_ByteString buf;
  2222. UA_ByteString_allocBuffer(&buf, size+1);
  2223. UA_Byte *bufPos = &buf.data[0];
  2224. const UA_Byte *bufEnd = &buf.data[size+1];
  2225. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2226. *bufPos = 0;
  2227. // then
  2228. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2229. char* result = "{\"TypeId\":{\"Id\":1234,\"Namespace\":2},\"Encoding\":1,\"Body\":\"123456789012345678901234567890\"}";
  2230. ck_assert_str_eq(result, (char*)buf.data);
  2231. UA_ByteString_deleteMembers(&buf);
  2232. UA_ExtensionObject_delete(src);
  2233. }
  2234. END_TEST
  2235. START_TEST(UA_ExtensionObject_NonReversible_StatusCode_json_encode) {
  2236. UA_ExtensionObject *src = UA_ExtensionObject_new();
  2237. UA_ExtensionObject_init(src);
  2238. src->encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
  2239. src->content.decoded.type = &UA_TYPES[UA_TYPES_STATUSCODE];
  2240. UA_StatusCode b = UA_STATUSCODE_BADENCODINGERROR;
  2241. src->content.decoded.data = &b;
  2242. const UA_DataType *type = &UA_TYPES[UA_TYPES_EXTENSIONOBJECT];
  2243. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_FALSE);
  2244. UA_ByteString buf;
  2245. UA_ByteString_allocBuffer(&buf, size+1);
  2246. UA_Byte *bufPos = &buf.data[0];
  2247. const UA_Byte *bufEnd = &buf.data[size+1];
  2248. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_FALSE);
  2249. *bufPos = 0;
  2250. // then
  2251. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2252. char* result = "{\"Body\":{\"Code\":2147876864,\"Symbol\":\"BadEncodingError\"}}";
  2253. ck_assert_str_eq(result, (char*)buf.data);
  2254. UA_ByteString_deleteMembers(&buf);
  2255. UA_ExtensionObject_delete(src);
  2256. }
  2257. END_TEST
  2258. /* --------------ExpandedNodeId-------------------------- */
  2259. START_TEST(UA_ExpandedNodeId_json_encode) {
  2260. UA_ExpandedNodeId *src = UA_ExpandedNodeId_new();
  2261. UA_ExpandedNodeId_init(src);
  2262. *src = UA_EXPANDEDNODEID_STRING_ALLOC(23, "testtestTest");
  2263. src->namespaceUri = UA_STRING_ALLOC("asdf");
  2264. src->serverIndex = 1345;
  2265. const UA_DataType *type = &UA_TYPES[UA_TYPES_EXPANDEDNODEID];
  2266. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  2267. UA_ByteString buf;
  2268. UA_ByteString_allocBuffer(&buf, size+1);
  2269. UA_Byte *bufPos = &buf.data[0];
  2270. const UA_Byte *bufEnd = &buf.data[size+1];
  2271. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2272. *bufPos = 0;
  2273. // then
  2274. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2275. char* result = "{\"IdType\":1,\"Id\":\"testtestTest\",\"Namespace\":\"asdf\",\"ServerUri\":1345}";
  2276. ck_assert_str_eq(result, (char*)buf.data);
  2277. UA_ByteString_deleteMembers(&buf);
  2278. UA_ExpandedNodeId_delete(src);
  2279. }
  2280. END_TEST
  2281. START_TEST(UA_ExpandedNodeId_MissingNamespaceUri_json_encode) {
  2282. UA_ExpandedNodeId *src = UA_ExpandedNodeId_new();
  2283. UA_ExpandedNodeId_init(src);
  2284. *src = UA_EXPANDEDNODEID_STRING_ALLOC(23, "testtestTest");
  2285. src->namespaceUri = UA_STRING_NULL;
  2286. src->serverIndex = 1345;
  2287. const UA_DataType *type = &UA_TYPES[UA_TYPES_EXPANDEDNODEID];
  2288. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  2289. UA_ByteString buf;
  2290. UA_ByteString_allocBuffer(&buf, size+1);
  2291. UA_Byte *bufPos = &buf.data[0];
  2292. const UA_Byte *bufEnd = &buf.data[size+1];
  2293. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2294. *bufPos = 0;
  2295. // then
  2296. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2297. char* result = "{\"IdType\":1,\"Id\":\"testtestTest\",\"Namespace\":23,\"ServerUri\":1345}";
  2298. ck_assert_str_eq(result, (char*)buf.data);
  2299. UA_ByteString_deleteMembers(&buf);
  2300. UA_ExpandedNodeId_delete(src);
  2301. }
  2302. END_TEST
  2303. START_TEST(UA_ExpandedNodeId_NonReversible_Ns1_json_encode) {
  2304. UA_ExpandedNodeId *src = UA_ExpandedNodeId_new();
  2305. UA_ExpandedNodeId_init(src);
  2306. *src = UA_EXPANDEDNODEID_STRING_ALLOC(1, "testtestTest");
  2307. src->namespaceUri = UA_STRING_NULL;
  2308. src->serverIndex = 1;
  2309. const UA_DataType *type = &UA_TYPES[UA_TYPES_EXPANDEDNODEID];
  2310. UA_String serverUris[3] = {UA_STRING("uri0"),UA_STRING("uri1"),UA_STRING("uri2")};
  2311. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, serverUris, 3, UA_FALSE);
  2312. UA_ByteString buf;
  2313. UA_ByteString_allocBuffer(&buf, size+1);
  2314. UA_Byte *bufPos = &buf.data[0];
  2315. const UA_Byte *bufEnd = &buf.data[size+1];
  2316. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, serverUris, 3, UA_FALSE);
  2317. *bufPos = 0;
  2318. // then
  2319. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2320. char* result = "{\"IdType\":1,\"Id\":\"testtestTest\",\"Namespace\":1,\"ServerUri\":\"uri1\"}";
  2321. ck_assert_str_eq(result, (char*)buf.data);
  2322. UA_ByteString_deleteMembers(&buf);
  2323. UA_ExpandedNodeId_delete(src);
  2324. }
  2325. END_TEST
  2326. START_TEST(UA_ExpandedNodeId_NonReversible_Namespace_json_encode) {
  2327. UA_ExpandedNodeId *src = UA_ExpandedNodeId_new();
  2328. UA_ExpandedNodeId_init(src);
  2329. *src = UA_EXPANDEDNODEID_STRING_ALLOC(2, "testtestTest");
  2330. src->namespaceUri = UA_STRING_NULL;
  2331. src->serverIndex = 1;
  2332. const UA_DataType *type = &UA_TYPES[UA_TYPES_EXPANDEDNODEID];
  2333. UA_String namespaces[3] = {UA_STRING("ns0"),UA_STRING("ns1"),UA_STRING("ns2")};
  2334. UA_String serverUris[3] = {UA_STRING("uri0"),UA_STRING("uri1"),UA_STRING("uri2")};
  2335. size_t size = UA_calcSizeJson((void *) src, type, namespaces, 3, serverUris, 3, UA_FALSE);
  2336. UA_ByteString buf;
  2337. UA_ByteString_allocBuffer(&buf, size+1);
  2338. UA_Byte *bufPos = &buf.data[0];
  2339. const UA_Byte *bufEnd = &buf.data[size+1];
  2340. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, namespaces, 3, serverUris, 3, UA_FALSE);
  2341. *bufPos = 0;
  2342. // then
  2343. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2344. char* result = "{\"IdType\":1,\"Id\":\"testtestTest\",\"Namespace\":\"ns2\",\"ServerUri\":\"uri1\"}";
  2345. ck_assert_str_eq(result, (char*)buf.data);
  2346. UA_ByteString_deleteMembers(&buf);
  2347. UA_ExpandedNodeId_delete(src);
  2348. }
  2349. END_TEST
  2350. START_TEST(UA_ExpandedNodeId_NonReversible_NamespaceUriGiven_json_encode) {
  2351. UA_ExpandedNodeId *src = UA_ExpandedNodeId_new();
  2352. UA_ExpandedNodeId_init(src);
  2353. *src = UA_EXPANDEDNODEID_STRING_ALLOC(2, "testtestTest");
  2354. src->namespaceUri = UA_STRING_ALLOC("NamespaceUri");
  2355. src->serverIndex = 1;
  2356. UA_String namespaces[3] = {UA_STRING("ns0"),UA_STRING("ns1"),UA_STRING("ns2")};
  2357. UA_String serverUris[3] = {UA_STRING("uri0"),UA_STRING("uri1"),UA_STRING("uri2")};
  2358. const UA_DataType *type = &UA_TYPES[UA_TYPES_EXPANDEDNODEID];
  2359. size_t size = UA_calcSizeJson((void *) src, type, namespaces, 3, serverUris, 3, UA_FALSE);
  2360. UA_ByteString buf;
  2361. UA_ByteString_allocBuffer(&buf, size+1);
  2362. UA_Byte *bufPos = &buf.data[0];
  2363. const UA_Byte *bufEnd = &buf.data[size+1];
  2364. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, namespaces, 3, serverUris, 3, UA_FALSE);
  2365. *bufPos = 0;
  2366. // then
  2367. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2368. char* result = "{\"IdType\":1,\"Id\":\"testtestTest\",\"Namespace\":\"NamespaceUri\",\"ServerUri\":\"uri1\"}";
  2369. ck_assert_str_eq(result, (char*)buf.data);
  2370. UA_ByteString_deleteMembers(&buf);
  2371. UA_ExpandedNodeId_delete(src);
  2372. }
  2373. END_TEST
  2374. /* -------------------------DataValue------------------------ */
  2375. START_TEST(UA_DataValue_json_encode) {
  2376. UA_DataValue *src = UA_DataValue_new();
  2377. UA_DataValue_init(src);
  2378. src->hasServerPicoseconds = UA_TRUE;
  2379. src->hasServerTimestamp = UA_TRUE;
  2380. src->hasSourcePicoseconds = UA_TRUE;
  2381. src->hasSourceTimestamp = UA_TRUE;
  2382. src->hasStatus = UA_TRUE;
  2383. src->hasValue = UA_TRUE;
  2384. UA_DateTime srcts = UA_DateTime_fromUnixTime(1234567);
  2385. UA_DateTime srvts = UA_DateTime_fromUnixTime(1234567);
  2386. src->sourceTimestamp = srcts;
  2387. src->serverTimestamp = srvts;
  2388. src->sourcePicoseconds = 0;
  2389. src->serverPicoseconds = 0;
  2390. UA_Variant variant;
  2391. UA_Variant_init(&variant);
  2392. UA_Boolean variantContent = true;
  2393. UA_Variant_setScalarCopy(&variant, &variantContent, &UA_TYPES[UA_TYPES_BOOLEAN]);
  2394. src->value = variant;
  2395. src->status = UA_STATUSCODE_BADAPPLICATIONSIGNATUREINVALID;
  2396. const UA_DataType *type = &UA_TYPES[UA_TYPES_DATAVALUE];
  2397. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  2398. UA_ByteString buf;
  2399. UA_ByteString_allocBuffer(&buf, size+1);
  2400. UA_Byte *bufPos = &buf.data[0];
  2401. const UA_Byte *bufEnd = &buf.data[size+1];
  2402. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2403. *bufPos = 0;
  2404. // then
  2405. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2406. char* result = "{\"Value\":{\"Type\":1,\"Body\":true},\"Status\":2153250816,\"SourceTimestamp\":\"1970-01-15T06:56:07.000Z\",\"SourcePicoseconds\":0,\"ServerTimestamp\":\"1970-01-15T06:56:07.000Z\",\"ServerPicoseconds\":0}";
  2407. ck_assert_str_eq(result, (char*)buf.data);
  2408. UA_ByteString_deleteMembers(&buf);
  2409. UA_DataValue_delete(src);
  2410. }
  2411. END_TEST
  2412. START_TEST(UA_DataValue_null_json_encode) {
  2413. UA_DataValue *src = UA_DataValue_new();
  2414. UA_DataValue_init(src);
  2415. const UA_DataType *type = &UA_TYPES[UA_TYPES_DATAVALUE];
  2416. size_t size = UA_calcSizeJson((void *) src, type, NULL, 0, NULL, 0, UA_TRUE);
  2417. UA_ByteString buf;
  2418. UA_ByteString_allocBuffer(&buf, size+1);
  2419. UA_Byte *bufPos = &buf.data[0];
  2420. const UA_Byte *bufEnd = &buf.data[size+1];
  2421. status s = UA_encodeJson((void *) src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2422. *bufPos = 0;
  2423. // then
  2424. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2425. char* result = "null";
  2426. ck_assert_str_eq(result, (char*)buf.data);
  2427. UA_ByteString_deleteMembers(&buf);
  2428. UA_DataValue_delete(src);
  2429. }
  2430. END_TEST
  2431. START_TEST(UA_MessageReadResponse_json_encode) {
  2432. UA_ReadResponse src;
  2433. UA_ReadResponse_init(&src);
  2434. UA_DiagnosticInfo innerDiag;
  2435. innerDiag.hasAdditionalInfo = UA_TRUE;
  2436. innerDiag.additionalInfo = UA_STRING_ALLOC("INNER ADDITION INFO");
  2437. innerDiag.hasInnerDiagnosticInfo = UA_FALSE;
  2438. innerDiag.hasInnerStatusCode = UA_FALSE;
  2439. innerDiag.hasLocale = UA_FALSE;
  2440. innerDiag.hasSymbolicId = UA_FALSE;
  2441. innerDiag.hasLocalizedText = UA_FALSE;
  2442. innerDiag.hasNamespaceUri = UA_FALSE;
  2443. UA_DiagnosticInfo *info = (UA_DiagnosticInfo*)UA_calloc(1, sizeof(UA_DiagnosticInfo));
  2444. info[0] = innerDiag;
  2445. src.diagnosticInfos = info;
  2446. src.diagnosticInfosSize = 1;
  2447. UA_DataValue dv;
  2448. UA_DataValue_init(&dv);
  2449. dv.hasServerPicoseconds = UA_TRUE;
  2450. dv.hasServerTimestamp = UA_TRUE;
  2451. dv.hasSourcePicoseconds = UA_TRUE;
  2452. dv.hasSourceTimestamp = UA_TRUE;
  2453. dv.hasStatus = UA_TRUE;
  2454. dv.hasValue = UA_TRUE;
  2455. UA_DateTime srcts = UA_DateTime_fromUnixTime(1234567);
  2456. UA_DateTime srvts = UA_DateTime_fromUnixTime(1234567);
  2457. dv.sourceTimestamp = srcts;
  2458. dv.serverTimestamp = srvts;
  2459. dv.sourcePicoseconds = 0;
  2460. dv.serverPicoseconds = 0;
  2461. UA_Variant variant;
  2462. UA_Variant_init(&variant);
  2463. UA_Boolean variantContent = true;
  2464. UA_Variant_setScalarCopy(&variant, &variantContent, &UA_TYPES[UA_TYPES_BOOLEAN]);
  2465. dv.value = variant;
  2466. dv.status = UA_STATUSCODE_BADAPPLICATIONSIGNATUREINVALID;
  2467. UA_DataValue *values = (UA_DataValue*)UA_calloc(1, sizeof(UA_DataValue));
  2468. values[0] = dv;
  2469. src.results = values;
  2470. src.resultsSize = 1;
  2471. UA_ResponseHeader rh;
  2472. UA_ResponseHeader_init(&rh);
  2473. rh.stringTableSize = 0;
  2474. rh.requestHandle = 123123;
  2475. rh.serviceResult = UA_STATUSCODE_GOOD;
  2476. rh.timestamp = UA_DateTime_fromUnixTime(1234567);
  2477. UA_DiagnosticInfo serverDiag;
  2478. UA_DiagnosticInfo_init(&serverDiag);
  2479. serverDiag.hasAdditionalInfo = UA_TRUE;
  2480. serverDiag.additionalInfo = UA_STRING_ALLOC("serverDiag");
  2481. serverDiag.hasInnerDiagnosticInfo = UA_FALSE;
  2482. serverDiag.hasInnerStatusCode = UA_FALSE;
  2483. serverDiag.hasLocale = UA_FALSE;
  2484. serverDiag.hasSymbolicId = UA_FALSE;
  2485. serverDiag.hasLocalizedText = UA_FALSE;
  2486. serverDiag.hasNamespaceUri = UA_FALSE;
  2487. rh.serviceDiagnostics = serverDiag;
  2488. UA_ExtensionObject e;
  2489. UA_ExtensionObject_init(&e);
  2490. e.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
  2491. e.content.decoded.type = &UA_TYPES[UA_TYPES_BOOLEAN];
  2492. UA_Boolean b = UA_FALSE;
  2493. e.content.decoded.data = &b;
  2494. rh.additionalHeader = e;
  2495. src.responseHeader = rh;
  2496. const UA_DataType *type = &UA_TYPES[UA_TYPES_READRESPONSE];
  2497. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  2498. UA_ByteString buf;
  2499. UA_ByteString_allocBuffer(&buf, size+1);
  2500. UA_Byte *bufPos = &buf.data[0];
  2501. const UA_Byte *bufEnd = &buf.data[size+1];
  2502. status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2503. *bufPos = 0;
  2504. // then
  2505. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2506. char* result = "{\"ResponseHeader\":{\"Timestamp\":\"1970-01-15T06:56:07.000Z\",\"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:07.000Z\",\"SourcePicoseconds\":0,\"ServerTimestamp\":\"1970-01-15T06:56:07.000Z\",\"ServerPicoseconds\":0}],\"DiagnosticInfos\":[{\"AdditionalInfo\":\"INNER ADDITION INFO\"}]}";
  2507. ck_assert_str_eq(result, (char*)buf.data);
  2508. UA_ByteString_deleteMembers(&buf);
  2509. UA_ReadResponse_deleteMembers(&src); //TODO
  2510. }
  2511. END_TEST
  2512. START_TEST(UA_ViewDescription_json_encode) {
  2513. UA_ViewDescription src;
  2514. UA_ViewDescription_init(&src);
  2515. UA_DateTime srvts = UA_DateTime_fromUnixTime(1234567);
  2516. src.timestamp = srvts;
  2517. src.viewVersion = 1236;
  2518. src.viewId = UA_NODEID_NUMERIC(0,99999);
  2519. const UA_DataType *type = &UA_TYPES[UA_TYPES_VIEWDESCRIPTION];
  2520. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  2521. UA_ByteString buf;
  2522. UA_ByteString_allocBuffer(&buf, size+1);
  2523. UA_Byte *bufPos = &buf.data[0];
  2524. const UA_Byte *bufEnd = &buf.data[size+1];
  2525. status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2526. *bufPos = 0;
  2527. // then
  2528. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2529. char* result = "{\"ViewId\":{\"Id\":99999},\"Timestamp\":\"1970-01-15T06:56:07.000Z\",\"ViewVersion\":1236}";
  2530. ck_assert_str_eq(result, (char*)buf.data);
  2531. UA_ByteString_deleteMembers(&buf);
  2532. UA_ViewDescription_deleteMembers(&src);
  2533. }
  2534. END_TEST
  2535. START_TEST(UA_WriteRequest_json_encode) {
  2536. UA_WriteRequest src;
  2537. UA_WriteRequest_init(&src);
  2538. UA_RequestHeader rh;
  2539. rh.returnDiagnostics = 1;
  2540. rh.auditEntryId = UA_STRING_ALLOC("Auditentryid");
  2541. rh.requestHandle = 123123;
  2542. rh.authenticationToken = UA_NODEID_STRING_ALLOC(0,"authToken");
  2543. rh.timestamp = UA_DateTime_fromUnixTime(1234567);
  2544. rh.timeoutHint = 120;
  2545. UA_ExtensionObject e;
  2546. UA_ExtensionObject_init(&e);
  2547. e.encoding = UA_EXTENSIONOBJECT_DECODED_NODELETE;
  2548. e.content.decoded.type = &UA_TYPES[UA_TYPES_BOOLEAN];
  2549. UA_Boolean b = UA_FALSE;
  2550. e.content.decoded.data = &b;
  2551. rh.additionalHeader = e;
  2552. UA_DataValue dv;
  2553. UA_DataValue_init(&dv);
  2554. dv.hasServerPicoseconds = UA_TRUE;
  2555. dv.hasServerTimestamp = UA_TRUE;
  2556. dv.hasSourcePicoseconds = UA_TRUE;
  2557. dv.hasSourceTimestamp = UA_TRUE;
  2558. dv.hasStatus = UA_TRUE;
  2559. dv.hasValue = UA_TRUE;
  2560. UA_DateTime srcts = UA_DateTime_fromUnixTime(1234567);
  2561. UA_DateTime srvts = UA_DateTime_fromUnixTime(1234567);
  2562. dv.sourceTimestamp = srcts;
  2563. dv.serverTimestamp = srvts;
  2564. dv.sourcePicoseconds = 0;
  2565. dv.serverPicoseconds = 0;
  2566. UA_Variant variant;
  2567. UA_Variant_init(&variant);
  2568. UA_Boolean variantContent = true;
  2569. UA_Variant_setScalarCopy(&variant, &variantContent, &UA_TYPES[UA_TYPES_BOOLEAN]);
  2570. dv.value = variant;
  2571. dv.status = UA_STATUSCODE_BADAPPLICATIONSIGNATUREINVALID;
  2572. UA_DataValue dv2;
  2573. UA_DataValue_init(&dv2);
  2574. dv2.hasServerPicoseconds = UA_TRUE;
  2575. dv2.hasServerTimestamp = UA_TRUE;
  2576. dv2.hasSourcePicoseconds = UA_TRUE;
  2577. dv2.hasSourceTimestamp = UA_TRUE;
  2578. dv2.hasStatus = UA_TRUE;
  2579. dv2.hasValue = UA_TRUE;
  2580. UA_DateTime srcts2 = UA_DateTime_fromUnixTime(1234567);
  2581. UA_DateTime srvts2 = UA_DateTime_fromUnixTime(1234567);
  2582. dv2.sourceTimestamp = srcts2;
  2583. dv2.serverTimestamp = srvts2;
  2584. dv2.sourcePicoseconds = 0;
  2585. dv2.serverPicoseconds = 0;
  2586. UA_Variant variant2;
  2587. UA_Variant_init(&variant2);
  2588. UA_Boolean variantContent2 = true;
  2589. UA_Variant_setScalarCopy(&variant2, &variantContent2, &UA_TYPES[UA_TYPES_BOOLEAN]);
  2590. dv2.value = variant2;
  2591. dv2.status = UA_STATUSCODE_BADAPPLICATIONSIGNATUREINVALID;
  2592. UA_WriteValue value;
  2593. UA_WriteValue_init(&value);
  2594. value.value = dv;
  2595. value.attributeId = 12;
  2596. value.indexRange = UA_STRING_ALLOC("BLOAB");
  2597. value.nodeId = UA_NODEID_STRING_ALLOC(0, "a1111");
  2598. UA_WriteValue value2;
  2599. UA_WriteValue_init(&value2);
  2600. value2.value = dv2;
  2601. value2.attributeId = 12;
  2602. value2.indexRange = UA_STRING_ALLOC("BLOAB");
  2603. value2.nodeId = UA_NODEID_STRING_ALLOC(0, "a2222");
  2604. UA_WriteValue *values = (UA_WriteValue*)UA_calloc(2,sizeof(UA_WriteValue));
  2605. values[0] = value;
  2606. values[1] = value2;
  2607. src.nodesToWrite = values;
  2608. src.nodesToWriteSize = 2;
  2609. src.requestHeader = rh;
  2610. const UA_DataType *type = &UA_TYPES[UA_TYPES_WRITEREQUEST];
  2611. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  2612. UA_ByteString buf;
  2613. UA_ByteString_allocBuffer(&buf, size+1);
  2614. UA_Byte *bufPos = &buf.data[0];
  2615. const UA_Byte *bufEnd = &buf.data[size+1];
  2616. status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2617. *bufPos = 0;
  2618. // then
  2619. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2620. char* result = "{\"RequestHeader\":{\"AuthenticationToken\":{\"IdType\":1,\"Id\":\"authToken\"},\"Timestamp\":\"1970-01-15T06:56:07.000Z\",\"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:07.000Z\",\"SourcePicoseconds\":0,\"ServerTimestamp\":\"1970-01-15T06:56:07.000Z\",\"ServerPicoseconds\":0}},{\"NodeId\":{\"IdType\":1,\"Id\":\"a2222\"},\"AttributeId\":12,\"IndexRange\":\"BLOAB\",\"Value\":{\"Value\":{\"Type\":1,\"Body\":true},\"Status\":2153250816,\"SourceTimestamp\":\"1970-01-15T06:56:07.000Z\",\"SourcePicoseconds\":0,\"ServerTimestamp\":\"1970-01-15T06:56:07.000Z\",\"ServerPicoseconds\":0}}]}";
  2621. ck_assert_str_eq(result, (char*)buf.data);
  2622. UA_ByteString_deleteMembers(&buf);
  2623. UA_WriteRequest_deleteMembers(&src);
  2624. }
  2625. END_TEST
  2626. START_TEST(UA_VariableAttributes_json_encode) {
  2627. const UA_VariableTypeAttributes UA_VariableTypeAttributes_default = {
  2628. 0, /* specifiedAttributes */
  2629. {{0, NULL}, {0, NULL}}, /* displayName */
  2630. {{0, NULL}, {0, NULL}}, /* description */
  2631. 0, 0, /* writeMask (userWriteMask) */
  2632. {NULL, UA_VARIANT_DATA, 0, NULL, 0, NULL}, /* value */
  2633. {0, UA_NODEIDTYPE_NUMERIC, {0}}, /* dataType */
  2634. UA_VALUERANK_ANY, /* valueRank */
  2635. 0, NULL, /* arrayDimensions */
  2636. true /* isAbstract */
  2637. };
  2638. UA_VariableTypeAttributes src = UA_VariableTypeAttributes_default;
  2639. UA_Int32 myInteger = 42;
  2640. UA_Variant_setScalar(&src.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
  2641. src.description = UA_LOCALIZEDTEXT("en-US","the answer");
  2642. src.displayName = UA_LOCALIZEDTEXT("en-US","the answer");
  2643. src.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
  2644. const UA_DataType *type = &UA_TYPES[UA_TYPES_VARIABLETYPEATTRIBUTES];
  2645. size_t size = UA_calcSizeJson((void *) &src, type, NULL, 0, NULL, 0, UA_TRUE);
  2646. UA_ByteString buf;
  2647. UA_ByteString_allocBuffer(&buf, size+1);
  2648. UA_Byte *bufPos = &buf.data[0];
  2649. const UA_Byte *bufEnd = &buf.data[size+1];
  2650. status s = UA_encodeJson((void *) &src, type, &bufPos, &bufEnd, NULL, 0, NULL, 0, UA_TRUE);
  2651. *bufPos = 0;
  2652. // then
  2653. ck_assert_int_eq(s, UA_STATUSCODE_GOOD);
  2654. char* result = "{\"SpecifiedAttributes\":0,"
  2655. "\"DisplayName\":{\"Locale\":\"en-US\",\"Text\":\"the answer\"},"
  2656. "\"Description\":{\"Locale\":\"en-US\",\"Text\":\"the answer\"},"
  2657. "\"WriteMask\":0,\"UserWriteMask\":0,"
  2658. "\"Value\":{\"Type\":6,\"Body\":42},"
  2659. "\"DataType\":{\"Id\":6},\"ValueRank\":-2,"
  2660. "\"ArrayDimensions\":[],"
  2661. "\"IsAbstract\":true}";
  2662. ck_assert_str_eq(result, (char*)buf.data);
  2663. UA_ByteString_deleteMembers(&buf);
  2664. }
  2665. END_TEST
  2666. // ---------------------------DECODE-------------------------------------
  2667. START_TEST(UA_Byte_Min_json_decode) {
  2668. UA_Variant out;
  2669. UA_Variant_init(&out);
  2670. UA_ByteString buf = UA_STRING("{\"Type\":3,\"Body\":0}");
  2671. // when
  2672. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2673. // then
  2674. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2675. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_BYTE);
  2676. ck_assert_uint_eq(*((UA_Byte*)out.data), 0);
  2677. UA_Variant_deleteMembers(&out);
  2678. }
  2679. END_TEST
  2680. START_TEST(UA_Byte_Max_json_decode) {
  2681. UA_Variant out;
  2682. UA_Variant_init(&out);
  2683. UA_ByteString buf = UA_STRING("{\"Type\":3,\"Body\":255}");
  2684. // when
  2685. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2686. // then
  2687. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2688. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_BYTE);
  2689. ck_assert_uint_eq(*((UA_Byte*)out.data), 255);
  2690. UA_Variant_deleteMembers(&out);
  2691. }
  2692. END_TEST
  2693. /* ----UInt16---- */
  2694. START_TEST(UA_UInt16_Min_json_decode) {
  2695. UA_Variant out;
  2696. UA_Variant_init(&out);
  2697. UA_ByteString buf = UA_STRING("{\"Type\":5,\"Body\":0}");
  2698. // when
  2699. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2700. // then
  2701. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2702. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT16);
  2703. ck_assert_uint_eq(*((UA_UInt16*)out.data), 0);
  2704. UA_Variant_deleteMembers(&out);
  2705. }
  2706. END_TEST
  2707. START_TEST(UA_UInt16_Max_json_decode) {
  2708. UA_Variant out;
  2709. UA_Variant_init(&out);
  2710. UA_ByteString buf = UA_STRING("{\"Type\":5,\"Body\":65535}");
  2711. // when
  2712. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2713. // then
  2714. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2715. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT16);
  2716. ck_assert_uint_eq(*((UA_UInt16*)out.data), 65535);
  2717. UA_Variant_deleteMembers(&out);
  2718. }
  2719. END_TEST
  2720. START_TEST(UA_UInt32_Min_json_decode) {
  2721. UA_Variant out;
  2722. UA_Variant_init(&out);
  2723. UA_ByteString buf = UA_STRING("{\"Type\":7,\"Body\":0}");
  2724. // when
  2725. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2726. // then
  2727. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2728. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT32);
  2729. ck_assert_uint_eq(*((UA_UInt32*)out.data), 0);
  2730. UA_Variant_deleteMembers(&out);
  2731. }
  2732. END_TEST
  2733. START_TEST(UA_UInt32_Max_json_decode) {
  2734. UA_Variant out;
  2735. UA_Variant_init(&out);
  2736. UA_ByteString buf = UA_STRING("{\"Type\":7,\"Body\":4294967295}");
  2737. // when
  2738. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2739. // then
  2740. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2741. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT32);
  2742. ck_assert_uint_eq(*((UA_UInt32*)out.data), 4294967295);
  2743. UA_Variant_deleteMembers(&out);
  2744. }
  2745. END_TEST
  2746. START_TEST(UA_UInt64_Min_json_decode) {
  2747. UA_Variant out;
  2748. UA_Variant_init(&out);
  2749. UA_ByteString buf = UA_STRING("{\"Type\":9,\"Body\":0}");
  2750. // when
  2751. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2752. // then
  2753. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2754. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT64);
  2755. ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
  2756. ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  2757. ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
  2758. ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
  2759. ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
  2760. ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
  2761. ck_assert_int_eq(((u8*)(out.data))[6], 0x00);
  2762. ck_assert_int_eq(((u8*)(out.data))[7], 0x00);
  2763. UA_Variant_deleteMembers(&out);
  2764. }
  2765. END_TEST
  2766. START_TEST(UA_UInt64_Max_json_decode) {
  2767. UA_Variant out;
  2768. UA_Variant_init(&out);
  2769. UA_ByteString buf = UA_STRING("{\"Type\":9,\"Body\":18446744073709551615}");
  2770. // when
  2771. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2772. // then
  2773. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2774. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_UINT64);
  2775. ck_assert_int_eq(((u8*)(out.data))[0], 0xFF);
  2776. ck_assert_int_eq(((u8*)(out.data))[1], 0xFF);
  2777. ck_assert_int_eq(((u8*)(out.data))[2], 0xFF);
  2778. ck_assert_int_eq(((u8*)(out.data))[3], 0xFF);
  2779. ck_assert_int_eq(((u8*)(out.data))[4], 0xFF);
  2780. ck_assert_int_eq(((u8*)(out.data))[5], 0xFF);
  2781. ck_assert_int_eq(((u8*)(out.data))[6], 0xFF);
  2782. ck_assert_int_eq(((u8*)(out.data))[7], 0xFF);
  2783. UA_Variant_deleteMembers(&out);
  2784. }
  2785. END_TEST
  2786. START_TEST(UA_UInt64_Overflow_json_decode) {
  2787. UA_Variant out;
  2788. UA_Variant_init(&out);
  2789. UA_ByteString buf = UA_STRING("{\"Type\":9,\"Body\":18446744073709551616}");
  2790. // when
  2791. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2792. // then
  2793. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  2794. UA_Variant_deleteMembers(&out);
  2795. }
  2796. END_TEST
  2797. START_TEST(UA_SByte_Min_json_decode) {
  2798. UA_Variant out;
  2799. UA_Variant_init(&out);
  2800. UA_ByteString buf = UA_STRING("{\"Type\":2,\"Body\":-128}");
  2801. // when
  2802. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2803. // then
  2804. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2805. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_SBYTE);
  2806. ck_assert_int_eq(*((UA_SByte*)out.data), -128);
  2807. UA_Variant_deleteMembers(&out);
  2808. }
  2809. END_TEST
  2810. START_TEST(UA_SByte_Max_json_decode) {
  2811. UA_Variant out;
  2812. UA_Variant_init(&out);
  2813. UA_ByteString buf = UA_STRING("{\"Type\":2,\"Body\":127}");
  2814. // when
  2815. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2816. // then
  2817. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2818. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_SBYTE);
  2819. ck_assert_int_eq(*((UA_SByte*)out.data), 127);
  2820. UA_Variant_deleteMembers(&out);
  2821. }
  2822. END_TEST
  2823. START_TEST(UA_Int16_Min_json_decode) {
  2824. UA_Variant out;
  2825. UA_Variant_init(&out);
  2826. UA_ByteString buf = UA_STRING("{\"Type\":4,\"Body\":-32768}");
  2827. // when
  2828. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2829. // then
  2830. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2831. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT16);
  2832. ck_assert_int_eq(*((UA_Int16*)out.data), -32768);
  2833. UA_Variant_deleteMembers(&out);
  2834. }
  2835. END_TEST
  2836. START_TEST(UA_Int16_Max_json_decode) {
  2837. UA_Variant out;
  2838. UA_Variant_init(&out);
  2839. UA_ByteString buf = UA_STRING("{\"Type\":4,\"Body\":32767}");
  2840. // when
  2841. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2842. // then
  2843. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2844. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT16);
  2845. ck_assert_int_eq(*((UA_Int16*)out.data), 32767);
  2846. UA_Variant_deleteMembers(&out);
  2847. }
  2848. END_TEST
  2849. START_TEST(UA_Int32_Min_json_decode) {
  2850. UA_Variant out;
  2851. UA_Variant_init(&out);
  2852. UA_ByteString buf = UA_STRING("{\"Type\":6,\"Body\":-2147483648}");
  2853. // when
  2854. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2855. // then
  2856. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2857. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT32);
  2858. ck_assert(*(UA_Int32*)out.data == -2147483648);
  2859. UA_Variant_deleteMembers(&out);
  2860. }
  2861. END_TEST
  2862. START_TEST(UA_Int32_Max_json_decode) {
  2863. UA_Variant out;
  2864. UA_Variant_init(&out);
  2865. UA_ByteString buf = UA_STRING("{\"Type\":6,\"Body\":2147483647}");
  2866. // when
  2867. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2868. // then
  2869. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2870. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT32);
  2871. ck_assert_int_eq(*((UA_Int32*)out.data), 2147483647);
  2872. UA_Variant_deleteMembers(&out);
  2873. }
  2874. END_TEST
  2875. START_TEST(UA_Int64_Min_json_decode) {
  2876. UA_Variant out;
  2877. UA_Variant_init(&out);
  2878. UA_ByteString buf = UA_STRING("{\"Type\":8,\"Body\":-9223372036854775808}");
  2879. // when
  2880. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2881. // then
  2882. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2883. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT64);
  2884. ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
  2885. ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  2886. ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
  2887. ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
  2888. ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
  2889. ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
  2890. ck_assert_int_eq(((u8*)(out.data))[6], 0x00);
  2891. ck_assert_int_eq(((u8*)(out.data))[7], 0x80);
  2892. UA_Variant_deleteMembers(&out);
  2893. }
  2894. END_TEST
  2895. START_TEST(UA_Int64_Max_json_decode) {
  2896. UA_Variant out;
  2897. UA_Variant_init(&out);
  2898. UA_ByteString buf = UA_STRING("{\"Type\":8,\"Body\":9223372036854775807}");
  2899. // when
  2900. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2901. // then
  2902. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2903. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_INT64);
  2904. ck_assert_int_eq(((u8*)(out.data))[0], 0xFF);
  2905. ck_assert_int_eq(((u8*)(out.data))[1], 0xFF);
  2906. ck_assert_int_eq(((u8*)(out.data))[2], 0xFF);
  2907. ck_assert_int_eq(((u8*)(out.data))[3], 0xFF);
  2908. ck_assert_int_eq(((u8*)(out.data))[4], 0xFF);
  2909. ck_assert_int_eq(((u8*)(out.data))[5], 0xFF);
  2910. ck_assert_int_eq(((u8*)(out.data))[6], 0xFF);
  2911. ck_assert_int_eq(((u8*)(out.data))[7], 0x7F);
  2912. UA_Variant_deleteMembers(&out);
  2913. }
  2914. END_TEST
  2915. START_TEST(UA_Int64_Overflow_json_decode) {
  2916. UA_Variant out;
  2917. UA_Variant_init(&out);
  2918. UA_ByteString buf = UA_STRING("{\"Type\":8,\"Body\":9223372036854775808}");
  2919. // when
  2920. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2921. // then
  2922. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  2923. UA_Variant_deleteMembers(&out);
  2924. }
  2925. END_TEST
  2926. START_TEST(UA_Int64_TooBig_json_decode) {
  2927. UA_Variant out;
  2928. UA_Variant_init(&out);
  2929. UA_ByteString buf = UA_STRING("{\"Type\":8,\"Body\":111111111111111111111111111111}");
  2930. // when
  2931. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2932. // then
  2933. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  2934. UA_Variant_deleteMembers(&out);
  2935. }
  2936. END_TEST
  2937. START_TEST(UA_Int64_NoDigit_json_decode) {
  2938. UA_Variant out;
  2939. UA_Variant_init(&out);
  2940. UA_ByteString buf = UA_STRING("{\"Type\":8,\"Body\":a}");
  2941. // when
  2942. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2943. // then
  2944. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  2945. UA_Variant_deleteMembers(&out);
  2946. }
  2947. END_TEST
  2948. START_TEST(UA_Float_json_decode) {
  2949. UA_Variant out;
  2950. UA_Variant_init(&out);
  2951. UA_ByteString buf = UA_STRING("{\"Type\":10,\"Body\":3.1415927410}");
  2952. // when
  2953. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2954. // then
  2955. //0 10000000 10010010000111111011011 = 40 49 0f db
  2956. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2957. ck_assert_int_eq(((u8*)(out.data))[0], 0xdb);
  2958. ck_assert_int_eq(((u8*)(out.data))[1], 0x0f);
  2959. ck_assert_int_eq(((u8*)(out.data))[2], 0x49);
  2960. ck_assert_int_eq(((u8*)(out.data))[3], 0x40);
  2961. UA_Variant_deleteMembers(&out);
  2962. }
  2963. END_TEST
  2964. START_TEST(UA_Float_json_one_decode) {
  2965. UA_Variant out;
  2966. UA_Variant_init(&out);
  2967. UA_ByteString buf = UA_STRING("{\"Type\":10,\"Body\":1}");
  2968. // when
  2969. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2970. // then
  2971. //0 01111111 00000000000000000000000 = 3f80 0000
  2972. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2973. ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
  2974. ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  2975. ck_assert_int_eq(((u8*)(out.data))[2], 0x80);
  2976. ck_assert_int_eq(((u8*)(out.data))[3], 0x3f);
  2977. UA_Variant_deleteMembers(&out);
  2978. }
  2979. END_TEST
  2980. START_TEST(UA_Float_json_inf_decode) {
  2981. UA_Variant out;
  2982. UA_Variant_init(&out);
  2983. UA_ByteString buf = UA_STRING("{\"Type\":10,\"Body\":\"Infinity\"}");
  2984. // when
  2985. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  2986. // then
  2987. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  2988. ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
  2989. ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  2990. ck_assert_int_eq(((u8*)(out.data))[2], 0x80);
  2991. ck_assert_int_eq(((u8*)(out.data))[3], 0x7f);
  2992. UA_Variant_deleteMembers(&out);
  2993. }
  2994. END_TEST
  2995. START_TEST(UA_Float_json_neginf_decode) {
  2996. UA_Variant out;
  2997. UA_Variant_init(&out);
  2998. UA_ByteString buf = UA_STRING("{\"Type\":10,\"Body\":\"-Infinity\"}");
  2999. // when
  3000. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3001. // then
  3002. //0 01111111 00000000000000000000000 = 3f80 0000
  3003. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3004. ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
  3005. ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  3006. ck_assert_int_eq(((u8*)(out.data))[2], 0x80);
  3007. ck_assert_int_eq(((u8*)(out.data))[3], 0xff);
  3008. UA_Variant_deleteMembers(&out);
  3009. }
  3010. END_TEST
  3011. START_TEST(UA_Float_json_nan_decode) {
  3012. UA_Variant out;
  3013. UA_Variant_init(&out);
  3014. UA_ByteString buf = UA_STRING("{\"Type\":10,\"Body\":\"NaN\"}");
  3015. // when
  3016. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3017. // then
  3018. //0 01111111 00000000000000000000000 = 3f80 0000
  3019. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3020. //ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
  3021. //ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  3022. //ck_assert_int_eq(((u8*)(out.data))[2], 0x80);
  3023. //ck_assert_int_eq(((u8*)(out.data))[3], 0x3f);
  3024. UA_Float val = *((UA_Float*)out.data);
  3025. ck_assert(val != val);
  3026. UA_Variant_deleteMembers(&out);
  3027. }
  3028. END_TEST
  3029. START_TEST(UA_Float_json_negnan_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); /* check if not a number */
  3044. UA_Variant_deleteMembers(&out);
  3045. }
  3046. END_TEST
  3047. START_TEST(UA_Double_json_decode) {
  3048. UA_Variant out;
  3049. UA_Variant_init(&out);
  3050. UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":1.1234}");
  3051. // when
  3052. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3053. // then
  3054. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3055. ck_assert_int_eq(((u8*)(out.data))[0], 0xef);
  3056. ck_assert_int_eq(((u8*)(out.data))[1], 0x38);
  3057. ck_assert_int_eq(((u8*)(out.data))[2], 0x45);
  3058. ck_assert_int_eq(((u8*)(out.data))[3], 0x47);
  3059. ck_assert_int_eq(((u8*)(out.data))[4], 0x72);
  3060. ck_assert_int_eq(((u8*)(out.data))[5], 0xf9);
  3061. ck_assert_int_eq(((u8*)(out.data))[6], 0xf1);
  3062. ck_assert_int_eq(((u8*)(out.data))[7], 0x3f);
  3063. UA_Variant_deleteMembers(&out);
  3064. }
  3065. END_TEST
  3066. START_TEST(UA_Double_corrupt_json_decode) {
  3067. UA_Variant out;
  3068. UA_Variant_init(&out);
  3069. UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":1.12.34}");
  3070. // when
  3071. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3072. // then
  3073. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  3074. UA_Variant_deleteMembers(&out);
  3075. }
  3076. END_TEST
  3077. START_TEST(UA_Double_one_json_decode) {
  3078. UA_Variant out;
  3079. UA_Variant_init(&out);
  3080. //UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":1}");
  3081. UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":1}");
  3082. // when
  3083. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3084. // then
  3085. // 0 01111111111 0000000000000000000000000000000000000000000000000000
  3086. // 3FF0000000000000
  3087. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3088. ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
  3089. ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  3090. ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
  3091. ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
  3092. ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
  3093. ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
  3094. ck_assert_int_eq(((u8*)(out.data))[6], 0xF0);
  3095. ck_assert_int_eq(((u8*)(out.data))[7], 0x3F);
  3096. UA_Variant_deleteMembers(&out);
  3097. }
  3098. END_TEST
  3099. START_TEST(UA_Double_onepointsmallest_json_decode) {
  3100. UA_Variant out;
  3101. UA_Variant_init(&out);
  3102. UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":1.0000000000000002}");
  3103. // when
  3104. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3105. // then
  3106. // 0 01111111111 0000000000000000000000000000000000000000000000000001
  3107. // 3FF0000000000001
  3108. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3109. ck_assert_int_eq(((u8*)(out.data))[0], 0x01);
  3110. ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  3111. ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
  3112. ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
  3113. ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
  3114. ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
  3115. ck_assert_int_eq(((u8*)(out.data))[6], 0xF0);
  3116. ck_assert_int_eq(((u8*)(out.data))[7], 0x3F);
  3117. UA_Variant_deleteMembers(&out);
  3118. }
  3119. END_TEST
  3120. START_TEST(UA_Double_nan_json_decode) {
  3121. UA_Variant out;
  3122. UA_Variant_init(&out);
  3123. UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":\"NaN\"}");
  3124. // when
  3125. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3126. // then
  3127. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3128. UA_Double val = *((UA_Double*)out.data);
  3129. ck_assert(val != val); /* check if not a number */
  3130. UA_Variant_deleteMembers(&out);
  3131. }
  3132. END_TEST
  3133. START_TEST(UA_Double_negnan_json_decode) {
  3134. UA_Variant out;
  3135. UA_Variant_init(&out);
  3136. UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":\"-NaN\"}");
  3137. // when
  3138. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3139. // then
  3140. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3141. UA_Double val = *((UA_Double*)out.data);
  3142. ck_assert(val != val); /* check if not a number */
  3143. UA_Variant_deleteMembers(&out);
  3144. }
  3145. END_TEST
  3146. START_TEST(UA_Double_inf_json_decode) {
  3147. UA_Variant out;
  3148. UA_Variant_init(&out);
  3149. UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":\"Infinity\"}");
  3150. // when
  3151. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3152. // then
  3153. // 0 111 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
  3154. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3155. ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
  3156. ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  3157. ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
  3158. ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
  3159. ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
  3160. ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
  3161. ck_assert_int_eq(((u8*)(out.data))[6], 0xF0);
  3162. ck_assert_int_eq(((u8*)(out.data))[7], 0x7F);
  3163. UA_Variant_deleteMembers(&out);
  3164. }
  3165. END_TEST
  3166. START_TEST(UA_Double_neginf_json_decode) {
  3167. UA_Variant out;
  3168. UA_Variant_init(&out);
  3169. UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":\"-Infinity\"}");
  3170. // when
  3171. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3172. // then
  3173. // 1 111 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
  3174. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3175. ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
  3176. ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  3177. ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
  3178. ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
  3179. ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
  3180. ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
  3181. ck_assert_int_eq(((u8*)(out.data))[6], 0xF0);
  3182. ck_assert_int_eq(((u8*)(out.data))[7], 0xFF);
  3183. UA_Variant_deleteMembers(&out);
  3184. }
  3185. END_TEST
  3186. START_TEST(UA_Double_zero_json_decode) {
  3187. UA_Variant out;
  3188. UA_Variant_init(&out);
  3189. UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":0}");
  3190. // when
  3191. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3192. // then
  3193. // 0 000 0000 0000 0000 0000 0000 00000000 00000000 00000000 00000000 00000000
  3194. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3195. ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
  3196. ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  3197. ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
  3198. ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
  3199. ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
  3200. ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
  3201. ck_assert_int_eq(((u8*)(out.data))[6], 0x00);
  3202. ck_assert_int_eq(((u8*)(out.data))[7], 0x00);
  3203. UA_Variant_deleteMembers(&out);
  3204. }
  3205. END_TEST
  3206. START_TEST(UA_Double_negzero_json_decode) {
  3207. UA_Variant out;
  3208. UA_Variant_init(&out);
  3209. UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":-0}");
  3210. // when
  3211. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3212. // then
  3213. // 1 000 0000 0000 0000 00000000 00000000 00000000 00000000 00000000 00000000
  3214. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3215. ck_assert_int_eq(((u8*)(out.data))[0], 0x00);
  3216. ck_assert_int_eq(((u8*)(out.data))[1], 0x00);
  3217. ck_assert_int_eq(((u8*)(out.data))[2], 0x00);
  3218. ck_assert_int_eq(((u8*)(out.data))[3], 0x00);
  3219. ck_assert_int_eq(((u8*)(out.data))[4], 0x00);
  3220. ck_assert_int_eq(((u8*)(out.data))[5], 0x00);
  3221. ck_assert_int_eq(((u8*)(out.data))[6], 0x00);
  3222. ck_assert_int_eq(((u8*)(out.data))[7], 0x80);
  3223. UA_Variant_deleteMembers(&out);
  3224. }
  3225. END_TEST
  3226. START_TEST(UA_String_json_decode) {
  3227. UA_Variant out;
  3228. UA_Variant_init(&out);
  3229. UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"abcdef\"}");
  3230. // when
  3231. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3232. // then
  3233. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3234. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING);
  3235. ck_assert_int_eq( ((UA_String*)out.data)->length, 6);
  3236. ck_assert_int_eq( ((UA_String*)out.data)->data[0], 'a');
  3237. ck_assert_int_eq(((UA_String*)out.data)->data[1], 'b');
  3238. ck_assert_int_eq(((UA_String*)out.data)->data[2], 'c');
  3239. ck_assert_int_eq(((UA_String*)out.data)->data[3], 'd');
  3240. ck_assert_int_eq(((UA_String*)out.data)->data[4], 'e');
  3241. ck_assert_int_eq(((UA_String*)out.data)->data[5], 'f');
  3242. UA_Variant_deleteMembers(&out);
  3243. }
  3244. END_TEST
  3245. START_TEST(UA_String_empty_json_decode) {
  3246. UA_Variant out;
  3247. UA_Variant_init(&out);
  3248. UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"\"}");
  3249. // when
  3250. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3251. // then
  3252. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3253. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING);
  3254. ck_assert_int_eq( ((UA_String*)out.data)->length, 0);
  3255. ck_assert_ptr_eq( ((UA_String*)out.data)->data, UA_EMPTY_ARRAY_SENTINEL);
  3256. UA_Variant_deleteMembers(&out);
  3257. }
  3258. END_TEST
  3259. START_TEST(UA_String_unescapeBS_json_decode) {
  3260. UA_Variant out;
  3261. UA_Variant_init(&out);
  3262. UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"ab\\tcdef\"}");
  3263. // when
  3264. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3265. // then
  3266. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3267. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING);
  3268. ck_assert_int_eq( ((UA_String*)out.data)->length, 7);
  3269. ck_assert_int_eq( ((UA_String*)out.data)->data[0], 'a');
  3270. ck_assert_int_eq(((UA_String*)out.data)->data[1], 'b');
  3271. ck_assert_int_eq(((UA_String*)out.data)->data[2], '\t');
  3272. ck_assert_int_eq(((UA_String*)out.data)->data[3], 'c');
  3273. ck_assert_int_eq(((UA_String*)out.data)->data[4], 'd');
  3274. ck_assert_int_eq(((UA_String*)out.data)->data[5], 'e');
  3275. ck_assert_int_eq(((UA_String*)out.data)->data[6], 'f');
  3276. UA_Variant_deleteMembers(&out);
  3277. }
  3278. END_TEST
  3279. START_TEST(UA_String_escape_unicode_json_decode) {
  3280. UA_Variant out;
  3281. UA_Variant_init(&out);
  3282. UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"\\u002c\"}");
  3283. // when
  3284. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3285. // then
  3286. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3287. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING);
  3288. ck_assert_int_eq( ((UA_String*)out.data)->length, 1);
  3289. ck_assert_int_eq( ((UA_String*)out.data)->data[0], ',');
  3290. UA_Variant_deleteMembers(&out);
  3291. }
  3292. END_TEST
  3293. START_TEST(UA_String_escape2_json_decode) {
  3294. UA_Variant out;
  3295. UA_Variant_init(&out);
  3296. UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"\\b\\th\\\"e\\fl\\nl\\\\o\\r\"}");
  3297. // when
  3298. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3299. // then
  3300. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3301. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING);
  3302. ck_assert_int_eq( ((UA_String*)out.data)->length, 12);// \b\th\"e\fl\nl\\o\r
  3303. ck_assert_int_eq( ((UA_String*)out.data)->data[0], '\b');
  3304. ck_assert_int_eq( ((UA_String*)out.data)->data[1], '\t');
  3305. ck_assert_int_eq( ((UA_String*)out.data)->data[2], 'h');
  3306. ck_assert_int_eq( ((UA_String*)out.data)->data[3], '\"');
  3307. ck_assert_int_eq( ((UA_String*)out.data)->data[4], 'e');
  3308. ck_assert_int_eq( ((UA_String*)out.data)->data[5], '\f');
  3309. ck_assert_int_eq( ((UA_String*)out.data)->data[6], 'l');
  3310. ck_assert_int_eq( ((UA_String*)out.data)->data[7], '\n');
  3311. ck_assert_int_eq( ((UA_String*)out.data)->data[8], 'l');
  3312. ck_assert_int_eq( ((UA_String*)out.data)->data[9], '\\');
  3313. ck_assert_int_eq( ((UA_String*)out.data)->data[10], 'o');
  3314. ck_assert_int_eq( ((UA_String*)out.data)->data[11], '\r');
  3315. UA_Variant_deleteMembers(&out);
  3316. }
  3317. END_TEST
  3318. START_TEST(UA_String_surrogatePair_json_decode) {
  3319. UA_Variant out;
  3320. UA_Variant_init(&out);
  3321. UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":\"\\uD800\\uDC00\"}");
  3322. // when
  3323. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3324. // then
  3325. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3326. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING);
  3327. ck_assert_int_eq( ((UA_String*)out.data)->length, 4);//U+10000 => 0xF0 0x90 0x80 0x80
  3328. ck_assert_uint_eq( ((UA_String*)out.data)->data[0], 0xF0);
  3329. ck_assert_uint_eq( ((UA_String*)out.data)->data[1], 0x90);
  3330. ck_assert_uint_eq( ((UA_String*)out.data)->data[2], 0x80);
  3331. ck_assert_uint_eq( ((UA_String*)out.data)->data[3], 0x80);
  3332. UA_Variant_deleteMembers(&out);
  3333. }
  3334. END_TEST
  3335. /* ---------------ByteString---------------------------*/
  3336. START_TEST(UA_ByteString_json_decode) {
  3337. UA_Variant out;
  3338. UA_Variant_init(&out);
  3339. UA_ByteString buf = UA_STRING("{\"Type\":15,\"Body\":\"YXNkZmFzZGY=\"}");
  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_BYTESTRING);
  3345. ck_assert_int_eq(((UA_ByteString*)out.data)->length, 8);
  3346. ck_assert_int_eq(((UA_ByteString*)out.data)->data[0], 'a');
  3347. ck_assert_int_eq(((UA_ByteString*)out.data)->data[1], 's');
  3348. ck_assert_int_eq(((UA_ByteString*)out.data)->data[2], 'd');
  3349. ck_assert_int_eq(((UA_ByteString*)out.data)->data[3], 'f');
  3350. ck_assert_int_eq(((UA_ByteString*)out.data)->data[4], 'a');
  3351. ck_assert_int_eq(((UA_ByteString*)out.data)->data[5], 's');
  3352. ck_assert_int_eq(((UA_ByteString*)out.data)->data[6], 'd');
  3353. ck_assert_int_eq(((UA_ByteString*)out.data)->data[7], 'f');
  3354. UA_Variant_deleteMembers(&out);
  3355. }
  3356. END_TEST
  3357. START_TEST(UA_ByteString_bad_json_decode) {
  3358. UA_ByteString out;
  3359. UA_ByteString_init(&out);
  3360. UA_ByteString buf = UA_STRING("\"\x90!\xc5 c{\",");
  3361. // when
  3362. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_BYTESTRING]);
  3363. // then
  3364. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3365. UA_ByteString_deleteMembers(&out);
  3366. }
  3367. END_TEST
  3368. START_TEST(UA_ByteString_null_json_decode) {
  3369. UA_Variant out;
  3370. UA_Variant_init(&out);
  3371. UA_ByteString buf = UA_STRING("{\"Type\":15,\"Body\":null}");
  3372. // when
  3373. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3374. // then
  3375. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3376. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_BYTESTRING);
  3377. ck_assert_ptr_eq(out.data, NULL);
  3378. UA_Variant_deleteMembers(&out);
  3379. }
  3380. END_TEST
  3381. /* ---------GUID--------------------------- */
  3382. START_TEST(UA_Guid_json_decode) {
  3383. UA_Variant out;
  3384. UA_Variant_init(&out);
  3385. UA_ByteString buf = UA_STRING("{\"Type\":14,\"Body\":\"00000001-0002-0003-0405-060708090A0B\"}");
  3386. // when
  3387. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3388. // then
  3389. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3390. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_GUID);
  3391. ck_assert_int_eq(((UA_Guid*)out.data)->data1, 1);
  3392. ck_assert_int_eq(((UA_Guid*)out.data)->data2, 2);
  3393. ck_assert_int_eq(((UA_Guid*)out.data)->data3, 3);
  3394. ck_assert_int_eq(((UA_Guid*)out.data)->data4[0], 4);
  3395. ck_assert_int_eq(((UA_Guid*)out.data)->data4[1], 5);
  3396. ck_assert_int_eq(((UA_Guid*)out.data)->data4[2], 6);
  3397. ck_assert_int_eq(((UA_Guid*)out.data)->data4[3], 7);
  3398. ck_assert_int_eq(((UA_Guid*)out.data)->data4[4], 8);
  3399. ck_assert_int_eq(((UA_Guid*)out.data)->data4[5], 9);
  3400. ck_assert_int_eq(((UA_Guid*)out.data)->data4[6], 10);
  3401. ck_assert_int_eq(((UA_Guid*)out.data)->data4[7], 11);
  3402. UA_Variant_deleteMembers(&out);
  3403. }
  3404. END_TEST
  3405. START_TEST(UA_Guid_lower_json_decode) {
  3406. UA_Variant out;
  3407. UA_Variant_init(&out);
  3408. UA_ByteString buf = UA_STRING("{\"Type\":14,\"Body\":\"00000001-0002-0003-0405-060708090a0b\"}");
  3409. // when
  3410. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3411. // then
  3412. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3413. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_GUID);
  3414. ck_assert_int_eq(((UA_Guid*)out.data)->data1, 1);
  3415. ck_assert_int_eq(((UA_Guid*)out.data)->data2, 2);
  3416. ck_assert_int_eq(((UA_Guid*)out.data)->data3, 3);
  3417. ck_assert_int_eq(((UA_Guid*)out.data)->data4[0], 4);
  3418. ck_assert_int_eq(((UA_Guid*)out.data)->data4[1], 5);
  3419. ck_assert_int_eq(((UA_Guid*)out.data)->data4[2], 6);
  3420. ck_assert_int_eq(((UA_Guid*)out.data)->data4[3], 7);
  3421. ck_assert_int_eq(((UA_Guid*)out.data)->data4[4], 8);
  3422. ck_assert_int_eq(((UA_Guid*)out.data)->data4[5], 9);
  3423. ck_assert_int_eq(((UA_Guid*)out.data)->data4[6], 10);
  3424. ck_assert_int_eq(((UA_Guid*)out.data)->data4[7], 11);
  3425. UA_Variant_deleteMembers(&out);
  3426. }
  3427. END_TEST
  3428. START_TEST(UA_Guid_tooShort_json_decode) {
  3429. UA_Variant out;
  3430. UA_Variant_init(&out);
  3431. UA_ByteString buf = UA_STRING("{\"Type\":14,\"Body\":\"00000001-00\"}");
  3432. // when
  3433. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3434. // then
  3435. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  3436. UA_Variant_deleteMembers(&out);
  3437. }
  3438. END_TEST
  3439. START_TEST(UA_Guid_tooLong_json_decode) {
  3440. UA_Variant out;
  3441. UA_Variant_init(&out);
  3442. UA_ByteString buf = UA_STRING("{\"Type\":14,\"Body\":\"00000001-0002-0003-0405-060708090A0B00000001\"}");
  3443. // when
  3444. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3445. // then
  3446. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  3447. UA_Variant_deleteMembers(&out);
  3448. }
  3449. END_TEST
  3450. START_TEST(UA_Guid_wrong_json_decode) {
  3451. UA_Variant out;
  3452. UA_Variant_init(&out);
  3453. UA_ByteString buf = UA_STRING("{\"Type\":14,\"Body\":\"00000=01-0002-0003-0405-060708090A0B\"}");
  3454. // when
  3455. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3456. // then
  3457. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  3458. UA_Variant_deleteMembers(&out);
  3459. }
  3460. END_TEST
  3461. /* ------Statuscode----------- */
  3462. START_TEST(UA_StatusCode_2_json_decode) {
  3463. UA_Variant out;
  3464. UA_Variant_init(&out);
  3465. UA_ByteString buf = UA_STRING("{\"Type\":19,\"Body\":2}");
  3466. // when
  3467. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3468. // then
  3469. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3470. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STATUSCODE);
  3471. ck_assert_uint_eq(*((UA_StatusCode*)out.data), 2);
  3472. UA_Variant_deleteMembers(&out);
  3473. }
  3474. END_TEST
  3475. START_TEST(UA_StatusCode_3_json_decode) {
  3476. UA_Variant out;
  3477. UA_Variant_init(&out);
  3478. UA_ByteString buf = UA_STRING("{\"Type\":19,\"Body\":222222222222222222222222222222222222}");
  3479. // when
  3480. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3481. // then
  3482. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  3483. UA_Variant_deleteMembers(&out);
  3484. }
  3485. END_TEST
  3486. START_TEST(UA_StatusCode_0_json_decode) {
  3487. UA_Variant out;
  3488. UA_Variant_init(&out);
  3489. UA_ByteString buf = UA_STRING("{\"Type\":19,\"Body\":0}");
  3490. // when
  3491. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3492. // then
  3493. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3494. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STATUSCODE);
  3495. ck_assert_uint_eq(*((UA_StatusCode*)out.data), 0);
  3496. UA_Variant_deleteMembers(&out);
  3497. }
  3498. END_TEST
  3499. /* ----------DateTime---------------- */
  3500. START_TEST(UA_DateTime_json_decode) {
  3501. // given
  3502. UA_DateTime out;
  3503. UA_DateTime_init(&out);
  3504. UA_ByteString buf = UA_STRING("\"1970-01-02T01:02:03.005Z\"");
  3505. // when
  3506. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DATETIME]);
  3507. // then
  3508. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3509. UA_DateTimeStruct dts = UA_DateTime_toStruct(out);
  3510. ck_assert_int_eq(dts.year, 1970);
  3511. ck_assert_int_eq(dts.month, 1);
  3512. ck_assert_int_eq(dts.day, 2);
  3513. ck_assert_int_eq(dts.hour, 1);
  3514. ck_assert_int_eq(dts.min, 2);
  3515. ck_assert_int_eq(dts.sec, 3);
  3516. ck_assert_int_eq(dts.milliSec, 5);
  3517. ck_assert_int_eq(dts.microSec, 0);
  3518. ck_assert_int_eq(dts.nanoSec, 0);
  3519. UA_DateTime_deleteMembers(&out);
  3520. }
  3521. END_TEST
  3522. START_TEST(UA_DateTime_micro_json_decode) {
  3523. // given
  3524. UA_DateTime out;
  3525. UA_DateTime_init(&out);
  3526. UA_ByteString buf = UA_STRING("\"1970-01-02T01:02:03.042Z\"");
  3527. // when
  3528. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DATETIME]);
  3529. // then
  3530. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3531. UA_DateTimeStruct dts = UA_DateTime_toStruct(out);
  3532. ck_assert_int_eq(dts.year, 1970);
  3533. ck_assert_int_eq(dts.month, 1);
  3534. ck_assert_int_eq(dts.day, 2);
  3535. ck_assert_int_eq(dts.hour, 1);
  3536. ck_assert_int_eq(dts.min, 2);
  3537. ck_assert_int_eq(dts.sec, 3);
  3538. ck_assert_int_eq(dts.milliSec, 42);
  3539. ck_assert_int_eq(dts.microSec, 0);
  3540. ck_assert_int_eq(dts.nanoSec, 0);
  3541. UA_DateTime_deleteMembers(&out);
  3542. }
  3543. END_TEST
  3544. /* ---------------QualifiedName----------------------- */
  3545. START_TEST(UA_QualifiedName_json_decode) {
  3546. // given
  3547. UA_QualifiedName out;
  3548. UA_QualifiedName_init(&out);
  3549. UA_ByteString buf = UA_STRING("{\"Name\":\"derName\",\"Uri\":1}");
  3550. // when
  3551. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_QUALIFIEDNAME]);
  3552. // then
  3553. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3554. ck_assert_int_eq(out.name.length, 7);
  3555. ck_assert_int_eq(out.name.data[1], 'e');
  3556. ck_assert_int_eq(out.name.data[6], 'e');
  3557. ck_assert_int_eq(out.namespaceIndex, 1);
  3558. UA_QualifiedName_deleteMembers(&out);
  3559. }
  3560. END_TEST
  3561. START_TEST(UA_QualifiedName_null_json_decode) {
  3562. UA_Variant out;
  3563. UA_Variant_init(&out);
  3564. UA_ByteString buf = UA_STRING("{\"Type\":20,\"Body\":null}");
  3565. // when
  3566. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3567. // then
  3568. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3569. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_QUALIFIEDNAME);
  3570. ck_assert_ptr_eq(out.data, NULL);
  3571. UA_Variant_deleteMembers(&out);
  3572. }
  3573. END_TEST
  3574. /* --------LocalizedText------------ */
  3575. START_TEST(UA_LocalizedText_json_decode) {
  3576. // given
  3577. UA_LocalizedText out;
  3578. UA_LocalizedText_init(&out);
  3579. UA_ByteString buf = UA_STRING("{\"Locale\":\"t1\",\"Text\":\"t2\"}");
  3580. // when
  3581. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
  3582. // then
  3583. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3584. ck_assert_int_eq(out.locale.data[0], 't');
  3585. ck_assert_int_eq(out.text.data[0], 't');
  3586. ck_assert_int_eq(out.locale.data[1], '1');
  3587. ck_assert_int_eq(out.text.data[1], '2');
  3588. UA_LocalizedText_deleteMembers(&out);
  3589. }
  3590. END_TEST
  3591. START_TEST(UA_LocalizedText_missing_json_decode) {
  3592. // given
  3593. UA_LocalizedText out;
  3594. UA_LocalizedText_init(&out);
  3595. UA_ByteString buf = UA_STRING("{\"Locale\":\"t1\"}");
  3596. // when
  3597. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_LOCALIZEDTEXT]);
  3598. // then
  3599. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3600. ck_assert_int_eq(out.locale.length, 2);
  3601. ck_assert_int_eq(out.locale.data[0], 't');
  3602. ck_assert_int_eq(out.locale.data[1], '1');
  3603. ck_assert_ptr_eq(out.text.data, NULL);
  3604. ck_assert_int_eq(out.text.length, 0);
  3605. UA_LocalizedText_deleteMembers(&out);
  3606. }
  3607. END_TEST
  3608. START_TEST(UA_LocalizedText_null_json_decode) {
  3609. UA_Variant out;
  3610. UA_Variant_init(&out);
  3611. UA_ByteString buf = UA_STRING("{\"Type\":21,\"Body\":null}");
  3612. // when
  3613. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3614. // then
  3615. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3616. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_LOCALIZEDTEXT);
  3617. ck_assert_ptr_eq(out.data, NULL);
  3618. UA_Variant_deleteMembers(&out);
  3619. }
  3620. END_TEST
  3621. START_TEST(UA_ViewDescription_json_decode) {
  3622. // given
  3623. UA_ViewDescription out;
  3624. UA_ViewDescription_init(&out);
  3625. UA_ByteString buf = UA_STRING("{\"Timestamp\":\"1970-01-15T06:56:07Z\",\"ViewVersion\":1236,\"ViewId\":{\"Id\":\"00000009-0002-027C-F3BF-BB7BEEFEEFBE\",\"IdType\":2}}");
  3626. // when
  3627. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VIEWDESCRIPTION]);
  3628. // then
  3629. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3630. ck_assert_int_eq(out.viewVersion, 1236);
  3631. ck_assert_int_eq(out.viewId.identifierType, UA_NODEIDTYPE_GUID);
  3632. UA_DateTimeStruct dts = UA_DateTime_toStruct(out.timestamp);
  3633. ck_assert_int_eq(dts.year, 1970);
  3634. ck_assert_int_eq(dts.month, 1);
  3635. ck_assert_int_eq(dts.day, 15);
  3636. ck_assert_int_eq(dts.hour, 6);
  3637. ck_assert_int_eq(dts.min, 56);
  3638. ck_assert_int_eq(dts.sec, 7);
  3639. ck_assert_int_eq(dts.milliSec, 0);
  3640. ck_assert_int_eq(dts.microSec, 0);
  3641. ck_assert_int_eq(dts.nanoSec, 0);
  3642. ck_assert_int_eq(out.viewId.identifier.guid.data1, 9);
  3643. ck_assert_int_eq(out.viewId.identifier.guid.data2, 2);
  3644. UA_ViewDescription_deleteMembers(&out);
  3645. }
  3646. END_TEST
  3647. /* -----------------NodeId----------------------------- */
  3648. START_TEST(UA_NodeId_Nummeric_json_decode) {
  3649. // given
  3650. UA_NodeId out;
  3651. UA_NodeId_init(&out);
  3652. UA_ByteString buf = UA_STRING("{\"Id\":42}");
  3653. // when
  3654. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_NODEID]);
  3655. // then
  3656. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3657. ck_assert_int_eq(out.identifier.numeric, 42);
  3658. ck_assert_int_eq(out.namespaceIndex, 0);
  3659. ck_assert_int_eq(out.identifierType, UA_NODEIDTYPE_NUMERIC);
  3660. UA_NodeId_deleteMembers(&out);
  3661. }
  3662. END_TEST
  3663. START_TEST(UA_NodeId_Nummeric_Namespace_json_decode) {
  3664. // given
  3665. UA_NodeId out;
  3666. UA_NodeId_init(&out);
  3667. UA_ByteString buf = UA_STRING("{\"Id\":42,\"Namespace\":123}");
  3668. // when
  3669. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_NODEID]);
  3670. // then
  3671. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3672. ck_assert_int_eq(out.identifier.numeric, 42);
  3673. ck_assert_int_eq(out.namespaceIndex, 123);
  3674. ck_assert_int_eq(out.identifierType, UA_NODEIDTYPE_NUMERIC);
  3675. UA_NodeId_deleteMembers(&out);
  3676. }
  3677. END_TEST
  3678. START_TEST(UA_NodeId_String_json_decode) {
  3679. // given
  3680. UA_NodeId out;
  3681. UA_NodeId_init(&out);
  3682. UA_ByteString buf = UA_STRING("{\"IdType\":1,\"Id\":\"test123\"}");
  3683. // when
  3684. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_NODEID]);
  3685. // then
  3686. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3687. ck_assert_int_eq(out.identifier.string.length, 7);
  3688. ck_assert_int_eq(out.identifier.string.data[0], 't');
  3689. ck_assert_int_eq(out.identifier.string.data[1], 'e');
  3690. ck_assert_int_eq(out.identifier.string.data[2], 's');
  3691. ck_assert_int_eq(out.identifier.string.data[3], 't');
  3692. ck_assert_int_eq(out.identifier.string.data[4], '1');
  3693. ck_assert_int_eq(out.identifier.string.data[5], '2');
  3694. ck_assert_int_eq(out.identifier.string.data[6], '3');
  3695. ck_assert_int_eq(out.namespaceIndex, 0);
  3696. ck_assert_int_eq(out.identifierType, UA_NODEIDTYPE_STRING);
  3697. UA_NodeId_deleteMembers(&out);
  3698. }
  3699. END_TEST
  3700. START_TEST(UA_NodeId_Guid_json_decode) {
  3701. // given
  3702. UA_NodeId out;
  3703. UA_NodeId_init(&out);
  3704. UA_ByteString buf = UA_STRING("{\"IdType\":2,\"Id\":\"00000001-0002-0003-0405-060708090A0B\"}");
  3705. // when
  3706. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_NODEID]);
  3707. // then
  3708. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3709. ck_assert_int_eq(out.namespaceIndex, 0);
  3710. ck_assert_int_eq(out.identifierType, UA_NODEIDTYPE_GUID);
  3711. ck_assert_int_eq(out.identifier.guid.data1, 1);
  3712. ck_assert_int_eq(out.identifier.guid.data2, 2);
  3713. ck_assert_int_eq(out.identifier.guid.data3, 3);
  3714. ck_assert_int_eq(out.identifier.guid.data4[0], 4);
  3715. ck_assert_int_eq(out.identifier.guid.data4[1], 5);
  3716. ck_assert_int_eq(out.identifier.guid.data4[2], 6);
  3717. ck_assert_int_eq(out.identifier.guid.data4[3], 7);
  3718. ck_assert_int_eq(out.identifier.guid.data4[4], 8);
  3719. ck_assert_int_eq(out.identifier.guid.data4[5], 9);
  3720. ck_assert_int_eq(out.identifier.guid.data4[6], 10);
  3721. ck_assert_int_eq(out.identifier.guid.data4[7], 11);
  3722. UA_NodeId_deleteMembers(&out);
  3723. }
  3724. END_TEST
  3725. START_TEST(UA_NodeId_ByteString_json_decode) {
  3726. // given
  3727. UA_NodeId out;
  3728. UA_NodeId_init(&out);
  3729. UA_ByteString buf = UA_STRING("{\"IdType\":3,\"Id\":\"YXNkZmFzZGY=\"}");
  3730. // when
  3731. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_NODEID]);
  3732. // then
  3733. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3734. ck_assert_int_eq(out.namespaceIndex, 0);
  3735. ck_assert_int_eq(out.identifierType, UA_NODEIDTYPE_BYTESTRING);
  3736. ck_assert_int_eq(out.identifier.byteString.length, 8);
  3737. ck_assert_int_eq(out.identifier.byteString.data[0], 'a');
  3738. ck_assert_int_eq(out.identifier.byteString.data[1], 's');
  3739. ck_assert_int_eq(out.identifier.byteString.data[2], 'd');
  3740. ck_assert_int_eq(out.identifier.byteString.data[3], 'f');
  3741. ck_assert_int_eq(out.identifier.byteString.data[4], 'a');
  3742. ck_assert_int_eq(out.identifier.byteString.data[5], 's');
  3743. ck_assert_int_eq(out.identifier.byteString.data[6], 'd');
  3744. ck_assert_int_eq(out.identifier.byteString.data[7], 'f');
  3745. UA_NodeId_deleteMembers(&out);
  3746. }
  3747. END_TEST
  3748. /* -----------------------ExpandedNodeId---------------------------*/
  3749. START_TEST(UA_ExpandedNodeId_Nummeric_json_decode) {
  3750. // given
  3751. UA_ExpandedNodeId out;
  3752. UA_ExpandedNodeId_init(&out);
  3753. UA_ByteString buf = UA_STRING("{\"Id\":42}");
  3754. // when
  3755. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
  3756. // then
  3757. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3758. ck_assert_int_eq(out.nodeId.identifier.numeric, 42);
  3759. ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_NUMERIC);
  3760. ck_assert_ptr_eq(out.namespaceUri.data, NULL);
  3761. ck_assert_int_eq(out.namespaceUri.length, 0);
  3762. ck_assert_int_eq(out.serverIndex, 0);
  3763. UA_ExpandedNodeId_deleteMembers(&out);
  3764. }
  3765. END_TEST
  3766. START_TEST(UA_ExpandedNodeId_String_json_decode) {
  3767. // given
  3768. UA_ExpandedNodeId out;
  3769. UA_ExpandedNodeId_init(&out);
  3770. UA_ByteString buf = UA_STRING("{\"IdType\":1,\"Id\":\"test\"}");
  3771. // when
  3772. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
  3773. // then
  3774. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3775. ck_assert_int_eq(out.nodeId.identifier.string.length, 4);
  3776. ck_assert_int_eq(out.nodeId.identifier.string.data[0], 't');
  3777. ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_STRING);
  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_Namespace_json_decode) {
  3785. // given
  3786. UA_ExpandedNodeId out;
  3787. UA_ExpandedNodeId_init(&out);
  3788. UA_ByteString buf = UA_STRING("{\"IdType\":1,\"Id\":\"test\",\"Namespace\":\"abcdef\"}");
  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.identifier.string.data[1], 'e');
  3796. ck_assert_int_eq(out.nodeId.identifier.string.data[2], 's');
  3797. ck_assert_int_eq(out.nodeId.identifier.string.data[3], 't');
  3798. ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_STRING);
  3799. ck_assert_int_eq(out.namespaceUri.length, 6);
  3800. ck_assert_int_eq(out.namespaceUri.data[0], 'a');
  3801. ck_assert_int_eq(out.namespaceUri.data[1], 'b');
  3802. ck_assert_int_eq(out.namespaceUri.data[2], 'c');
  3803. ck_assert_int_eq(out.namespaceUri.data[3], 'd');
  3804. ck_assert_int_eq(out.namespaceUri.data[4], 'e');
  3805. ck_assert_int_eq(out.namespaceUri.data[5], 'f');
  3806. ck_assert_int_eq(out.serverIndex, 0);
  3807. UA_ExpandedNodeId_deleteMembers(&out);
  3808. }
  3809. END_TEST
  3810. START_TEST(UA_ExpandedNodeId_String_NamespaceAsIndex_json_decode) {
  3811. // given
  3812. UA_ExpandedNodeId out;
  3813. UA_ExpandedNodeId_init(&out);
  3814. UA_ByteString buf = UA_STRING("{\"IdType\":1,\"Id\":\"test\",\"Namespace\":42}");
  3815. // when
  3816. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
  3817. // then
  3818. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3819. ck_assert_int_eq(out.nodeId.identifier.string.length, 4);
  3820. ck_assert_int_eq(out.nodeId.identifier.string.data[0], 't');
  3821. ck_assert_int_eq(out.nodeId.identifier.string.data[1], 'e');
  3822. ck_assert_int_eq(out.nodeId.identifier.string.data[2], 's');
  3823. ck_assert_int_eq(out.nodeId.identifier.string.data[3], 't');
  3824. ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_STRING);
  3825. ck_assert_int_eq(out.namespaceUri.length, 0);
  3826. ck_assert_ptr_eq(out.namespaceUri.data, NULL);
  3827. ck_assert_int_eq(out.nodeId.namespaceIndex, 42);
  3828. ck_assert_int_eq(out.serverIndex, 0);
  3829. UA_ExpandedNodeId_deleteMembers(&out);
  3830. }
  3831. END_TEST
  3832. START_TEST(UA_ExpandedNodeId_String_Namespace_ServerUri_json_decode) {
  3833. // given
  3834. UA_ExpandedNodeId out;
  3835. UA_ExpandedNodeId_init(&out);
  3836. UA_ByteString buf = UA_STRING("{\"IdType\":1,\"Id\":\"test\",\"Namespace\":\"test\",\"ServerUri\":13}");
  3837. // when
  3838. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
  3839. // then
  3840. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3841. ck_assert_int_eq(out.nodeId.identifier.string.length, 4);
  3842. ck_assert_int_eq(out.nodeId.identifier.string.data[0], 't');
  3843. ck_assert_int_eq(out.nodeId.identifier.string.data[1], 'e');
  3844. ck_assert_int_eq(out.nodeId.identifier.string.data[2], 's');
  3845. ck_assert_int_eq(out.nodeId.identifier.string.data[3], 't');
  3846. ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_STRING);
  3847. ck_assert_int_eq(out.serverIndex, 13);
  3848. ck_assert_int_eq(out.namespaceUri.data[0], 't');
  3849. ck_assert_int_eq(out.namespaceUri.data[1], 'e');
  3850. ck_assert_int_eq(out.namespaceUri.data[2], 's');
  3851. ck_assert_int_eq(out.namespaceUri.data[3], 't');
  3852. UA_ExpandedNodeId_deleteMembers(&out);
  3853. }
  3854. END_TEST
  3855. START_TEST(UA_ExpandedNodeId_ByteString_json_decode) {
  3856. // given
  3857. UA_ExpandedNodeId out;
  3858. UA_ExpandedNodeId_init(&out);
  3859. UA_ByteString buf = UA_STRING("{\"IdType\":3,\"Id\":\"YXNkZmFzZGY=\",\"Namespace\":\"test\",\"ServerUri\":13}");
  3860. // when
  3861. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXPANDEDNODEID]);
  3862. // then
  3863. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3864. ck_assert_int_eq(out.nodeId.identifier.string.length, 8);
  3865. ck_assert_int_eq(out.nodeId.identifier.string.data[0], 'a');
  3866. ck_assert_int_eq(out.nodeId.identifier.string.data[1], 's');
  3867. ck_assert_int_eq(out.nodeId.identifier.string.data[2], 'd');
  3868. ck_assert_int_eq(out.nodeId.identifier.string.data[3], 'f');
  3869. ck_assert_int_eq(out.nodeId.identifier.string.data[4], 'a');
  3870. ck_assert_int_eq(out.nodeId.identifier.string.data[5], 's');
  3871. ck_assert_int_eq(out.nodeId.identifier.string.data[6], 'd');
  3872. ck_assert_int_eq(out.nodeId.identifier.string.data[7], 'f');
  3873. ck_assert_int_eq(out.nodeId.identifierType, UA_NODEIDTYPE_BYTESTRING);
  3874. ck_assert_int_eq(out.serverIndex, 13);
  3875. ck_assert_int_eq(out.namespaceUri.data[0], 't');
  3876. ck_assert_int_eq(out.namespaceUri.data[1], 'e');
  3877. ck_assert_int_eq(out.namespaceUri.data[2], 's');
  3878. ck_assert_int_eq(out.namespaceUri.data[3], 't');
  3879. UA_ExpandedNodeId_deleteMembers(&out);
  3880. }
  3881. END_TEST
  3882. START_TEST(UA_DiagnosticInfo_json_decode) {
  3883. // given
  3884. UA_DiagnosticInfo out;
  3885. UA_DiagnosticInfo_init(&out);
  3886. out.innerDiagnosticInfo = NULL;
  3887. UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,"
  3888. "\"LocalizedText\":14,"
  3889. "\"Locale\":12,"
  3890. "\"AdditionalInfo\":\"additionalInfo\","
  3891. "\"InnerStatusCode\":2155216896,"
  3892. "\"InnerDiagnosticInfo\":{\"AdditionalInfo\":\"INNER ADDITION INFO\"}}");
  3893. // when
  3894. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DIAGNOSTICINFO]);
  3895. // then
  3896. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3897. ck_assert_int_eq(out.locale, 12);
  3898. ck_assert_int_eq(out.symbolicId, 13);
  3899. ck_assert_int_eq(out.localizedText, 14);
  3900. ck_assert_int_eq(out.innerStatusCode, 2155216896);
  3901. ck_assert_int_eq(out.additionalInfo.length, 14);
  3902. ck_assert_int_eq(out.innerDiagnosticInfo->additionalInfo.length, 19);
  3903. UA_DiagnosticInfo_deleteMembers(&out);
  3904. }
  3905. END_TEST
  3906. START_TEST(UA_DiagnosticInfo_null_json_decode) {
  3907. UA_Variant out;
  3908. UA_Variant_init(&out);
  3909. UA_ByteString buf = UA_STRING("{\"Type\":25,\"Body\":null}");
  3910. // when
  3911. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3912. // then
  3913. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3914. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_DIAGNOSTICINFO);
  3915. ck_assert_ptr_eq(out.data, NULL);
  3916. //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasAdditionalInfo, 0);
  3917. //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasInnerDiagnosticInfo, 0);
  3918. //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasInnerStatusCode, 0);
  3919. //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasLocale, 0);
  3920. //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasLocalizedText, 0);
  3921. //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasNamespaceUri, 0);
  3922. //ck_assert_uint_eq(((UA_DiagnosticInfo*)out.data)->hasSymbolicId, 0);
  3923. UA_Variant_deleteMembers(&out);
  3924. }
  3925. END_TEST
  3926. /* --------------------DataValue--------------------------- */
  3927. START_TEST(UA_DataValue_json_decode) {
  3928. // given
  3929. UA_DataValue out;
  3930. UA_DataValue_init(&out);
  3931. 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}");
  3932. // when
  3933. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DATAVALUE]);
  3934. //UA_DiagnosticInfo inner = *out.innerDiagnosticInfo;
  3935. // then
  3936. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3937. ck_assert_int_eq(out.hasStatus, 1);
  3938. ck_assert_int_eq(out.hasServerPicoseconds, 1);
  3939. ck_assert_int_eq(out.hasServerTimestamp, 1);
  3940. ck_assert_int_eq(out.hasSourcePicoseconds, 1);
  3941. ck_assert_int_eq(out.hasSourceTimestamp, 1);
  3942. ck_assert_int_eq(out.hasValue, 1);
  3943. ck_assert_int_eq(out.status, 2153250816);
  3944. ck_assert_int_eq(out.value.type->typeIndex, 0);
  3945. ck_assert_int_eq((*((UA_Boolean*)out.value.data)), 1);
  3946. UA_DataValue_deleteMembers(&out);
  3947. }
  3948. END_TEST
  3949. START_TEST(UA_DataValueMissingFields_json_decode) {
  3950. // given
  3951. UA_DataValue out;
  3952. UA_DataValue_init(&out);
  3953. UA_ByteString buf = UA_STRING("{\"Value\":{\"Type\":1,\"Body\":true}}");
  3954. // when
  3955. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DATAVALUE]);
  3956. //UA_DiagnosticInfo inner = *out.innerDiagnosticInfo;
  3957. // then
  3958. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3959. ck_assert_int_eq(out.hasStatus, 0);
  3960. ck_assert_int_eq(out.hasServerPicoseconds, 0);
  3961. ck_assert_int_eq(out.hasServerTimestamp, 0);
  3962. ck_assert_int_eq(out.hasSourcePicoseconds, 0);
  3963. ck_assert_int_eq(out.hasSourceTimestamp, 0);
  3964. ck_assert_int_eq(out.hasValue, 1);
  3965. UA_DataValue_deleteMembers(&out);
  3966. }
  3967. END_TEST
  3968. START_TEST(UA_DataValue_null_json_decode) {
  3969. // given
  3970. UA_Variant out;
  3971. UA_Variant_init(&out);
  3972. UA_ByteString buf = UA_STRING("{\"Type\":23,\"Body\":null}");
  3973. // when
  3974. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  3975. //UA_DiagnosticInfo inner = *out.innerDiagnosticInfo;
  3976. // then
  3977. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3978. ck_assert_ptr_eq(out.data, NULL);
  3979. UA_Variant_deleteMembers(&out);
  3980. }
  3981. END_TEST
  3982. /*----------------------ExtensionObject------------------------*/
  3983. START_TEST(UA_ExtensionObject_json_decode) {
  3984. // given
  3985. UA_ExtensionObject out;
  3986. UA_ExtensionObject_init(&out);
  3987. UA_ByteString buf = UA_STRING("{\"TypeId\":{\"Id\":1},\"Body\":true}");
  3988. // when
  3989. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]);
  3990. // then
  3991. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  3992. ck_assert_int_eq(out.encoding, UA_EXTENSIONOBJECT_DECODED);
  3993. ck_assert_int_eq(*((UA_Boolean*)out.content.decoded.data), UA_TRUE);
  3994. ck_assert_int_eq(out.content.decoded.type->typeIndex, UA_TYPES_BOOLEAN);
  3995. UA_ExtensionObject_deleteMembers(&out);
  3996. }
  3997. END_TEST
  3998. START_TEST(UA_ExtensionObject_EncodedByteString_json_decode) {
  3999. // given
  4000. UA_ExtensionObject out;
  4001. UA_ExtensionObject_init(&out);
  4002. UA_ByteString buf = UA_STRING("{\"Encoding\":1,\"TypeId\":{\"Id\":42},\"Body\":\"YXNkZmFzZGY=\"}");
  4003. // when
  4004. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]);
  4005. // then
  4006. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4007. ck_assert_int_eq(out.encoding, UA_EXTENSIONOBJECT_ENCODED_BYTESTRING);
  4008. //TODO: Not base64 decoded, correct?
  4009. ck_assert_int_eq(out.content.encoded.body.data[0], 'Y');
  4010. ck_assert_int_eq(out.content.encoded.body.data[0], 'Y');
  4011. ck_assert_int_eq(out.content.encoded.body.data[1], 'X');
  4012. ck_assert_int_eq(out.content.encoded.body.data[2], 'N');
  4013. ck_assert_int_eq(out.content.encoded.body.data[3], 'k');
  4014. ck_assert_int_eq(out.content.encoded.body.data[4], 'Z');
  4015. ck_assert_int_eq(out.content.encoded.body.data[5], 'm');
  4016. ck_assert_int_eq(out.content.encoded.body.data[6], 'F');
  4017. ck_assert_int_eq(out.content.encoded.typeId.identifier.numeric, 42);
  4018. UA_ExtensionObject_deleteMembers(&out);
  4019. }
  4020. END_TEST
  4021. START_TEST(UA_ExtensionObject_EncodedXml_json_decode) {
  4022. // given
  4023. UA_ExtensionObject out;
  4024. UA_ExtensionObject_init(&out);
  4025. UA_ByteString buf = UA_STRING("{\"Encoding\":2,\"TypeId\":{\"Id\":42},\"Body\":\"<Element></Element>\"}");
  4026. // when
  4027. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_EXTENSIONOBJECT]);
  4028. // then
  4029. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4030. ck_assert_int_eq(out.encoding, UA_EXTENSIONOBJECT_ENCODED_XML);
  4031. ck_assert_int_eq(out.content.encoded.body.data[0], '<');
  4032. ck_assert_int_eq(out.content.encoded.body.data[1], 'E');
  4033. ck_assert_int_eq(out.content.encoded.body.data[2], 'l');
  4034. ck_assert_int_eq(out.content.encoded.body.data[3], 'e');
  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_Unkown_json_decode) {
  4040. // given
  4041. UA_ExtensionObject out;
  4042. UA_ExtensionObject_init(&out);
  4043. UA_ByteString buf = UA_STRING("{\"TypeId\":{\"Id\":4711},\"Body\":{\"unknown\":\"body\",\"saveas\":\"Bytestring\"}}");
  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_BYTESTRING);
  4049. ck_assert_int_eq(out.content.encoded.typeId.identifier.numeric, 4711);
  4050. //{"unknown":"body","saveas":"Bytestring"}Q
  4051. ck_assert_int_eq(out.content.encoded.body.length, 40);
  4052. ck_assert_int_eq(out.content.encoded.body.data[2], 'u');
  4053. ck_assert_int_eq(out.content.encoded.body.data[3], 'n');
  4054. ck_assert_int_eq(out.content.encoded.body.data[4], 'k');
  4055. ck_assert_int_eq(out.content.encoded.body.data[5], 'n');
  4056. ck_assert_int_eq(out.content.encoded.body.data[6], 'o');
  4057. ck_assert_int_eq(out.content.encoded.body.data[7], 'w');
  4058. UA_ExtensionObject_deleteMembers(&out);
  4059. }
  4060. END_TEST
  4061. /* ----------------- Variant ---------------------*/
  4062. START_TEST(UA_VariantBool_json_decode) {
  4063. // given
  4064. UA_Variant out;
  4065. UA_Variant_init(&out);
  4066. UA_ByteString buf = UA_STRING("{\"Type\":1,\"Body\":false}");
  4067. // when
  4068. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4069. // then
  4070. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4071. ck_assert_int_eq(out.type->typeIndex, 0);
  4072. ck_assert_uint_eq(*((UA_Boolean*)out.data), 0);
  4073. UA_Variant_deleteMembers(&out);
  4074. }
  4075. END_TEST
  4076. START_TEST(UA_VariantStringArray_json_decode) {
  4077. // given
  4078. UA_Variant *out = UA_Variant_new();
  4079. UA_Variant_init(out);
  4080. UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\"],\"Dimension\":[2,4]}");
  4081. //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}");
  4082. // when
  4083. UA_StatusCode retval = UA_decodeJson(&buf, out, &UA_TYPES[UA_TYPES_VARIANT]);
  4084. UA_String *testArray;
  4085. testArray = (UA_String*)(out->data);
  4086. // then
  4087. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4088. ck_assert_int_eq((char)testArray[0].data[0], '1');
  4089. ck_assert_int_eq((char)testArray[1].data[0], '2');
  4090. ck_assert_int_eq((char)testArray[2].data[0], '3');
  4091. ck_assert_int_eq((char)testArray[3].data[0], '4');
  4092. ck_assert_int_eq((char)testArray[4].data[0], '5');
  4093. ck_assert_int_eq((char)testArray[5].data[0], '6');
  4094. ck_assert_int_eq((char)testArray[6].data[0], '7');
  4095. ck_assert_int_eq((char)testArray[7].data[0], '8');
  4096. ck_assert_int_eq(out->arrayDimensionsSize, 2);
  4097. ck_assert_int_eq(out->arrayDimensions[0], 2);
  4098. ck_assert_int_eq(out->arrayDimensions[1], 4);
  4099. ck_assert_int_eq(out->arrayLength, 8);
  4100. ck_assert_int_eq(out->type->typeIndex, 11);
  4101. UA_Variant_delete(out);
  4102. }
  4103. END_TEST
  4104. START_TEST(UA_VariantStringArrayNull_json_decode) {
  4105. // given
  4106. UA_Variant out;
  4107. UA_Variant_init(&out);
  4108. UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":[null, null, null, null, null, null, null, null],\"Dimension\":[2,4]}");
  4109. //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}");
  4110. // when
  4111. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4112. UA_String *testArray;
  4113. testArray = (UA_String*)(out.data);
  4114. // then
  4115. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4116. ck_assert_ptr_eq(testArray[0].data, NULL);
  4117. ck_assert_ptr_eq(testArray[1].data, NULL);
  4118. ck_assert_ptr_eq(testArray[2].data, NULL);
  4119. ck_assert_ptr_eq(testArray[3].data, NULL);
  4120. ck_assert_ptr_eq(testArray[4].data, NULL);
  4121. ck_assert_ptr_eq(testArray[5].data, NULL);
  4122. ck_assert_ptr_eq(testArray[6].data, NULL);
  4123. ck_assert_ptr_eq(testArray[7].data, NULL);
  4124. ck_assert_int_eq(out.arrayDimensionsSize, 2);
  4125. ck_assert_int_eq(out.arrayDimensions[0], 2);
  4126. ck_assert_int_eq(out.arrayDimensions[1], 4);
  4127. ck_assert_int_eq(out.arrayLength, 8);
  4128. ck_assert_int_eq(out.type->typeIndex, 11);
  4129. UA_Variant_deleteMembers(&out);
  4130. }
  4131. END_TEST
  4132. START_TEST(UA_VariantLocalizedTextArrayNull_json_decode) {
  4133. // given
  4134. UA_Variant out;
  4135. UA_Variant_init(&out);
  4136. UA_ByteString buf = UA_STRING("{\"Type\":21,\"Body\":[null, null, null, null, null, null, null, null],\"Dimension\":[2,4]}");
  4137. //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}");
  4138. // when
  4139. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4140. UA_LocalizedText *testArray;
  4141. testArray = (UA_LocalizedText*)(out.data);
  4142. // then
  4143. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4144. ck_assert_ptr_eq(testArray[0].locale.data, NULL);
  4145. ck_assert_ptr_eq(testArray[1].locale.data, NULL);
  4146. ck_assert_ptr_eq(testArray[2].locale.data, NULL);
  4147. ck_assert_ptr_eq(testArray[3].locale.data, NULL);
  4148. ck_assert_ptr_eq(testArray[4].locale.data, NULL);
  4149. ck_assert_ptr_eq(testArray[5].locale.data, NULL);
  4150. ck_assert_ptr_eq(testArray[6].locale.data, NULL);
  4151. ck_assert_ptr_eq(testArray[7].locale.data, NULL);
  4152. ck_assert_int_eq(out.arrayDimensionsSize, 2);
  4153. ck_assert_int_eq(out.arrayDimensions[0], 2);
  4154. ck_assert_int_eq(out.arrayDimensions[1], 4);
  4155. ck_assert_int_eq(out.arrayLength, 8);
  4156. ck_assert_int_eq(out.type->typeIndex, 20);
  4157. UA_Variant_deleteMembers(&out);
  4158. }
  4159. END_TEST
  4160. START_TEST(UA_VariantVariantArrayNull_json_decode) {
  4161. // given
  4162. UA_Variant out;
  4163. UA_Variant_init(&out);
  4164. UA_ByteString buf = UA_STRING("{\"Type\":22,\"Body\":[null, null, null, null, null, null, null, null],\"Dimension\":[2,4]}");
  4165. //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}");
  4166. // when
  4167. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4168. UA_Variant *testArray;
  4169. testArray = (UA_Variant*)(out.data);
  4170. // then
  4171. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4172. ck_assert(!testArray[0].type);
  4173. ck_assert_int_eq(out.arrayDimensionsSize, 2);
  4174. ck_assert_int_eq(out.arrayDimensions[0], 2);
  4175. ck_assert_int_eq(out.arrayDimensions[1], 4);
  4176. ck_assert_int_eq(out.arrayLength, 8);
  4177. ck_assert_int_eq(out.type->typeIndex, 21);
  4178. UA_Variant_deleteMembers(&out);
  4179. }
  4180. END_TEST
  4181. START_TEST(UA_VariantVariantArrayEmpty_json_decode) {
  4182. // given
  4183. UA_Variant out;
  4184. UA_Variant_init(&out);
  4185. UA_ByteString buf = UA_STRING("{\"Type\":22,\"Body\":[]}");
  4186. // when
  4187. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4188. // then
  4189. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4190. ck_assert_int_eq(out.arrayLength, 0);
  4191. ck_assert_ptr_eq(out.data, UA_EMPTY_ARRAY_SENTINEL);
  4192. UA_Variant_deleteMembers(&out);
  4193. }
  4194. END_TEST
  4195. START_TEST(UA_VariantStringArray_WithoutDimension_json_decode) {
  4196. // given
  4197. UA_Variant out;
  4198. UA_Variant_init(&out);
  4199. UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":[\"1\",\"2\",\"3\",\"4\",\"5\",\"6\",\"7\",\"8\"]}");
  4200. // when
  4201. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4202. UA_String *testArray;
  4203. testArray = (UA_String*)(out.data);
  4204. // then
  4205. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4206. ck_assert_int_eq((char)testArray[0].data[0], '1');
  4207. ck_assert_int_eq((char)testArray[1].data[0], '2');
  4208. ck_assert_int_eq((char)testArray[2].data[0], '3');
  4209. ck_assert_int_eq((char)testArray[3].data[0], '4');
  4210. ck_assert_int_eq((char)testArray[4].data[0], '5');
  4211. ck_assert_int_eq((char)testArray[5].data[0], '6');
  4212. ck_assert_int_eq((char)testArray[6].data[0], '7');
  4213. ck_assert_int_eq((char)testArray[7].data[0], '8');
  4214. ck_assert_int_eq(out.arrayDimensionsSize, 0);
  4215. ck_assert_int_eq(out.arrayLength, 8);
  4216. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_STRING);
  4217. UA_Variant_deleteMembers(&out);
  4218. }
  4219. END_TEST
  4220. START_TEST(UA_Variant_BooleanNull_json_decode) {
  4221. // given
  4222. UA_Variant out;
  4223. UA_Variant_init(&out);
  4224. UA_ByteString buf = UA_STRING("{\"Type\":1,\"Body\":[null, null, null]}");
  4225. // when
  4226. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4227. UA_Boolean *testArray;
  4228. testArray = (UA_Boolean*)(out.data);
  4229. // then
  4230. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4231. //decoded as False
  4232. ck_assert_int_eq(testArray[0], 0);
  4233. ck_assert_int_eq(testArray[1], 0);
  4234. ck_assert_int_eq(testArray[2], 0);
  4235. ck_assert_int_eq(out.arrayDimensionsSize, 0);
  4236. ck_assert_int_eq(out.arrayLength, 3);
  4237. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_BOOLEAN);
  4238. UA_Variant_deleteMembers(&out);
  4239. }
  4240. END_TEST
  4241. START_TEST(UA_Variant_bad1_json_decode) {
  4242. // given
  4243. UA_Variant out;
  4244. UA_Variant_init(&out);
  4245. UA_ByteString buf = UA_STRING("{\"Type\":1,\"Body\":\"\"}");
  4246. // when
  4247. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4248. // then
  4249. UA_Variant_deleteMembers(&out);
  4250. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  4251. }
  4252. END_TEST
  4253. START_TEST(UA_Variant_ExtensionObjectWrap_json_decode) {
  4254. // given
  4255. UA_Variant out;
  4256. UA_Variant_init(&out);
  4257. UA_ByteString buf = UA_STRING("{\"Type\":22,\"Body\":{\"TypeId\":{\"Id\":511},\"Body\":{\"ViewId\":{\"Id\":99999},\"Timestamp\":\"1970-01-15T06:56:07.000Z\",\"ViewVersion\":1236}}}");
  4258. // when
  4259. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4260. // then
  4261. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4262. ck_assert_int_eq(out.type->typeIndex, UA_TYPES_VIEWDESCRIPTION);
  4263. UA_ViewDescription *vd = (UA_ViewDescription*)out.data;
  4264. ck_assert_int_eq(vd->viewId.identifier.numeric, 99999);
  4265. ck_assert_int_eq(vd->viewVersion, 1236);
  4266. UA_Variant_deleteMembers(&out);
  4267. }
  4268. END_TEST
  4269. START_TEST(UA_duplicate_json_decode) {
  4270. // given
  4271. UA_Variant out;
  4272. UA_Variant_init(&out);
  4273. UA_ByteString buf = UA_STRING("{\"Type\":1, \"Body\":false, \"Type\":1}");
  4274. // when
  4275. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4276. // then
  4277. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  4278. UA_Variant_deleteMembers(&out);
  4279. }
  4280. END_TEST
  4281. START_TEST(UA_wrongBoolean_json_decode) {
  4282. // given
  4283. UA_Variant out;
  4284. UA_Variant_init(&out);
  4285. UA_ByteString buf = UA_STRING("{\"Type\":1, \"Body\":\"asdfaaaaaaaaaaaaaaaaaaaa\"}");
  4286. // when
  4287. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4288. // then
  4289. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  4290. UA_Variant_deleteMembers(&out);
  4291. }
  4292. END_TEST
  4293. START_TEST(UA_DataTypeAttributes_json_decode) {
  4294. // given
  4295. UA_DataTypeAttributes out;
  4296. UA_DataTypeAttributes_init(&out);
  4297. UA_ByteString buf = UA_STRING("{\"SpecifiedAttributes\":1,"
  4298. "\"DisplayName\":{\"Locale\":\"t1\",\"Text\":\"t2\"},"
  4299. "\"Description\":{\"Locale\":\"t3\",\"Text\":\"t4\"},"
  4300. "\"WriteMask\":53,"
  4301. "\"UserWriteMask\":63,"
  4302. "\"IsAbstract\":false}");
  4303. // when
  4304. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_DATATYPEATTRIBUTES]);
  4305. // then
  4306. ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
  4307. ck_assert_int_eq(out.isAbstract, 0);
  4308. ck_assert_int_eq(out.writeMask, 53);
  4309. ck_assert_int_eq(out.userWriteMask, 63);
  4310. ck_assert_int_eq(out.specifiedAttributes, 1);
  4311. ck_assert_int_eq(out.displayName.locale.data[1], '1');
  4312. ck_assert_int_eq(out.displayName.text.data[1], '2');
  4313. ck_assert_int_eq(out.description.locale.data[1], '3');
  4314. ck_assert_int_eq(out.description.text.data[1], '4');
  4315. UA_DataTypeAttributes_deleteMembers(&out);
  4316. }
  4317. END_TEST
  4318. //-------------------MISC heap free test cases--------------------------
  4319. START_TEST(UA_VariantStringArrayBad_shouldFreeArray_json_decode) {
  4320. // given
  4321. UA_Variant out;
  4322. UA_Variant_init(&out); //not a string V
  4323. UA_ByteString buf = UA_STRING("{\"Type\":12,\"Body\":[\"1\",\"2\",true,\"4\",\"5\",\"6\",\"7\",\"8\"],\"Dimension\":[2,4]}");
  4324. //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}");
  4325. // when
  4326. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4327. // then
  4328. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  4329. UA_Variant_deleteMembers(&out);
  4330. }
  4331. END_TEST
  4332. START_TEST(UA_VariantFuzzer1_json_decode) {
  4333. // given
  4334. UA_Variant out;
  4335. UA_Variant_init(&out);
  4336. UA_ByteString buf = UA_STRING("\\x0a{\"Type\",\"Bode\",\"Body\":{\"se\":}}");
  4337. //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}");
  4338. // when
  4339. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4340. // then
  4341. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  4342. UA_Variant_deleteMembers(&out);
  4343. }
  4344. END_TEST
  4345. //This test succeeds: Double will be parsed to zero if unparsable
  4346. // TODO: Verify against the spec
  4347. START_TEST(UA_VariantFuzzer2_json_decode) {
  4348. // given
  4349. UA_Variant out;
  4350. UA_Variant_init(&out);
  4351. UA_ByteString buf = UA_STRING("{\"Type\":11,\"Body\":2E+}");
  4352. //UA_ByteString buf = UA_STRING("{\"SymbolicId\":13,\"LocalizedText\":14,\"Locale\":12,\"AdditionalInfo\":\"additionalInfo\",\"InnerStatusCode\":2155216896}");
  4353. // when
  4354. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4355. // then
  4356. ck_assert(retval == UA_STATUSCODE_GOOD || retval == UA_STATUSCODE_BADDECODINGERROR);
  4357. UA_Variant_deleteMembers(&out);
  4358. }
  4359. END_TEST
  4360. START_TEST(UA_Variant_Bad_Type_decode) {
  4361. UA_Variant out;
  4362. UA_Variant_init(&out);
  4363. UA_ByteString buf = UA_STRING("{\"Type\":1000,\"Body\":0}");
  4364. // when
  4365. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4366. // then
  4367. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  4368. UA_Variant_deleteMembers(&out);
  4369. }
  4370. END_TEST
  4371. START_TEST(UA_Variant_Bad_Type2_decode) {
  4372. for(int i = 0; i < 100; i++){
  4373. UA_Variant out;
  4374. UA_Variant_init(&out);
  4375. char str[80];
  4376. sprintf(str, "{\"Type\":%d}", i);
  4377. UA_ByteString buf = UA_STRING(str);
  4378. // when
  4379. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4380. // then
  4381. ck_assert_int_eq(retval, retval);
  4382. UA_Variant_deleteMembers(&out);
  4383. }
  4384. }
  4385. END_TEST
  4386. START_TEST(UA_Variant_Null_decode) {
  4387. for(int i = 0; i < 100; i++){
  4388. UA_Variant out;
  4389. UA_Variant_init(&out);
  4390. char str[80];
  4391. sprintf(str, "{\"Type\":%d, \"Body:\":null}", i);
  4392. UA_ByteString buf = UA_STRING(str);
  4393. // when
  4394. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4395. // then
  4396. ck_assert_int_eq(retval, retval);
  4397. UA_Variant_deleteMembers(&out);
  4398. }
  4399. }
  4400. END_TEST
  4401. START_TEST(UA_Variant_Malformed_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, \"Body:\"}", 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, UA_STATUSCODE_BADDECODINGERROR);
  4412. UA_Variant_deleteMembers(&out);
  4413. }
  4414. }
  4415. END_TEST
  4416. START_TEST(UA_Variant_Malformed2_decode) {
  4417. UA_Variant out;
  4418. UA_Variant_init(&out);
  4419. char str[80];
  4420. sprintf(str, "{\"Type\":, \"Body:\"}");
  4421. UA_ByteString buf = UA_STRING(str);
  4422. // when
  4423. UA_StatusCode retval = UA_decodeJson(&buf, &out, &UA_TYPES[UA_TYPES_VARIANT]);
  4424. // then
  4425. ck_assert_int_eq(retval, UA_STATUSCODE_BADDECODINGERROR);
  4426. UA_Variant_deleteMembers(&out);
  4427. }
  4428. END_TEST
  4429. START_TEST(UA_JsonHelper) {
  4430. // given
  4431. CtxJson ctx;
  4432. memset(&ctx, 0, sizeof(ctx));
  4433. ck_assert_int_eq(writeJsonArrStart(&ctx), UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  4434. ck_assert_int_eq(writeJsonObjStart(&ctx), UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  4435. ck_assert_int_eq(writeJsonObjEnd(&ctx), UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  4436. ck_assert_int_eq(writeJsonArrEnd(&ctx), UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  4437. ck_assert_int_eq(writeJsonNull(&ctx), UA_STATUSCODE_BADENCODINGLIMITSEXCEEDED);
  4438. ctx.calcOnly = true;
  4439. ctx.end = (const UA_Byte*)(uintptr_t)SIZE_MAX;
  4440. ck_assert_int_eq(calcJsonArrStart(&ctx), UA_STATUSCODE_GOOD);
  4441. ck_assert_int_eq(calcJsonObjStart(&ctx), UA_STATUSCODE_GOOD);
  4442. ck_assert_int_eq(calcJsonObjEnd(&ctx), UA_STATUSCODE_GOOD);
  4443. ck_assert_int_eq(calcJsonArrEnd(&ctx), UA_STATUSCODE_GOOD);
  4444. }
  4445. END_TEST
  4446. static Suite *testSuite_builtin_json(void) {
  4447. Suite *s = suite_create("Built-in Data Types 62541-6 Json");
  4448. TCase *tc_json_encode = tcase_create("json_encode");
  4449. tcase_add_test(tc_json_encode, UA_Boolean_true_json_encode);
  4450. tcase_add_test(tc_json_encode, UA_Boolean_false_json_encode);
  4451. tcase_add_test(tc_json_encode, UA_Boolean_true_bufferTooSmall_json_encode);
  4452. tcase_add_test(tc_json_encode, UA_String_json_encode);
  4453. tcase_add_test(tc_json_encode, UA_String_Empty_json_encode);
  4454. tcase_add_test(tc_json_encode, UA_String_Null_json_encode);
  4455. tcase_add_test(tc_json_encode, UA_String_escapesimple_json_encode);
  4456. tcase_add_test(tc_json_encode, UA_String_escapeutf_json_encode);
  4457. tcase_add_test(tc_json_encode, UA_String_special_json_encode);
  4458. tcase_add_test(tc_json_encode, UA_Byte_Max_Number_json_encode);
  4459. tcase_add_test(tc_json_encode, UA_Byte_Min_Number_json_encode);
  4460. tcase_add_test(tc_json_encode, UA_Byte_smallbuf_Number_json_encode);
  4461. tcase_add_test(tc_json_encode, UA_SByte_Max_Number_json_encode);
  4462. tcase_add_test(tc_json_encode, UA_SByte_Min_Number_json_encode);
  4463. tcase_add_test(tc_json_encode, UA_SByte_Zero_Number_json_encode);
  4464. tcase_add_test(tc_json_encode, UA_SByte_smallbuf_Number_json_encode);
  4465. tcase_add_test(tc_json_encode, UA_UInt16_Max_Number_json_encode);
  4466. tcase_add_test(tc_json_encode, UA_UInt16_Min_Number_json_encode);
  4467. tcase_add_test(tc_json_encode, UA_UInt16_smallbuf_Number_json_encode);
  4468. tcase_add_test(tc_json_encode, UA_Int16_Max_Number_json_encode);
  4469. tcase_add_test(tc_json_encode, UA_Int16_Min_Number_json_encode);
  4470. tcase_add_test(tc_json_encode, UA_Int16_Zero_Number_json_encode);
  4471. tcase_add_test(tc_json_encode, UA_Int16_smallbuf_Number_json_encode);
  4472. tcase_add_test(tc_json_encode, UA_UInt32_Max_Number_json_encode);
  4473. tcase_add_test(tc_json_encode, UA_UInt32_Min_Number_json_encode);
  4474. tcase_add_test(tc_json_encode, UA_UInt32_smallbuf_Number_json_encode);
  4475. tcase_add_test(tc_json_encode, UA_Int32_Max_Number_json_encode);
  4476. tcase_add_test(tc_json_encode, UA_Int32_Min_Number_json_encode);
  4477. tcase_add_test(tc_json_encode, UA_Int32_Zero_Number_json_encode);
  4478. tcase_add_test(tc_json_encode, UA_Int32_smallbuf_Number_json_encode);
  4479. tcase_add_test(tc_json_encode, UA_UInt64_Max_Number_json_encode);
  4480. tcase_add_test(tc_json_encode, UA_UInt64_Min_Number_json_encode);
  4481. tcase_add_test(tc_json_encode, UA_UInt64_smallbuf_Number_json_encode);
  4482. tcase_add_test(tc_json_encode, UA_Int64_Max_Number_json_encode);
  4483. tcase_add_test(tc_json_encode, UA_Int64_Min_Number_json_encode);
  4484. tcase_add_test(tc_json_encode, UA_Int64_Zero_Number_json_encode);
  4485. tcase_add_test(tc_json_encode, UA_Int64_smallbuf_Number_json_encode);
  4486. //Double Float
  4487. tcase_add_test(tc_json_encode, UA_Double_json_encode);
  4488. tcase_add_test(tc_json_encode, UA_Double_onesmallest_json_encode);
  4489. tcase_add_test(tc_json_encode, UA_Double_pluszero_json_encode);
  4490. tcase_add_test(tc_json_encode, UA_Double_minuszero_json_encode);
  4491. tcase_add_test(tc_json_encode, UA_Double_plusInf_json_encode);
  4492. tcase_add_test(tc_json_encode, UA_Double_minusInf_json_encode);
  4493. tcase_add_test(tc_json_encode, UA_Double_nan_json_encode);
  4494. tcase_add_test(tc_json_encode, UA_Float_json_encode);
  4495. tcase_add_test(tc_json_encode, UA_Variant_Float_json_encode);
  4496. tcase_add_test(tc_json_encode, UA_Variant_DoubleInf_json_encode);
  4497. tcase_add_test(tc_json_encode, UA_Variant_DoubleNan_json_encode);
  4498. //LocalizedText
  4499. tcase_add_test(tc_json_encode, UA_LocText_json_encode);
  4500. tcase_add_test(tc_json_encode, UA_LocText_NonReversible_json_encode);
  4501. tcase_add_test(tc_json_encode, UA_LocText_smallBuffer_json_encode);
  4502. //Guid
  4503. tcase_add_test(tc_json_encode, UA_Guid_json_encode);
  4504. tcase_add_test(tc_json_encode, UA_Guid_smallbuf_json_encode);
  4505. //DateTime
  4506. tcase_add_test(tc_json_encode, UA_DateTime_json_encode);
  4507. //StatusCode
  4508. tcase_add_test(tc_json_encode, UA_StatusCode_json_encode);
  4509. tcase_add_test(tc_json_encode, UA_StatusCode_nonReversible_json_encode);
  4510. tcase_add_test(tc_json_encode, UA_StatusCode_nonReversible_good_json_encode);
  4511. tcase_add_test(tc_json_encode, UA_StatusCode_smallbuf_json_encode);
  4512. //NodeId
  4513. tcase_add_test(tc_json_encode, UA_NodeId_Numeric_json_encode);
  4514. tcase_add_test(tc_json_encode, UA_NodeId_Numeric_Namespace_json_encode);
  4515. tcase_add_test(tc_json_encode, UA_NodeId_String_json_encode);
  4516. tcase_add_test(tc_json_encode, UA_NodeId_String_Namespace_json_encode);
  4517. tcase_add_test(tc_json_encode, UA_NodeId_Guid_json_encode);
  4518. tcase_add_test(tc_json_encode, UA_NodeId_Guid_Namespace_json_encode);
  4519. tcase_add_test(tc_json_encode, UA_NodeId_ByteString_json_encode);
  4520. tcase_add_test(tc_json_encode, UA_NodeId_ByteString_Namespace_json_encode);
  4521. tcase_add_test(tc_json_encode, UA_NodeId_NonReversible_Numeric_Namespace_json_encode);
  4522. //ExpandedNodeId
  4523. tcase_add_test(tc_json_encode, UA_ExpandedNodeId_json_encode);
  4524. tcase_add_test(tc_json_encode, UA_ExpandedNodeId_MissingNamespaceUri_json_encode);
  4525. tcase_add_test(tc_json_encode, UA_ExpandedNodeId_NonReversible_Ns1_json_encode);
  4526. tcase_add_test(tc_json_encode, UA_ExpandedNodeId_NonReversible_Namespace_json_encode);
  4527. tcase_add_test(tc_json_encode, UA_ExpandedNodeId_NonReversible_NamespaceUriGiven_json_encode);
  4528. //DiagnosticInfo
  4529. tcase_add_test(tc_json_encode, UA_DiagInfo_json_encode);
  4530. tcase_add_test(tc_json_encode, UA_DiagInfo_withInner_json_encode);
  4531. tcase_add_test(tc_json_encode, UA_DiagInfo_withTwoInner_json_encode);
  4532. tcase_add_test(tc_json_encode, UA_DiagInfo_noFields_json_encode);
  4533. tcase_add_test(tc_json_encode, UA_DiagInfo_smallBuffer_json_encode);
  4534. //ByteString
  4535. tcase_add_test(tc_json_encode, UA_ByteString_json_encode);
  4536. tcase_add_test(tc_json_encode, UA_ByteString2_json_encode);
  4537. tcase_add_test(tc_json_encode, UA_ByteString3_json_encode);
  4538. //QualifiedName
  4539. tcase_add_test(tc_json_encode, UA_QualName_json_encode);
  4540. tcase_add_test(tc_json_encode, UA_QualName_NonReversible_json_encode);
  4541. tcase_add_test(tc_json_encode, UA_QualName_NonReversible_Namespace_json_encode);
  4542. tcase_add_test(tc_json_encode, UA_QualName_NonReversible_NoNamespaceAsNumber_json_encode);
  4543. //Variant -REVERSIBLE-
  4544. tcase_add_test(tc_json_encode, UA_Variant_Bool_json_encode);
  4545. tcase_add_test(tc_json_encode, UA_Variant_Number_json_encode);
  4546. tcase_add_test(tc_json_encode, UA_Variant_Double_json_encode);
  4547. tcase_add_test(tc_json_encode, UA_Variant_Double2_json_encode);
  4548. tcase_add_test(tc_json_encode, UA_Variant_Double3_json_encode);
  4549. tcase_add_test(tc_json_encode, UA_Variant_NodeId_json_encode);
  4550. tcase_add_test(tc_json_encode, UA_Variant_LocText_json_encode);
  4551. tcase_add_test(tc_json_encode, UA_Variant_QualName_json_encode);
  4552. //Array
  4553. tcase_add_test(tc_json_encode, UA_Variant_Array_UInt16_json_encode);
  4554. tcase_add_test(tc_json_encode, UA_Variant_Array_Byte_json_encode);
  4555. tcase_add_test(tc_json_encode, UA_Variant_Array_String_json_encode);
  4556. //Matrix
  4557. tcase_add_test(tc_json_encode, UA_Variant_Matrix_UInt16_json_encode);
  4558. //Wrap
  4559. tcase_add_test(tc_json_encode, UA_Variant_Wrap_json_encode);
  4560. tcase_add_test(tc_json_encode, UA_Variant_Wrap_Array_json_encode);
  4561. //Variant -NON-REVERSIBLE-
  4562. tcase_add_test(tc_json_encode, UA_Variant_StatusCode_NonReversible_json_encode);
  4563. //Array
  4564. tcase_add_test(tc_json_encode, UA_Variant_Array_String_NonReversible_json_encode);
  4565. //Matrix
  4566. tcase_add_test(tc_json_encode, UA_Variant_Matrix_String_NonReversible_json_encode);
  4567. tcase_add_test(tc_json_encode, UA_Variant_Matrix_NodeId_NonReversible_json_encode);
  4568. //Wrap non reversible
  4569. tcase_add_test(tc_json_encode, UA_Variant_Wrap_Array_NonReversible_json_encode);
  4570. //ExtensionObject
  4571. tcase_add_test(tc_json_encode, UA_ExtensionObject_json_encode);
  4572. tcase_add_test(tc_json_encode, UA_ExtensionObject_xml_json_encode);
  4573. tcase_add_test(tc_json_encode, UA_ExtensionObject_byteString_json_encode);
  4574. tcase_add_test(tc_json_encode, UA_ExtensionObject_NonReversible_StatusCode_json_encode);
  4575. //DataValue
  4576. tcase_add_test(tc_json_encode, UA_DataValue_json_encode);
  4577. tcase_add_test(tc_json_encode, UA_DataValue_null_json_encode);
  4578. tcase_add_test(tc_json_encode, UA_MessageReadResponse_json_encode);
  4579. tcase_add_test(tc_json_encode, UA_ViewDescription_json_encode);
  4580. tcase_add_test(tc_json_encode, UA_WriteRequest_json_encode);
  4581. tcase_add_test(tc_json_encode, UA_VariableAttributes_json_encode);
  4582. suite_add_tcase(s, tc_json_encode);
  4583. TCase *tc_json_decode = tcase_create("json_decode");
  4584. tcase_add_test(tc_json_decode, UA_SByte_Min_json_decode);
  4585. tcase_add_test(tc_json_decode, UA_SByte_Max_json_decode);
  4586. tcase_add_test(tc_json_decode, UA_Byte_Min_json_decode);
  4587. tcase_add_test(tc_json_decode, UA_Byte_Max_json_decode);
  4588. tcase_add_test(tc_json_decode, UA_Int16_Min_json_decode);
  4589. tcase_add_test(tc_json_decode, UA_Int16_Max_json_decode);
  4590. tcase_add_test(tc_json_decode, UA_UInt16_Min_json_decode);
  4591. tcase_add_test(tc_json_decode, UA_UInt16_Max_json_decode);
  4592. tcase_add_test(tc_json_decode, UA_UInt32_Min_json_decode);
  4593. tcase_add_test(tc_json_decode, UA_UInt32_Max_json_decode);
  4594. tcase_add_test(tc_json_decode, UA_Int32_Min_json_decode);
  4595. tcase_add_test(tc_json_decode, UA_Int32_Max_json_decode);
  4596. tcase_add_test(tc_json_decode, UA_Int64_Min_json_decode);
  4597. tcase_add_test(tc_json_decode, UA_Int64_Max_json_decode);
  4598. tcase_add_test(tc_json_decode, UA_Int64_Overflow_json_decode);
  4599. tcase_add_test(tc_json_decode, UA_Int64_TooBig_json_decode);
  4600. tcase_add_test(tc_json_decode, UA_Int64_NoDigit_json_decode);
  4601. tcase_add_test(tc_json_decode, UA_UInt64_Min_json_decode);
  4602. tcase_add_test(tc_json_decode, UA_UInt64_Max_json_decode);
  4603. tcase_add_test(tc_json_decode, UA_UInt64_Overflow_json_decode);
  4604. tcase_add_test(tc_json_decode, UA_Float_json_decode);
  4605. tcase_add_test(tc_json_decode, UA_Float_json_one_decode);
  4606. tcase_add_test(tc_json_decode, UA_Float_json_inf_decode);
  4607. tcase_add_test(tc_json_decode, UA_Float_json_neginf_decode);
  4608. tcase_add_test(tc_json_decode, UA_Float_json_nan_decode);
  4609. tcase_add_test(tc_json_decode, UA_Float_json_negnan_decode);
  4610. tcase_add_test(tc_json_decode, UA_Double_json_decode);
  4611. tcase_add_test(tc_json_decode, UA_Double_one_json_decode);
  4612. tcase_add_test(tc_json_decode, UA_Double_corrupt_json_decode);
  4613. tcase_add_test(tc_json_decode, UA_Double_onepointsmallest_json_decode);
  4614. tcase_add_test(tc_json_decode, UA_Double_nan_json_decode);
  4615. tcase_add_test(tc_json_decode, UA_Double_negnan_json_decode);
  4616. tcase_add_test(tc_json_decode, UA_Double_negzero_json_decode);
  4617. tcase_add_test(tc_json_decode, UA_Double_zero_json_decode);
  4618. tcase_add_test(tc_json_decode, UA_Double_inf_json_decode);
  4619. tcase_add_test(tc_json_decode, UA_Double_neginf_json_decode);
  4620. //String
  4621. tcase_add_test(tc_json_decode, UA_String_json_decode);
  4622. tcase_add_test(tc_json_decode, UA_String_empty_json_decode);
  4623. tcase_add_test(tc_json_decode, UA_String_unescapeBS_json_decode);
  4624. tcase_add_test(tc_json_decode, UA_String_escape_unicode_json_decode);
  4625. tcase_add_test(tc_json_decode, UA_String_escape2_json_decode);
  4626. tcase_add_test(tc_json_decode, UA_String_surrogatePair_json_decode);
  4627. //ByteString
  4628. tcase_add_test(tc_json_decode, UA_ByteString_json_decode);
  4629. tcase_add_test(tc_json_decode, UA_ByteString_bad_json_decode);
  4630. tcase_add_test(tc_json_decode, UA_ByteString_null_json_decode);
  4631. //DateTime
  4632. tcase_add_test(tc_json_decode, UA_DateTime_json_decode);
  4633. tcase_add_test(tc_json_decode, UA_DateTime_micro_json_decode);
  4634. //Guid
  4635. tcase_add_test(tc_json_decode, UA_Guid_json_decode);
  4636. tcase_add_test(tc_json_decode, UA_Guid_lower_json_decode);
  4637. tcase_add_test(tc_json_decode, UA_Guid_tooShort_json_decode);
  4638. tcase_add_test(tc_json_decode, UA_Guid_tooLong_json_decode);
  4639. tcase_add_test(tc_json_decode, UA_Guid_wrong_json_decode);
  4640. //StatusCode
  4641. tcase_add_test(tc_json_decode, UA_StatusCode_2_json_decode);
  4642. tcase_add_test(tc_json_decode, UA_StatusCode_3_json_decode);
  4643. tcase_add_test(tc_json_decode, UA_StatusCode_0_json_decode);
  4644. //QualName
  4645. tcase_add_test(tc_json_decode, UA_QualifiedName_json_decode);
  4646. tcase_add_test(tc_json_decode, UA_QualifiedName_null_json_decode);
  4647. //LocalizedText
  4648. tcase_add_test(tc_json_decode, UA_LocalizedText_json_decode);
  4649. tcase_add_test(tc_json_decode, UA_LocalizedText_missing_json_decode);
  4650. tcase_add_test(tc_json_decode, UA_LocalizedText_null_json_decode);
  4651. //-NodeId-
  4652. tcase_add_test(tc_json_decode, UA_NodeId_Nummeric_json_decode);
  4653. tcase_add_test(tc_json_decode, UA_NodeId_Nummeric_Namespace_json_decode);
  4654. tcase_add_test(tc_json_decode, UA_NodeId_String_json_decode);
  4655. tcase_add_test(tc_json_decode, UA_NodeId_Guid_json_decode);
  4656. tcase_add_test(tc_json_decode, UA_NodeId_ByteString_json_decode);
  4657. //expandednodeid
  4658. tcase_add_test(tc_json_decode, UA_ExpandedNodeId_Nummeric_json_decode);
  4659. tcase_add_test(tc_json_decode, UA_ExpandedNodeId_String_json_decode);
  4660. tcase_add_test(tc_json_decode, UA_ExpandedNodeId_String_Namespace_json_decode);
  4661. tcase_add_test(tc_json_decode, UA_ExpandedNodeId_String_NamespaceAsIndex_json_decode);
  4662. tcase_add_test(tc_json_decode, UA_ExpandedNodeId_String_Namespace_ServerUri_json_decode);
  4663. tcase_add_test(tc_json_decode, UA_ExpandedNodeId_ByteString_json_decode);
  4664. //Diaginfo
  4665. tcase_add_test(tc_json_decode, UA_DiagnosticInfo_json_decode);
  4666. tcase_add_test(tc_json_decode, UA_DiagnosticInfo_null_json_decode);
  4667. //Variant
  4668. tcase_add_test(tc_json_decode, UA_VariantBool_json_decode);
  4669. tcase_add_test(tc_json_decode, UA_VariantStringArray_json_decode);
  4670. tcase_add_test(tc_json_decode, UA_VariantStringArrayNull_json_decode);
  4671. tcase_add_test(tc_json_decode, UA_VariantLocalizedTextArrayNull_json_decode);
  4672. tcase_add_test(tc_json_decode, UA_VariantVariantArrayNull_json_decode);
  4673. tcase_add_test(tc_json_decode, UA_VariantVariantArrayEmpty_json_decode);
  4674. tcase_add_test(tc_json_decode, UA_VariantStringArray_WithoutDimension_json_decode);
  4675. tcase_add_test(tc_json_decode, UA_Variant_BooleanNull_json_decode);
  4676. tcase_add_test(tc_json_decode, UA_Variant_bad1_json_decode);
  4677. tcase_add_test(tc_json_decode, UA_Variant_ExtensionObjectWrap_json_decode);
  4678. //DataValue
  4679. tcase_add_test(tc_json_decode, UA_DataValue_json_decode);
  4680. tcase_add_test(tc_json_decode, UA_DataValueMissingFields_json_decode);
  4681. tcase_add_test(tc_json_decode, UA_DataValue_null_json_decode);
  4682. //extensionobject
  4683. tcase_add_test(tc_json_decode, UA_ExtensionObject_json_decode);
  4684. tcase_add_test(tc_json_decode, UA_ExtensionObject_EncodedByteString_json_decode);
  4685. tcase_add_test(tc_json_decode, UA_ExtensionObject_EncodedXml_json_decode);
  4686. tcase_add_test(tc_json_decode, UA_ExtensionObject_Unkown_json_decode);
  4687. //Others
  4688. tcase_add_test(tc_json_decode, UA_duplicate_json_decode);
  4689. tcase_add_test(tc_json_decode, UA_wrongBoolean_json_decode);
  4690. tcase_add_test(tc_json_decode, UA_ViewDescription_json_decode);
  4691. tcase_add_test(tc_json_decode, UA_DataTypeAttributes_json_decode);
  4692. tcase_add_test(tc_json_decode, UA_VariantStringArrayBad_shouldFreeArray_json_decode);
  4693. tcase_add_test(tc_json_decode, UA_VariantFuzzer1_json_decode);
  4694. tcase_add_test(tc_json_decode, UA_VariantFuzzer2_json_decode);
  4695. tcase_add_test(tc_json_decode, UA_Variant_Bad_Type_decode);
  4696. tcase_add_test(tc_json_decode, UA_Variant_Bad_Type2_decode);
  4697. tcase_add_test(tc_json_decode, UA_Variant_Null_decode);
  4698. tcase_add_test(tc_json_decode, UA_Variant_Malformed_decode);
  4699. tcase_add_test(tc_json_decode, UA_Variant_Malformed2_decode);
  4700. suite_add_tcase(s, tc_json_decode);
  4701. TCase *tc_json_helper = tcase_create("json_helper");
  4702. tcase_add_test(tc_json_decode, UA_JsonHelper);
  4703. suite_add_tcase(s, tc_json_helper);
  4704. return s;
  4705. }
  4706. int main(void) {
  4707. int number_failed = 0;
  4708. Suite *s;
  4709. SRunner *sr;
  4710. s = testSuite_builtin_json();
  4711. sr = srunner_create(s);
  4712. srunner_set_fork_status(sr, CK_NOFORK);
  4713. srunner_run_all(sr, CK_NORMAL);
  4714. number_failed += srunner_ntests_failed(sr);
  4715. srunner_free(sr);
  4716. return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
  4717. }