check_types_builtin_json.c 202 KB

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