check_types_builtin_json.c 201 KB

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