all_tests.c 274 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427442844294430443144324433443444354436443744384439444044414442444344444445444644474448444944504451445244534454445544564457445844594460446144624463446444654466446744684469447044714472447344744475447644774478447944804481448244834484448544864487448844894490449144924493449444954496449744984499450045014502450345044505450645074508450945104511451245134514451545164517451845194520452145224523452445254526452745284529453045314532453345344535453645374538453945404541454245434544454545464547454845494550455145524553455445554556455745584559456045614562456345644565456645674568456945704571457245734574457545764577457845794580458145824583458445854586458745884589459045914592459345944595459645974598459946004601460246034604460546064607460846094610461146124613461446154616461746184619462046214622462346244625462646274628462946304631463246334634463546364637463846394640464146424643464446454646464746484649465046514652465346544655465646574658465946604661466246634664466546664667466846694670467146724673467446754676467746784679468046814682468346844685468646874688468946904691469246934694469546964697469846994700470147024703470447054706470747084709471047114712471347144715471647174718471947204721472247234724472547264727472847294730473147324733473447354736473747384739474047414742474347444745474647474748474947504751475247534754475547564757475847594760476147624763476447654766476747684769477047714772477347744775477647774778477947804781478247834784478547864787478847894790479147924793479447954796479747984799480048014802480348044805480648074808480948104811481248134814481548164817481848194820482148224823482448254826482748284829483048314832483348344835483648374838483948404841484248434844484548464847484848494850485148524853485448554856485748584859486048614862486348644865486648674868486948704871487248734874487548764877487848794880488148824883488448854886488748884889489048914892489348944895489648974898489949004901490249034904490549064907490849094910491149124913491449154916491749184919492049214922492349244925492649274928492949304931493249334934493549364937493849394940494149424943494449454946494749484949495049514952495349544955495649574958495949604961496249634964496549664967496849694970497149724973497449754976497749784979498049814982498349844985498649874988498949904991499249934994499549964997499849995000500150025003500450055006500750085009501050115012501350145015501650175018501950205021502250235024502550265027502850295030503150325033503450355036503750385039504050415042504350445045504650475048504950505051505250535054505550565057505850595060506150625063506450655066506750685069507050715072507350745075507650775078507950805081508250835084508550865087508850895090509150925093509450955096509750985099510051015102510351045105510651075108510951105111511251135114511551165117511851195120512151225123512451255126512751285129513051315132513351345135513651375138513951405141514251435144514551465147514851495150515151525153515451555156515751585159516051615162516351645165516651675168516951705171517251735174517551765177517851795180518151825183518451855186518751885189519051915192519351945195519651975198519952005201520252035204520552065207520852095210521152125213521452155216521752185219522052215222522352245225522652275228522952305231523252335234523552365237523852395240524152425243524452455246524752485249525052515252525352545255525652575258525952605261526252635264526552665267526852695270527152725273527452755276527752785279528052815282528352845285528652875288528952905291529252935294529552965297529852995300530153025303530453055306530753085309531053115312531353145315531653175318531953205321532253235324532553265327532853295330533153325333533453355336533753385339534053415342534353445345534653475348534953505351535253535354535553565357535853595360536153625363536453655366536753685369537053715372537353745375537653775378537953805381538253835384538553865387538853895390539153925393539453955396539753985399540054015402540354045405540654075408540954105411541254135414541554165417541854195420542154225423542454255426542754285429543054315432543354345435543654375438543954405441544254435444544554465447544854495450545154525453545454555456545754585459546054615462546354645465546654675468546954705471547254735474547554765477547854795480548154825483548454855486548754885489549054915492549354945495549654975498549955005501550255035504550555065507550855095510551155125513551455155516551755185519552055215522552355245525552655275528552955305531553255335534553555365537553855395540554155425543554455455546554755485549555055515552555355545555555655575558555955605561556255635564556555665567556855695570557155725573557455755576557755785579558055815582558355845585558655875588558955905591559255935594559555965597559855995600560156025603560456055606560756085609561056115612561356145615561656175618561956205621562256235624562556265627562856295630563156325633563456355636563756385639564056415642564356445645564656475648564956505651565256535654565556565657565856595660566156625663566456655666566756685669567056715672567356745675567656775678567956805681568256835684568556865687568856895690569156925693569456955696569756985699570057015702570357045705570657075708570957105711571257135714571557165717571857195720572157225723572457255726572757285729573057315732573357345735573657375738573957405741574257435744574557465747574857495750575157525753575457555756575757585759576057615762576357645765576657675768576957705771577257735774577557765777577857795780578157825783578457855786578757885789579057915792579357945795579657975798579958005801580258035804580558065807580858095810581158125813581458155816581758185819582058215822582358245825582658275828582958305831583258335834583558365837583858395840584158425843584458455846584758485849585058515852585358545855585658575858585958605861586258635864586558665867586858695870587158725873587458755876587758785879588058815882588358845885588658875888588958905891589258935894589558965897589858995900590159025903590459055906590759085909591059115912591359145915591659175918591959205921592259235924592559265927592859295930593159325933593459355936593759385939594059415942594359445945594659475948594959505951595259535954595559565957595859595960596159625963596459655966596759685969597059715972597359745975597659775978597959805981598259835984598559865987598859895990599159925993599459955996599759985999600060016002600360046005600660076008600960106011601260136014601560166017601860196020602160226023602460256026602760286029603060316032603360346035603660376038603960406041604260436044604560466047604860496050605160526053605460556056605760586059606060616062606360646065606660676068606960706071607260736074607560766077607860796080608160826083608460856086608760886089609060916092609360946095609660976098609961006101610261036104610561066107610861096110611161126113611461156116611761186119612061216122612361246125612661276128612961306131613261336134613561366137613861396140614161426143614461456146614761486149615061516152615361546155615661576158615961606161616261636164616561666167616861696170617161726173617461756176617761786179618061816182618361846185618661876188618961906191619261936194619561966197619861996200620162026203620462056206620762086209621062116212621362146215621662176218621962206221622262236224622562266227622862296230623162326233623462356236623762386239624062416242624362446245624662476248624962506251625262536254625562566257625862596260626162626263626462656266626762686269627062716272627362746275627662776278627962806281628262836284628562866287628862896290629162926293629462956296629762986299630063016302630363046305630663076308630963106311631263136314631563166317631863196320632163226323632463256326632763286329633063316332633363346335633663376338633963406341634263436344634563466347634863496350635163526353635463556356635763586359636063616362636363646365636663676368636963706371637263736374637563766377637863796380638163826383638463856386638763886389639063916392639363946395639663976398639964006401640264036404640564066407640864096410641164126413641464156416641764186419642064216422642364246425642664276428642964306431643264336434643564366437643864396440644164426443644464456446644764486449645064516452645364546455645664576458645964606461646264636464646564666467646864696470647164726473647464756476647764786479648064816482648364846485648664876488648964906491649264936494649564966497649864996500650165026503650465056506650765086509651065116512651365146515651665176518651965206521652265236524652565266527652865296530653165326533653465356536653765386539654065416542654365446545654665476548654965506551655265536554655565566557655865596560656165626563656465656566656765686569657065716572657365746575657665776578657965806581658265836584658565866587658865896590659165926593659465956596659765986599660066016602660366046605660666076608660966106611661266136614661566166617661866196620662166226623662466256626662766286629663066316632663366346635663666376638663966406641664266436644
  1. #include "unity.h"
  2. #include "iec60870_common.h"
  3. #include "cs104_slave.h"
  4. #include "cs104_connection.h"
  5. #include "hal_time.h"
  6. #include "hal_thread.h"
  7. #include "buffer_frame.h"
  8. #include <string.h>
  9. #include <stdlib.h>
  10. #ifndef CONFIG_CS104_SUPPORT_TLS
  11. #define CONFIG_CS104_SUPPORT_TLS 0
  12. #endif
  13. int
  14. CS104_Connection_sendMessage(CS104_Connection self, uint8_t* message, int messageSize);
  15. #if WIN32
  16. #define bzero(b,len) (memset((b), '\0', (len)), (void) 0)
  17. #endif
  18. void setUp(void) { }
  19. void tearDown(void) {}
  20. static struct sCS101_AppLayerParameters defaultAppLayerParameters = {
  21. /* .sizeOfTypeId = */ 1,
  22. /* .sizeOfVSQ = */ 1,
  23. /* .sizeOfCOT = */ 2,
  24. /* .originatorAddress = */ 0,
  25. /* .sizeOfCA = */ 2,
  26. /* .sizeOfIOA = */ 3,
  27. /* .maxSizeOfASDU = */ 249
  28. };
  29. typedef struct sCS104_IPAddress* CS104_IPAddress;
  30. struct sCS104_IPAddress
  31. {
  32. uint8_t address[16];
  33. eCS104_IPAddressType type;
  34. };
  35. static bool
  36. CS104_IPAddress_setFromString(CS104_IPAddress self, const char* ipAddrStr)
  37. {
  38. if (strchr(ipAddrStr, '.') != NULL) {
  39. /* parse IPv4 string */
  40. self->type = IP_ADDRESS_TYPE_IPV4;
  41. int i;
  42. for (i = 0; i < 4; i++) {
  43. uint32_t val = strtoul(ipAddrStr, NULL, 10);
  44. if (val > UINT8_MAX)
  45. return false;
  46. self->address[i] = val;
  47. ipAddrStr = strchr(ipAddrStr, '.');
  48. if ((ipAddrStr == NULL) || (*ipAddrStr == 0))
  49. break;
  50. ipAddrStr++;
  51. }
  52. return true;
  53. }
  54. else if (strchr(ipAddrStr, ':') != NULL) {
  55. self->type = IP_ADDRESS_TYPE_IPV6;
  56. /* has "::" ? */
  57. char* doubleSep = (char*) strstr(ipAddrStr, "::");
  58. int elementsBefore = 0;
  59. int elementsAfter = 8;
  60. int elementsSkipped = 0;
  61. if (doubleSep) {
  62. /* count number of elements before double separator */
  63. char* curPos = (char*) ipAddrStr;
  64. if (curPos != doubleSep) {
  65. elementsBefore = 1;
  66. while (curPos < doubleSep) {
  67. if (*curPos == ':')
  68. elementsBefore++;
  69. curPos++;
  70. }
  71. }
  72. /* count number of elements after double separator */
  73. elementsAfter = 0;
  74. curPos = doubleSep + 2;
  75. if (*curPos != 0) {
  76. elementsAfter = 1;
  77. while (*curPos != 0) {
  78. if (*curPos == ':')
  79. elementsAfter++;
  80. curPos++;
  81. }
  82. }
  83. elementsSkipped = 8 - elementsBefore - elementsAfter;
  84. }
  85. int i;
  86. for (i = 0; i < elementsBefore; i++) {
  87. uint32_t val = strtoul(ipAddrStr, NULL, 16);
  88. if (val > UINT16_MAX)
  89. return false;
  90. self->address[i * 2] = val / 0x100;
  91. self->address[i * 2 + 1] = val % 0x100;
  92. ipAddrStr = strchr(ipAddrStr, ':');
  93. if ((ipAddrStr == NULL) || (*ipAddrStr == 0))
  94. break;
  95. ipAddrStr++;
  96. }
  97. for (i = elementsBefore; i < elementsBefore + elementsSkipped; i++) {
  98. self->address[i * 2] = 0;
  99. self->address[i * 2 +1] = 0;
  100. }
  101. if (doubleSep)
  102. ipAddrStr = doubleSep + 2;
  103. for (i = elementsBefore + elementsSkipped; i < 8; i++) {
  104. uint32_t val = strtoul(ipAddrStr, NULL, 16);
  105. if (val > UINT16_MAX)
  106. return false;
  107. self->address[i * 2] = val / 0x100;
  108. self->address[i * 2 + 1] = val % 0x100;
  109. ipAddrStr = strchr(ipAddrStr, ':');
  110. if ((ipAddrStr == NULL) || (*ipAddrStr == 0))
  111. break;
  112. ipAddrStr++;
  113. }
  114. return true;
  115. }
  116. else {
  117. return false;
  118. }
  119. }
  120. static bool
  121. CS104_IPAddress_equals(CS104_IPAddress self, CS104_IPAddress other)
  122. {
  123. if (self->type != other->type)
  124. return false;
  125. int size;
  126. if (self->type == IP_ADDRESS_TYPE_IPV4)
  127. size = 4;
  128. else
  129. size = 16;
  130. int i;
  131. for (i = 0; i < size; i++) {
  132. if (self->address[i] != other->address[i])
  133. return false;
  134. }
  135. return true;
  136. }
  137. #ifdef __cplusplus
  138. extern "C" {
  139. #endif
  140. void
  141. CS101_ASDU_encode(CS101_ASDU self, Frame frame);
  142. CS101_ASDU
  143. CS101_ASDU_createFromBuffer(CS101_AppLayerParameters parameters, uint8_t* msg, int msgLength);
  144. #ifdef __cplusplus
  145. }
  146. #endif
  147. void
  148. test_CP56Time2a(void)
  149. {
  150. struct sCP56Time2a currentTime;
  151. uint64_t currentTimestamp = Hal_getTimeInMs();
  152. CP56Time2a_createFromMsTimestamp(&currentTime, currentTimestamp);
  153. uint64_t convertedTimestamp = CP56Time2a_toMsTimestamp(&currentTime);
  154. TEST_ASSERT_EQUAL_UINT64(currentTimestamp, convertedTimestamp);
  155. }
  156. void
  157. test_CP56Time2aToMsTimestamp(void)
  158. {
  159. struct sCP56Time2a timeval;
  160. timeval.encodedValue[0] = 0x85;
  161. timeval.encodedValue[1] = 0x49;
  162. timeval.encodedValue[2] = 0x0c;
  163. timeval.encodedValue[3] = 0x09;
  164. timeval.encodedValue[4] = 0x55;
  165. timeval.encodedValue[5] = 0x03;
  166. timeval.encodedValue[6] = 0x11;
  167. uint64_t convertedTimeval = CP56Time2a_toMsTimestamp(&timeval);
  168. TEST_ASSERT_EQUAL_UINT64((uint64_t) 1490087538821, convertedTimeval);
  169. }
  170. void
  171. test_CP56Time2aConversionFunctions(void)
  172. {
  173. uint64_t currentTime = Hal_getTimeInMs();
  174. struct sCP56Time2a timeval;
  175. CP56Time2a_setFromMsTimestamp(&timeval, currentTime);
  176. uint64_t convertedTime = CP56Time2a_toMsTimestamp(&timeval);
  177. TEST_ASSERT_EQUAL_UINT64(currentTime, convertedTime);
  178. }
  179. void
  180. test_StepPositionInformation(void)
  181. {
  182. StepPositionInformation spi1;
  183. StepPositionInformation spi2;
  184. StepPositionInformation spi3;
  185. StepPositionInformation spi4;
  186. StepPositionInformation spi5;
  187. StepPositionInformation spi6;
  188. StepPositionInformation spi7;
  189. StepPositionInformation spi8;
  190. spi1 = StepPositionInformation_create(NULL, 101, 0, true, IEC60870_QUALITY_GOOD);
  191. spi2 = StepPositionInformation_create(NULL, 102, 63, false, IEC60870_QUALITY_OVERFLOW);
  192. spi3 = StepPositionInformation_create(NULL, 103, 62, false, IEC60870_QUALITY_RESERVED);
  193. spi4 = StepPositionInformation_create(NULL, 104, 61, false, IEC60870_QUALITY_ELAPSED_TIME_INVALID);
  194. spi5 = StepPositionInformation_create(NULL, 105, -61, false, IEC60870_QUALITY_BLOCKED);
  195. spi6 = StepPositionInformation_create(NULL, 106, -62, false, IEC60870_QUALITY_SUBSTITUTED);
  196. spi7 = StepPositionInformation_create(NULL, 107, -63, false, IEC60870_QUALITY_NON_TOPICAL);
  197. spi8 = StepPositionInformation_create(NULL, 108, 0, false, IEC60870_QUALITY_INVALID);
  198. TEST_ASSERT_EQUAL_INT(0, StepPositionInformation_getValue(spi1));
  199. TEST_ASSERT_TRUE(StepPositionInformation_isTransient(spi1));
  200. TEST_ASSERT_EQUAL_INT(63, StepPositionInformation_getValue(spi2));
  201. TEST_ASSERT_FALSE(StepPositionInformation_isTransient(spi2));
  202. TEST_ASSERT_EQUAL_INT(62, StepPositionInformation_getValue(spi3));
  203. TEST_ASSERT_FALSE(StepPositionInformation_isTransient(spi3));
  204. TEST_ASSERT_EQUAL_INT(61, StepPositionInformation_getValue(spi4));
  205. TEST_ASSERT_FALSE(StepPositionInformation_isTransient(spi4));
  206. TEST_ASSERT_EQUAL_INT(-61, StepPositionInformation_getValue(spi5));
  207. TEST_ASSERT_FALSE(StepPositionInformation_isTransient(spi5));
  208. TEST_ASSERT_EQUAL_INT(-62, StepPositionInformation_getValue(spi6));
  209. TEST_ASSERT_FALSE(StepPositionInformation_isTransient(spi6));
  210. TEST_ASSERT_EQUAL_INT(-63, StepPositionInformation_getValue(spi7));
  211. TEST_ASSERT_FALSE(StepPositionInformation_isTransient(spi7));
  212. TEST_ASSERT_EQUAL_INT(0, StepPositionInformation_getValue(spi8));
  213. TEST_ASSERT_FALSE(StepPositionInformation_isTransient(spi8));
  214. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, StepPositionInformation_getQuality(spi1));
  215. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, StepPositionInformation_getQuality(spi2));
  216. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, StepPositionInformation_getQuality(spi3));
  217. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, StepPositionInformation_getQuality(spi4));
  218. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, StepPositionInformation_getQuality(spi5));
  219. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, StepPositionInformation_getQuality(spi6));
  220. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, StepPositionInformation_getQuality(spi7));
  221. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, StepPositionInformation_getQuality(spi8));
  222. uint8_t buffer[256];
  223. struct sBufferFrame bf;
  224. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  225. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  226. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi1);
  227. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi2);
  228. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi3);
  229. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi4);
  230. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi5);
  231. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi6);
  232. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi7);
  233. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi8);
  234. StepPositionInformation_destroy(spi1);
  235. StepPositionInformation_destroy(spi2);
  236. StepPositionInformation_destroy(spi3);
  237. StepPositionInformation_destroy(spi4);
  238. StepPositionInformation_destroy(spi5);
  239. StepPositionInformation_destroy(spi6);
  240. StepPositionInformation_destroy(spi7);
  241. StepPositionInformation_destroy(spi8);
  242. CS101_ASDU_encode(asdu, f);
  243. TEST_ASSERT_EQUAL_INT(46, Frame_getMsgSize(f));
  244. CS101_ASDU_destroy(asdu);
  245. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  246. TEST_ASSERT_EQUAL_INT(8, CS101_ASDU_getNumberOfElements(asdu2));
  247. StepPositionInformation spi1_dec = (StepPositionInformation) CS101_ASDU_getElement(asdu2, 0);
  248. StepPositionInformation spi2_dec = (StepPositionInformation) CS101_ASDU_getElement(asdu2, 1);
  249. StepPositionInformation spi3_dec = (StepPositionInformation) CS101_ASDU_getElement(asdu2, 2);
  250. StepPositionInformation spi4_dec = (StepPositionInformation) CS101_ASDU_getElement(asdu2, 3);
  251. StepPositionInformation spi5_dec = (StepPositionInformation) CS101_ASDU_getElement(asdu2, 4);
  252. StepPositionInformation spi6_dec = (StepPositionInformation) CS101_ASDU_getElement(asdu2, 5);
  253. StepPositionInformation spi7_dec = (StepPositionInformation) CS101_ASDU_getElement(asdu2, 6);
  254. StepPositionInformation spi8_dec = (StepPositionInformation) CS101_ASDU_getElement(asdu2, 7);
  255. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject)spi1_dec));
  256. TEST_ASSERT_EQUAL_INT(102, InformationObject_getObjectAddress((InformationObject)spi2_dec));
  257. TEST_ASSERT_EQUAL_INT(103, InformationObject_getObjectAddress((InformationObject)spi3_dec));
  258. TEST_ASSERT_EQUAL_INT(104, InformationObject_getObjectAddress((InformationObject)spi4_dec));
  259. TEST_ASSERT_EQUAL_INT(105, InformationObject_getObjectAddress((InformationObject)spi5_dec));
  260. TEST_ASSERT_EQUAL_INT(106, InformationObject_getObjectAddress((InformationObject)spi6_dec));
  261. TEST_ASSERT_EQUAL_INT(107, InformationObject_getObjectAddress((InformationObject)spi7_dec));
  262. TEST_ASSERT_EQUAL_INT(108, InformationObject_getObjectAddress((InformationObject)spi8_dec));
  263. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, StepPositionInformation_getQuality(spi1_dec));
  264. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, StepPositionInformation_getQuality(spi2_dec));
  265. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, StepPositionInformation_getQuality(spi3_dec));
  266. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, StepPositionInformation_getQuality(spi4_dec));
  267. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, StepPositionInformation_getQuality(spi5_dec));
  268. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, StepPositionInformation_getQuality(spi6_dec));
  269. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, StepPositionInformation_getQuality(spi7_dec));
  270. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, StepPositionInformation_getQuality(spi8_dec));
  271. TEST_ASSERT_EQUAL_INT(0, StepPositionInformation_getValue(spi1_dec));
  272. TEST_ASSERT_TRUE(StepPositionInformation_isTransient(spi1_dec));
  273. TEST_ASSERT_EQUAL_INT(63, StepPositionInformation_getValue(spi2_dec));
  274. TEST_ASSERT_FALSE(StepPositionInformation_isTransient(spi2_dec));
  275. TEST_ASSERT_EQUAL_INT(62, StepPositionInformation_getValue(spi3_dec));
  276. TEST_ASSERT_FALSE(StepPositionInformation_isTransient(spi3_dec));
  277. TEST_ASSERT_EQUAL_INT(61, StepPositionInformation_getValue(spi4_dec));
  278. TEST_ASSERT_FALSE(StepPositionInformation_isTransient(spi4_dec));
  279. TEST_ASSERT_EQUAL_INT(-61, StepPositionInformation_getValue(spi5_dec));
  280. TEST_ASSERT_FALSE(StepPositionInformation_isTransient(spi5_dec));
  281. TEST_ASSERT_EQUAL_INT(-62, StepPositionInformation_getValue(spi6_dec));
  282. TEST_ASSERT_FALSE(StepPositionInformation_isTransient(spi6_dec));
  283. TEST_ASSERT_EQUAL_INT(-63, StepPositionInformation_getValue(spi7_dec));
  284. TEST_ASSERT_FALSE(StepPositionInformation_isTransient(spi7_dec));
  285. TEST_ASSERT_EQUAL_INT(-0, StepPositionInformation_getValue(spi8_dec));
  286. TEST_ASSERT_FALSE(StepPositionInformation_isTransient(spi8_dec));
  287. StepPositionInformation_destroy(spi1_dec);
  288. StepPositionInformation_destroy(spi2_dec);
  289. StepPositionInformation_destroy(spi3_dec);
  290. StepPositionInformation_destroy(spi4_dec);
  291. StepPositionInformation_destroy(spi5_dec);
  292. StepPositionInformation_destroy(spi6_dec);
  293. StepPositionInformation_destroy(spi7_dec);
  294. StepPositionInformation_destroy(spi8_dec);
  295. CS101_ASDU_destroy(asdu2);
  296. }
  297. void
  298. test_StepPositionWithCP24Time2a(void)
  299. {
  300. StepPositionWithCP24Time2a spi1;
  301. StepPositionWithCP24Time2a spi2;
  302. StepPositionWithCP24Time2a spi3;
  303. StepPositionWithCP24Time2a spi4;
  304. StepPositionWithCP24Time2a spi5;
  305. StepPositionWithCP24Time2a spi6;
  306. StepPositionWithCP24Time2a spi7;
  307. StepPositionWithCP24Time2a spi8;
  308. uint64_t time1 = Hal_getTimeInMs();
  309. uint64_t time2 = time1 + 1000;
  310. uint64_t time3 = time2 + 1000;
  311. uint64_t time4 = time3 + 1000;
  312. uint64_t time5 = time4 + 1000;
  313. uint64_t time6 = time5 + 1000;
  314. uint64_t time7 = time6 + 1000;
  315. uint64_t time8 = time7 + 1000;
  316. struct sCP24Time2a cpTime1;
  317. struct sCP24Time2a cpTime2;
  318. struct sCP24Time2a cpTime3;
  319. struct sCP24Time2a cpTime4;
  320. struct sCP24Time2a cpTime5;
  321. struct sCP24Time2a cpTime6;
  322. struct sCP24Time2a cpTime7;
  323. struct sCP24Time2a cpTime8;
  324. bzero(&cpTime1, sizeof(struct sCP24Time2a));
  325. bzero(&cpTime2, sizeof(struct sCP24Time2a));
  326. bzero(&cpTime3, sizeof(struct sCP24Time2a));
  327. bzero(&cpTime4, sizeof(struct sCP24Time2a));
  328. bzero(&cpTime5, sizeof(struct sCP24Time2a));
  329. bzero(&cpTime6, sizeof(struct sCP24Time2a));
  330. bzero(&cpTime7, sizeof(struct sCP24Time2a));
  331. bzero(&cpTime8, sizeof(struct sCP24Time2a));
  332. CP24Time2a_setMinute(&cpTime1, 12);
  333. CP24Time2a_setMillisecond(&cpTime1, 24123);
  334. CP24Time2a_setMinute(&cpTime2, 54);
  335. CP24Time2a_setMillisecond(&cpTime2, 12345);
  336. CP24Time2a_setMinute(&cpTime3, 00);
  337. CP24Time2a_setMillisecond(&cpTime3, 00001);
  338. CP24Time2a_setMinute(&cpTime4, 12);
  339. CP24Time2a_setMillisecond(&cpTime4, 24123);
  340. CP24Time2a_setMinute(&cpTime5, 12);
  341. CP24Time2a_setMillisecond(&cpTime5, 24123);
  342. CP24Time2a_setMinute(&cpTime6, 12);
  343. CP24Time2a_setMillisecond(&cpTime6, 24123);
  344. CP24Time2a_setMinute(&cpTime7, 12);
  345. CP24Time2a_setMillisecond(&cpTime7, 24123);
  346. CP24Time2a_setMinute(&cpTime8, 12);
  347. CP24Time2a_setMillisecond(&cpTime8, 24123);
  348. spi1 = StepPositionWithCP24Time2a_create(NULL, 101, 0, true, IEC60870_QUALITY_GOOD, &cpTime1);
  349. spi2 = StepPositionWithCP24Time2a_create(NULL, 102, 63, false, IEC60870_QUALITY_OVERFLOW, &cpTime2);
  350. spi3 = StepPositionWithCP24Time2a_create(NULL, 103, 62, false, IEC60870_QUALITY_RESERVED, &cpTime3);
  351. spi4 = StepPositionWithCP24Time2a_create(NULL, 104, 61, false, IEC60870_QUALITY_ELAPSED_TIME_INVALID, &cpTime4);
  352. spi5 = StepPositionWithCP24Time2a_create(NULL, 105, -61, false, IEC60870_QUALITY_BLOCKED, &cpTime5);
  353. spi6 = StepPositionWithCP24Time2a_create(NULL, 106, -62, false, IEC60870_QUALITY_SUBSTITUTED, &cpTime6);
  354. spi7 = StepPositionWithCP24Time2a_create(NULL, 107, -63, false, IEC60870_QUALITY_NON_TOPICAL, &cpTime7);
  355. spi8 = StepPositionWithCP24Time2a_create(NULL, 108, 0, false, IEC60870_QUALITY_INVALID, &cpTime8);
  356. TEST_ASSERT_EQUAL_INT(0, StepPositionInformation_getValue((StepPositionInformation)spi1));
  357. TEST_ASSERT_TRUE(StepPositionInformation_isTransient((StepPositionInformation)spi1));
  358. TEST_ASSERT_EQUAL_INT(63, StepPositionInformation_getValue((StepPositionInformation)spi2));
  359. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi2));
  360. TEST_ASSERT_EQUAL_INT(62, StepPositionInformation_getValue((StepPositionInformation)spi3));
  361. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi3));
  362. TEST_ASSERT_EQUAL_INT(61, StepPositionInformation_getValue((StepPositionInformation)spi4));
  363. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi4));
  364. TEST_ASSERT_EQUAL_INT(-61, StepPositionInformation_getValue((StepPositionInformation)spi5));
  365. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi5));
  366. TEST_ASSERT_EQUAL_INT(-62, StepPositionInformation_getValue((StepPositionInformation)spi6));
  367. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi6));
  368. TEST_ASSERT_EQUAL_INT(-63, StepPositionInformation_getValue((StepPositionInformation)spi7));
  369. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi7));
  370. TEST_ASSERT_EQUAL_INT(0, StepPositionInformation_getValue((StepPositionInformation)spi8));
  371. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi8));
  372. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, StepPositionInformation_getQuality((StepPositionInformation)spi1));
  373. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, StepPositionInformation_getQuality((StepPositionInformation)spi2));
  374. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, StepPositionInformation_getQuality((StepPositionInformation)spi3));
  375. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, StepPositionInformation_getQuality((StepPositionInformation)spi4));
  376. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, StepPositionInformation_getQuality((StepPositionInformation)spi5));
  377. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, StepPositionInformation_getQuality((StepPositionInformation)spi6));
  378. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, StepPositionInformation_getQuality((StepPositionInformation)spi7));
  379. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, StepPositionInformation_getQuality((StepPositionInformation)spi8));
  380. uint8_t buffer[256];
  381. struct sBufferFrame bf;
  382. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  383. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  384. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi1);
  385. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi2);
  386. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi3);
  387. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi4);
  388. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi5);
  389. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi6);
  390. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi7);
  391. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi8);
  392. StepPositionWithCP24Time2a_destroy(spi1);
  393. StepPositionWithCP24Time2a_destroy(spi2);
  394. StepPositionWithCP24Time2a_destroy(spi3);
  395. StepPositionWithCP24Time2a_destroy(spi4);
  396. StepPositionWithCP24Time2a_destroy(spi5);
  397. StepPositionWithCP24Time2a_destroy(spi6);
  398. StepPositionWithCP24Time2a_destroy(spi7);
  399. StepPositionWithCP24Time2a_destroy(spi8);
  400. CS101_ASDU_encode(asdu, f);
  401. TEST_ASSERT_EQUAL_INT(70, Frame_getMsgSize(f));
  402. CS101_ASDU_destroy(asdu);
  403. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  404. TEST_ASSERT_EQUAL_INT(8, CS101_ASDU_getNumberOfElements(asdu2));
  405. StepPositionWithCP24Time2a spi1_dec = (StepPositionWithCP24Time2a) CS101_ASDU_getElement(asdu2, 0);
  406. StepPositionWithCP24Time2a spi2_dec = (StepPositionWithCP24Time2a) CS101_ASDU_getElement(asdu2, 1);
  407. StepPositionWithCP24Time2a spi3_dec = (StepPositionWithCP24Time2a) CS101_ASDU_getElement(asdu2, 2);
  408. StepPositionWithCP24Time2a spi4_dec = (StepPositionWithCP24Time2a) CS101_ASDU_getElement(asdu2, 3);
  409. StepPositionWithCP24Time2a spi5_dec = (StepPositionWithCP24Time2a) CS101_ASDU_getElement(asdu2, 4);
  410. StepPositionWithCP24Time2a spi6_dec = (StepPositionWithCP24Time2a) CS101_ASDU_getElement(asdu2, 5);
  411. StepPositionWithCP24Time2a spi7_dec = (StepPositionWithCP24Time2a) CS101_ASDU_getElement(asdu2, 6);
  412. StepPositionWithCP24Time2a spi8_dec = (StepPositionWithCP24Time2a) CS101_ASDU_getElement(asdu2, 7);
  413. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject)spi1_dec));
  414. TEST_ASSERT_EQUAL_INT(102, InformationObject_getObjectAddress((InformationObject)spi2_dec));
  415. TEST_ASSERT_EQUAL_INT(103, InformationObject_getObjectAddress((InformationObject)spi3_dec));
  416. TEST_ASSERT_EQUAL_INT(104, InformationObject_getObjectAddress((InformationObject)spi4_dec));
  417. TEST_ASSERT_EQUAL_INT(105, InformationObject_getObjectAddress((InformationObject)spi5_dec));
  418. TEST_ASSERT_EQUAL_INT(106, InformationObject_getObjectAddress((InformationObject)spi6_dec));
  419. TEST_ASSERT_EQUAL_INT(107, InformationObject_getObjectAddress((InformationObject)spi7_dec));
  420. TEST_ASSERT_EQUAL_INT(108, InformationObject_getObjectAddress((InformationObject)spi8_dec));
  421. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, StepPositionInformation_getQuality((StepPositionInformation)spi1_dec));
  422. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, StepPositionInformation_getQuality((StepPositionInformation)spi2_dec));
  423. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, StepPositionInformation_getQuality((StepPositionInformation)spi3_dec));
  424. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, StepPositionInformation_getQuality((StepPositionInformation)spi4_dec));
  425. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, StepPositionInformation_getQuality((StepPositionInformation)spi5_dec));
  426. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, StepPositionInformation_getQuality((StepPositionInformation)spi6_dec));
  427. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, StepPositionInformation_getQuality((StepPositionInformation)spi7_dec));
  428. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, StepPositionInformation_getQuality((StepPositionInformation)spi8_dec));
  429. TEST_ASSERT_EQUAL_INT(0, StepPositionInformation_getValue((StepPositionInformation)spi1_dec));
  430. TEST_ASSERT_TRUE(StepPositionInformation_isTransient((StepPositionInformation)spi1_dec));
  431. TEST_ASSERT_EQUAL_INT(63, StepPositionInformation_getValue((StepPositionInformation)spi2_dec));
  432. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi2_dec));
  433. TEST_ASSERT_EQUAL_INT(62, StepPositionInformation_getValue((StepPositionInformation)spi3_dec));
  434. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi3_dec));
  435. TEST_ASSERT_EQUAL_INT(61, StepPositionInformation_getValue((StepPositionInformation)spi4_dec));
  436. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi4_dec));
  437. TEST_ASSERT_EQUAL_INT(-61, StepPositionInformation_getValue((StepPositionInformation)spi5_dec));
  438. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi5_dec));
  439. TEST_ASSERT_EQUAL_INT(-62, StepPositionInformation_getValue((StepPositionInformation)spi6_dec));
  440. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi6_dec));
  441. TEST_ASSERT_EQUAL_INT(-63, StepPositionInformation_getValue((StepPositionInformation)spi7_dec));
  442. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi7_dec));
  443. TEST_ASSERT_EQUAL_INT(-0, StepPositionInformation_getValue((StepPositionInformation)spi8_dec));
  444. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi8_dec));
  445. CP24Time2a time1_dec = StepPositionWithCP24Time2a_getTimestamp(spi1_dec);
  446. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time1_dec));
  447. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time1_dec));
  448. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time1_dec));
  449. CP24Time2a time2_dec = StepPositionWithCP24Time2a_getTimestamp(spi2_dec);
  450. TEST_ASSERT_EQUAL_INT(54, CP24Time2a_getMinute(time2_dec));
  451. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getSecond(time2_dec));
  452. TEST_ASSERT_EQUAL_INT(345, CP24Time2a_getMillisecond(time2_dec));
  453. CP24Time2a time3_dec = StepPositionWithCP24Time2a_getTimestamp(spi3_dec);
  454. TEST_ASSERT_EQUAL_INT(00, CP24Time2a_getMinute(time3_dec));
  455. TEST_ASSERT_EQUAL_INT(00, CP24Time2a_getSecond(time3_dec));
  456. TEST_ASSERT_EQUAL_INT(1, CP24Time2a_getMillisecond(time3_dec));
  457. CP24Time2a time4_dec = StepPositionWithCP24Time2a_getTimestamp(spi4_dec);
  458. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time4_dec));
  459. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time4_dec));
  460. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time4_dec));
  461. CP24Time2a time5_dec = StepPositionWithCP24Time2a_getTimestamp(spi5_dec);
  462. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time5_dec));
  463. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time5_dec));
  464. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time5_dec));
  465. CP24Time2a time6_dec = StepPositionWithCP24Time2a_getTimestamp(spi6_dec);
  466. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time6_dec));
  467. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time6_dec));
  468. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time6_dec));
  469. CP24Time2a time7_dec = StepPositionWithCP24Time2a_getTimestamp(spi7_dec);
  470. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time7_dec));
  471. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time7_dec));
  472. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time7_dec));
  473. CP24Time2a time8_dec = StepPositionWithCP24Time2a_getTimestamp(spi8_dec);
  474. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time8_dec));
  475. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time8_dec));
  476. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time8_dec));
  477. StepPositionWithCP24Time2a_destroy(spi1_dec);
  478. StepPositionWithCP24Time2a_destroy(spi2_dec);
  479. StepPositionWithCP24Time2a_destroy(spi3_dec);
  480. StepPositionWithCP24Time2a_destroy(spi4_dec);
  481. StepPositionWithCP24Time2a_destroy(spi5_dec);
  482. StepPositionWithCP24Time2a_destroy(spi6_dec);
  483. StepPositionWithCP24Time2a_destroy(spi7_dec);
  484. StepPositionWithCP24Time2a_destroy(spi8_dec);
  485. CS101_ASDU_destroy(asdu2);
  486. }
  487. void
  488. test_StepPositionWithCP56Time2a(void)
  489. {
  490. StepPositionWithCP56Time2a spi1;
  491. StepPositionWithCP56Time2a spi2;
  492. StepPositionWithCP56Time2a spi3;
  493. StepPositionWithCP56Time2a spi4;
  494. StepPositionWithCP56Time2a spi5;
  495. StepPositionWithCP56Time2a spi6;
  496. StepPositionWithCP56Time2a spi7;
  497. StepPositionWithCP56Time2a spi8;
  498. uint64_t time1 = Hal_getTimeInMs();
  499. uint64_t time2 = time1 + 1000;
  500. uint64_t time3 = time2 + 1000;
  501. uint64_t time4 = time3 + 1000;
  502. uint64_t time5 = time4 + 1000;
  503. uint64_t time6 = time5 + 1000;
  504. uint64_t time7 = time6 + 1000;
  505. uint64_t time8 = time7 + 1000;
  506. struct sCP56Time2a cpTime1;
  507. struct sCP56Time2a cpTime2;
  508. struct sCP56Time2a cpTime3;
  509. struct sCP56Time2a cpTime4;
  510. struct sCP56Time2a cpTime5;
  511. struct sCP56Time2a cpTime6;
  512. struct sCP56Time2a cpTime7;
  513. struct sCP56Time2a cpTime8;
  514. CP56Time2a_createFromMsTimestamp(&cpTime1, time1);
  515. CP56Time2a_createFromMsTimestamp(&cpTime2, time2);
  516. CP56Time2a_createFromMsTimestamp(&cpTime3, time3);
  517. CP56Time2a_createFromMsTimestamp(&cpTime4, time4);
  518. CP56Time2a_createFromMsTimestamp(&cpTime5, time5);
  519. CP56Time2a_createFromMsTimestamp(&cpTime6, time6);
  520. CP56Time2a_createFromMsTimestamp(&cpTime7, time7);
  521. CP56Time2a_createFromMsTimestamp(&cpTime8, time8);
  522. spi1 = StepPositionWithCP56Time2a_create(NULL, 101, 0, true, IEC60870_QUALITY_GOOD, &cpTime1);
  523. spi2 = StepPositionWithCP56Time2a_create(NULL, 102, 63, false, IEC60870_QUALITY_OVERFLOW, &cpTime2);
  524. spi3 = StepPositionWithCP56Time2a_create(NULL, 103, 62, false, IEC60870_QUALITY_RESERVED, &cpTime3);
  525. spi4 = StepPositionWithCP56Time2a_create(NULL, 104, 61, false, IEC60870_QUALITY_ELAPSED_TIME_INVALID, &cpTime4);
  526. spi5 = StepPositionWithCP56Time2a_create(NULL, 105, -61, false, IEC60870_QUALITY_BLOCKED, &cpTime5);
  527. spi6 = StepPositionWithCP56Time2a_create(NULL, 106, -62, false, IEC60870_QUALITY_SUBSTITUTED, &cpTime6);
  528. spi7 = StepPositionWithCP56Time2a_create(NULL, 107, -63, false, IEC60870_QUALITY_NON_TOPICAL, &cpTime7);
  529. spi8 = StepPositionWithCP56Time2a_create(NULL, 108, 0, false, IEC60870_QUALITY_INVALID, &cpTime8);
  530. TEST_ASSERT_EQUAL_INT(0, StepPositionInformation_getValue((StepPositionInformation)spi1));
  531. TEST_ASSERT_TRUE(StepPositionInformation_isTransient((StepPositionInformation)spi1));
  532. TEST_ASSERT_EQUAL_INT(63, StepPositionInformation_getValue((StepPositionInformation)spi2));
  533. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi2));
  534. TEST_ASSERT_EQUAL_INT(62, StepPositionInformation_getValue((StepPositionInformation)spi3));
  535. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi3));
  536. TEST_ASSERT_EQUAL_INT(61, StepPositionInformation_getValue((StepPositionInformation)spi4));
  537. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi4));
  538. TEST_ASSERT_EQUAL_INT(-61, StepPositionInformation_getValue((StepPositionInformation)spi5));
  539. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi5));
  540. TEST_ASSERT_EQUAL_INT(-62, StepPositionInformation_getValue((StepPositionInformation)spi6));
  541. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi6));
  542. TEST_ASSERT_EQUAL_INT(-63, StepPositionInformation_getValue((StepPositionInformation)spi7));
  543. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi7));
  544. TEST_ASSERT_EQUAL_INT(0, StepPositionInformation_getValue((StepPositionInformation)spi8));
  545. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi8));
  546. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, StepPositionInformation_getQuality((StepPositionInformation)spi1));
  547. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, StepPositionInformation_getQuality((StepPositionInformation)spi2));
  548. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, StepPositionInformation_getQuality((StepPositionInformation)spi3));
  549. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, StepPositionInformation_getQuality((StepPositionInformation)spi4));
  550. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, StepPositionInformation_getQuality((StepPositionInformation)spi5));
  551. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, StepPositionInformation_getQuality((StepPositionInformation)spi6));
  552. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, StepPositionInformation_getQuality((StepPositionInformation)spi7));
  553. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, StepPositionInformation_getQuality((StepPositionInformation)spi8));
  554. uint8_t buffer[256];
  555. struct sBufferFrame bf;
  556. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  557. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  558. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi1);
  559. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi2);
  560. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi3);
  561. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi4);
  562. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi5);
  563. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi6);
  564. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi7);
  565. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi8);
  566. StepPositionWithCP56Time2a_destroy(spi1);
  567. StepPositionWithCP56Time2a_destroy(spi2);
  568. StepPositionWithCP56Time2a_destroy(spi3);
  569. StepPositionWithCP56Time2a_destroy(spi4);
  570. StepPositionWithCP56Time2a_destroy(spi5);
  571. StepPositionWithCP56Time2a_destroy(spi6);
  572. StepPositionWithCP56Time2a_destroy(spi7);
  573. StepPositionWithCP56Time2a_destroy(spi8);
  574. CS101_ASDU_encode(asdu, f);
  575. TEST_ASSERT_EQUAL_INT(102, Frame_getMsgSize(f));
  576. CS101_ASDU_destroy(asdu);
  577. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  578. TEST_ASSERT_EQUAL_INT(8, CS101_ASDU_getNumberOfElements(asdu2));
  579. StepPositionWithCP56Time2a spi1_dec = (StepPositionWithCP56Time2a) CS101_ASDU_getElement(asdu2, 0);
  580. StepPositionWithCP56Time2a spi2_dec = (StepPositionWithCP56Time2a) CS101_ASDU_getElement(asdu2, 1);
  581. StepPositionWithCP56Time2a spi3_dec = (StepPositionWithCP56Time2a) CS101_ASDU_getElement(asdu2, 2);
  582. StepPositionWithCP56Time2a spi4_dec = (StepPositionWithCP56Time2a) CS101_ASDU_getElement(asdu2, 3);
  583. StepPositionWithCP56Time2a spi5_dec = (StepPositionWithCP56Time2a) CS101_ASDU_getElement(asdu2, 4);
  584. StepPositionWithCP56Time2a spi6_dec = (StepPositionWithCP56Time2a) CS101_ASDU_getElement(asdu2, 5);
  585. StepPositionWithCP56Time2a spi7_dec = (StepPositionWithCP56Time2a) CS101_ASDU_getElement(asdu2, 6);
  586. StepPositionWithCP56Time2a spi8_dec = (StepPositionWithCP56Time2a) CS101_ASDU_getElement(asdu2, 7);
  587. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject)spi1_dec));
  588. TEST_ASSERT_EQUAL_INT(102, InformationObject_getObjectAddress((InformationObject)spi2_dec));
  589. TEST_ASSERT_EQUAL_INT(103, InformationObject_getObjectAddress((InformationObject)spi3_dec));
  590. TEST_ASSERT_EQUAL_INT(104, InformationObject_getObjectAddress((InformationObject)spi4_dec));
  591. TEST_ASSERT_EQUAL_INT(105, InformationObject_getObjectAddress((InformationObject)spi5_dec));
  592. TEST_ASSERT_EQUAL_INT(106, InformationObject_getObjectAddress((InformationObject)spi6_dec));
  593. TEST_ASSERT_EQUAL_INT(107, InformationObject_getObjectAddress((InformationObject)spi7_dec));
  594. TEST_ASSERT_EQUAL_INT(108, InformationObject_getObjectAddress((InformationObject)spi8_dec));
  595. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, StepPositionInformation_getQuality((StepPositionInformation)spi1_dec));
  596. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, StepPositionInformation_getQuality((StepPositionInformation)spi2_dec));
  597. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, StepPositionInformation_getQuality((StepPositionInformation)spi3_dec));
  598. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, StepPositionInformation_getQuality((StepPositionInformation)spi4_dec));
  599. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, StepPositionInformation_getQuality((StepPositionInformation)spi5_dec));
  600. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, StepPositionInformation_getQuality((StepPositionInformation)spi6_dec));
  601. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, StepPositionInformation_getQuality((StepPositionInformation)spi7_dec));
  602. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, StepPositionInformation_getQuality((StepPositionInformation)spi8_dec));
  603. TEST_ASSERT_EQUAL_INT(0, StepPositionInformation_getValue((StepPositionInformation)spi1_dec));
  604. TEST_ASSERT_TRUE(StepPositionInformation_isTransient((StepPositionInformation)spi1_dec));
  605. TEST_ASSERT_EQUAL_INT(63, StepPositionInformation_getValue((StepPositionInformation)spi2_dec));
  606. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi2_dec));
  607. TEST_ASSERT_EQUAL_INT(62, StepPositionInformation_getValue((StepPositionInformation)spi3_dec));
  608. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi3_dec));
  609. TEST_ASSERT_EQUAL_INT(61, StepPositionInformation_getValue((StepPositionInformation)spi4_dec));
  610. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi4_dec));
  611. TEST_ASSERT_EQUAL_INT(-61, StepPositionInformation_getValue((StepPositionInformation)spi5_dec));
  612. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi5_dec));
  613. TEST_ASSERT_EQUAL_INT(-62, StepPositionInformation_getValue((StepPositionInformation)spi6_dec));
  614. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi6_dec));
  615. TEST_ASSERT_EQUAL_INT(-63, StepPositionInformation_getValue((StepPositionInformation)spi7_dec));
  616. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi7_dec));
  617. TEST_ASSERT_EQUAL_INT(-0, StepPositionInformation_getValue((StepPositionInformation)spi8_dec));
  618. TEST_ASSERT_FALSE(StepPositionInformation_isTransient((StepPositionInformation)spi8_dec));
  619. TEST_ASSERT_EQUAL_UINT64(time1, CP56Time2a_toMsTimestamp(StepPositionWithCP56Time2a_getTimestamp(spi1_dec)));
  620. TEST_ASSERT_EQUAL_UINT64(time2, CP56Time2a_toMsTimestamp(StepPositionWithCP56Time2a_getTimestamp(spi2_dec)));
  621. TEST_ASSERT_EQUAL_UINT64(time3, CP56Time2a_toMsTimestamp(StepPositionWithCP56Time2a_getTimestamp(spi3_dec)));
  622. TEST_ASSERT_EQUAL_UINT64(time4, CP56Time2a_toMsTimestamp(StepPositionWithCP56Time2a_getTimestamp(spi4_dec)));
  623. TEST_ASSERT_EQUAL_UINT64(time5, CP56Time2a_toMsTimestamp(StepPositionWithCP56Time2a_getTimestamp(spi5_dec)));
  624. TEST_ASSERT_EQUAL_UINT64(time6, CP56Time2a_toMsTimestamp(StepPositionWithCP56Time2a_getTimestamp(spi6_dec)));
  625. TEST_ASSERT_EQUAL_UINT64(time7, CP56Time2a_toMsTimestamp(StepPositionWithCP56Time2a_getTimestamp(spi7_dec)));
  626. TEST_ASSERT_EQUAL_UINT64(time8, CP56Time2a_toMsTimestamp(StepPositionWithCP56Time2a_getTimestamp(spi8_dec)));
  627. StepPositionWithCP56Time2a_destroy(spi1_dec);
  628. StepPositionWithCP56Time2a_destroy(spi2_dec);
  629. StepPositionWithCP56Time2a_destroy(spi3_dec);
  630. StepPositionWithCP56Time2a_destroy(spi4_dec);
  631. StepPositionWithCP56Time2a_destroy(spi5_dec);
  632. StepPositionWithCP56Time2a_destroy(spi6_dec);
  633. StepPositionWithCP56Time2a_destroy(spi7_dec);
  634. StepPositionWithCP56Time2a_destroy(spi8_dec);
  635. CS101_ASDU_destroy(asdu2);
  636. }
  637. void
  638. test_addMaxNumberOfIOsToASDU(void)
  639. {
  640. struct sCS101_AppLayerParameters salParameters;
  641. salParameters.maxSizeOfASDU = 100;
  642. salParameters.originatorAddress = 0;
  643. salParameters.sizeOfCA = 2;
  644. salParameters.sizeOfCOT = 2;
  645. salParameters.sizeOfIOA = 3;
  646. salParameters.sizeOfTypeId = 1;
  647. salParameters.sizeOfVSQ = 1;
  648. CS101_ASDU asdu = CS101_ASDU_create(&salParameters, false, CS101_COT_SPONTANEOUS, 0, 1, false, false);
  649. int ioa = 100;
  650. bool added = false;
  651. do {
  652. InformationObject io = (InformationObject) SinglePointInformation_create(NULL, ioa, true, IEC60870_QUALITY_GOOD);
  653. added = CS101_ASDU_addInformationObject(asdu, io);
  654. InformationObject_destroy(io);
  655. ioa++;
  656. }
  657. while (added);
  658. CS101_ASDU_destroy(asdu);
  659. TEST_ASSERT_EQUAL_INT(124, ioa);
  660. }
  661. void
  662. test_SingleEventType(void)
  663. {
  664. tSingleEvent singleEvent = 0;
  665. EventState eventState = SingleEvent_getEventState(&singleEvent);
  666. TEST_ASSERT_EQUAL_INT(IEC60870_EVENTSTATE_INDETERMINATE_0, eventState);
  667. QualityDescriptorP qdp = SingleEvent_getQDP(&singleEvent);
  668. TEST_ASSERT_EQUAL_INT(0, qdp);
  669. }
  670. void
  671. test_EventOfProtectionEquipmentWithTime(void)
  672. {
  673. #ifndef _WIN32
  674. tSingleEvent singleEvent = 0;
  675. struct sCP16Time2a elapsedTime;
  676. struct sCP56Time2a timestamp;
  677. EventOfProtectionEquipmentWithCP56Time2a e = EventOfProtectionEquipmentWithCP56Time2a_create(NULL, 1, &singleEvent, &elapsedTime, &timestamp);
  678. uint8_t buffer[256];
  679. struct sBufferFrame bf;
  680. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  681. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  682. CS101_ASDU_addInformationObject(asdu, (InformationObject) e);
  683. CS101_ASDU_addInformationObject(asdu, (InformationObject) e);
  684. CS101_ASDU_encode(asdu, f);
  685. InformationObject_destroy((InformationObject) e);
  686. CS101_ASDU_destroy(asdu);
  687. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  688. InformationObject io = CS101_ASDU_getElement(asdu2, 1);
  689. TEST_ASSERT_NOT_NULL(io);
  690. EventOfProtectionEquipmentWithCP56Time2a e2 = (EventOfProtectionEquipmentWithCP56Time2a) io;
  691. SingleEvent se = EventOfProtectionEquipmentWithCP56Time2a_getEvent(e2);
  692. QualityDescriptorP qdp = SingleEvent_getQDP(se);
  693. InformationObject_destroy(io);
  694. CS101_ASDU_destroy(asdu2);
  695. TEST_ASSERT_EQUAL_INT(0, qdp);
  696. #endif
  697. }
  698. struct test_CS104SlaveConnectionIsRedundancyGroup_Info
  699. {
  700. bool running;
  701. CS104_Slave slave;
  702. };
  703. static void*
  704. test_CS104SlaveConnectionIsRedundancyGroup_enqueueThreadFunction(void* parameter)
  705. {
  706. struct test_CS104SlaveConnectionIsRedundancyGroup_Info* info = (struct test_CS104SlaveConnectionIsRedundancyGroup_Info*) parameter;
  707. CS101_AppLayerParameters alParams = CS104_Slave_getAppLayerParameters(info->slave);
  708. int16_t scaledValue = 0;
  709. while (info->running) {
  710. CS101_ASDU newAsdu = CS101_ASDU_create(alParams, false, CS101_COT_PERIODIC, 0, 1, false, false);
  711. InformationObject io = (InformationObject) MeasuredValueScaled_create(NULL, 110, scaledValue, IEC60870_QUALITY_GOOD);
  712. scaledValue++;
  713. CS101_ASDU_addInformationObject(newAsdu, io);
  714. InformationObject_destroy(io);
  715. CS104_Slave_enqueueASDU(info->slave, newAsdu);
  716. CS101_ASDU_destroy(newAsdu);
  717. Thread_sleep(10);
  718. }
  719. return NULL;
  720. }
  721. void
  722. test_CS104SlaveConnectionIsRedundancyGroup()
  723. {
  724. CS104_Slave slave = CS104_Slave_create(100, 100);
  725. CS104_Slave_setServerMode(slave, CS104_MODE_CONNECTION_IS_REDUNDANCY_GROUP);
  726. CS104_Slave_setLocalPort(slave, 20004);
  727. CS104_Slave_start(slave);
  728. struct test_CS104SlaveConnectionIsRedundancyGroup_Info info;
  729. info.running = true;
  730. info.slave = slave;
  731. Thread enqueueThread = Thread_create(test_CS104SlaveConnectionIsRedundancyGroup_enqueueThreadFunction, &info, false);
  732. Thread_start(enqueueThread);
  733. CS104_Connection con = CS104_Connection_create("127.0.0.1", 20004);
  734. int i;
  735. for (i = 0; i < 50; i++) {
  736. bool result = CS104_Connection_connect(con);
  737. TEST_ASSERT_TRUE(result);
  738. CS104_Connection_sendStartDT(con);
  739. Thread_sleep(10);
  740. CS104_Connection_close(con);
  741. }
  742. info.running = false;
  743. Thread_destroy(enqueueThread);
  744. CS104_Connection_destroy(con);
  745. CS104_Slave_destroy(slave);
  746. }
  747. void
  748. test_CS104SlaveSingleRedundancyGroup()
  749. {
  750. CS104_Slave slave = CS104_Slave_create(100, 100);
  751. CS104_Slave_setServerMode(slave, CS104_MODE_SINGLE_REDUNDANCY_GROUP);
  752. CS104_Slave_setLocalPort(slave, 20004);
  753. CS104_Slave_start(slave);
  754. struct test_CS104SlaveConnectionIsRedundancyGroup_Info info;
  755. info.running = true;
  756. info.slave = slave;
  757. Thread enqueueThread = Thread_create(test_CS104SlaveConnectionIsRedundancyGroup_enqueueThreadFunction, &info, false);
  758. Thread_start(enqueueThread);
  759. CS104_Connection con = CS104_Connection_create("127.0.0.1", 20004);
  760. int i;
  761. for (i = 0; i < 50; i++) {
  762. bool result = CS104_Connection_connect(con);
  763. TEST_ASSERT_TRUE(result);
  764. CS104_Connection_sendStartDT(con);
  765. CS104_Connection_close(con);
  766. Thread_sleep(10);
  767. }
  768. info.running = false;
  769. Thread_destroy(enqueueThread);
  770. CS104_Connection_destroy(con);
  771. CS104_Slave_destroy(slave);
  772. }
  773. static void
  774. test_CS104SlaveSingleRedundancyGroupMultipleConnectionsEventHandler(void* parameter, IMasterConnection connection, CS104_PeerConnectionEvent event)
  775. {
  776. char ipAddrBuf[100];
  777. ipAddrBuf[0] = 0;
  778. IMasterConnection_getPeerAddress(connection, ipAddrBuf, 100);
  779. }
  780. void
  781. test_CS104SlaveSingleRedundancyGroupMultipleConnections()
  782. {
  783. CS104_Slave slave = CS104_Slave_create(100, 100);
  784. CS104_Slave_setServerMode(slave, CS104_MODE_SINGLE_REDUNDANCY_GROUP);
  785. CS104_Slave_setLocalPort(slave, 20004);
  786. CS104_Slave_start(slave);
  787. CS104_Slave_setMaxOpenConnections(slave, 20);
  788. CS104_Slave_setConnectionEventHandler(slave, test_CS104SlaveSingleRedundancyGroupMultipleConnectionsEventHandler, NULL);
  789. struct test_CS104SlaveConnectionIsRedundancyGroup_Info info;
  790. info.running = true;
  791. info.slave = slave;
  792. CS104_Connection cons[3];
  793. int conState[3]; /* 0 = idle, 1 = connected, 2 = START_DT sent */
  794. cons[0] = CS104_Connection_create("127.0.0.1", 20004);
  795. cons[1] = CS104_Connection_create("127.0.0.1", 20004);
  796. cons[2] = CS104_Connection_create("127.0.0.1", 20004);
  797. conState[0] = 0;
  798. conState[1] = 0;
  799. conState[2] = 0;
  800. Thread enqueueThread = Thread_create(test_CS104SlaveConnectionIsRedundancyGroup_enqueueThreadFunction, &info, false);
  801. Thread_start(enqueueThread);
  802. int i;
  803. for (i = 0; i < 200; i++)
  804. {
  805. // printf("round %i\n", i);
  806. int con = rand() % 3;
  807. if (conState[con] == 0) {
  808. bool result = CS104_Connection_connect(cons[con]);
  809. TEST_ASSERT_TRUE(result);
  810. conState[con] = 1;
  811. }
  812. else if (conState[con] == 1) {
  813. CS104_Connection_sendStartDT(cons[con]);
  814. conState[con] = 2;
  815. }
  816. else if (conState[con] == 2) {
  817. CS104_Connection_close(cons[con]);
  818. conState[con] = 0;
  819. }
  820. Thread_sleep(50);
  821. }
  822. CS104_Connection_destroy(cons[0]);
  823. CS104_Connection_destroy(cons[1]);
  824. CS104_Connection_destroy(cons[2]);
  825. info.running = false;
  826. Thread_destroy(enqueueThread);
  827. CS104_Slave_destroy(slave);
  828. }
  829. struct stest_CS104SlaveEventQueue1 {
  830. int asduHandlerCalled;
  831. int spontCount;
  832. int16_t lastScaledValue;
  833. };
  834. static bool
  835. test_CS104SlaveEventQueue1_asduReceivedHandler (void* parameter, int address, CS101_ASDU asdu)
  836. {
  837. struct stest_CS104SlaveEventQueue1* info = (struct stest_CS104SlaveEventQueue1*) parameter;
  838. info->asduHandlerCalled++;
  839. if (CS101_ASDU_getCOT(asdu) == CS101_COT_SPONTANEOUS)
  840. {
  841. info->spontCount++;
  842. if (CS101_ASDU_getTypeID(asdu) == M_ME_NB_1)
  843. {
  844. static uint8_t ioBuf[250];
  845. MeasuredValueScaled mv = (MeasuredValueScaled) CS101_ASDU_getElementEx(asdu, (InformationObject) ioBuf, 0);
  846. info->lastScaledValue = MeasuredValueScaled_getValue(mv);
  847. }
  848. }
  849. return true;
  850. }
  851. struct sTestMessageQueueEntryInfo {
  852. uint64_t entryTimestamp;
  853. unsigned int entryState : 2;
  854. unsigned int size : 8;
  855. };
  856. void
  857. test_CS104SlaveEventQueue1()
  858. {
  859. CS104_Slave slave = CS104_Slave_create(10, 10);
  860. CS104_Slave_setServerMode(slave, CS104_MODE_SINGLE_REDUNDANCY_GROUP);
  861. CS104_Slave_setLocalPort(slave, 20004);
  862. CS104_Slave_start(slave);
  863. CS101_AppLayerParameters alParams = CS104_Slave_getAppLayerParameters(slave);
  864. struct stest_CS104SlaveEventQueue1 info;
  865. info.asduHandlerCalled = 0;
  866. info.spontCount = 0;
  867. info.lastScaledValue = 0;
  868. int16_t scaledValue = 0;
  869. for (int i = 0; i < 15; i++) {
  870. CS101_ASDU newAsdu = CS101_ASDU_create(alParams, false, CS101_COT_SPONTANEOUS, 0, 1, false, false);
  871. InformationObject io = (InformationObject) MeasuredValueScaled_create(NULL, 110, scaledValue, IEC60870_QUALITY_GOOD);
  872. scaledValue++;
  873. CS101_ASDU_addInformationObject(newAsdu, io);
  874. InformationObject_destroy(io);
  875. CS104_Slave_enqueueASDU(slave, newAsdu);
  876. CS101_ASDU_destroy(newAsdu);
  877. }
  878. CS104_Connection con = CS104_Connection_create("127.0.0.1", 20004);
  879. CS104_Connection_setASDUReceivedHandler(con, test_CS104SlaveEventQueue1_asduReceivedHandler, &info);
  880. bool result = CS104_Connection_connect(con);
  881. TEST_ASSERT_TRUE(result);
  882. CS104_Connection_sendStartDT(con);
  883. Thread_sleep(500);
  884. CS104_Connection_sendStopDT(con);
  885. CS104_Connection_close(con);
  886. TEST_ASSERT_EQUAL_INT(14, info.lastScaledValue);
  887. info.asduHandlerCalled = 0;
  888. info.spontCount = 0;
  889. result = CS104_Connection_connect(con);
  890. TEST_ASSERT_TRUE(result);
  891. CS104_Connection_sendStartDT(con);
  892. for (int i = 0; i < 15; i++) {
  893. CS101_ASDU newAsdu = CS101_ASDU_create(alParams, false, CS101_COT_SPONTANEOUS, 0, 1, false, false);
  894. InformationObject io = (InformationObject) MeasuredValueScaled_create(NULL, 110, scaledValue, IEC60870_QUALITY_GOOD);
  895. scaledValue++;
  896. CS101_ASDU_addInformationObject(newAsdu, io);
  897. InformationObject_destroy(io);
  898. CS104_Slave_enqueueASDU(slave, newAsdu);
  899. CS101_ASDU_destroy(newAsdu);
  900. Thread_sleep(10);
  901. }
  902. Thread_sleep(500);
  903. CS104_Connection_close(con);
  904. TEST_ASSERT_EQUAL_INT(15, info.asduHandlerCalled);
  905. TEST_ASSERT_EQUAL_INT(15, info.spontCount);
  906. TEST_ASSERT_EQUAL_INT(29, info.lastScaledValue);
  907. CS104_Connection_destroy(con);
  908. CS104_Slave_destroy(slave);
  909. }
  910. void
  911. test_CS104SlaveEventQueueOverflow()
  912. {
  913. CS104_Slave slave = CS104_Slave_create(10, 10);
  914. CS104_Slave_setServerMode(slave, CS104_MODE_SINGLE_REDUNDANCY_GROUP);
  915. CS104_Slave_setLocalPort(slave, 20004);
  916. CS104_Slave_start(slave);
  917. CS101_AppLayerParameters alParams = CS104_Slave_getAppLayerParameters(slave);
  918. struct stest_CS104SlaveEventQueue1 info;
  919. info.asduHandlerCalled = 0;
  920. info.spontCount = 0;
  921. info.lastScaledValue = 0;
  922. int16_t scaledValue = 0;
  923. for (int i = 0; i < 300; i++) {
  924. CS101_ASDU newAsdu = CS101_ASDU_create(alParams, false, CS101_COT_SPONTANEOUS, 0, 1, false, false);
  925. InformationObject io = (InformationObject) MeasuredValueScaled_create(NULL, 110, scaledValue, IEC60870_QUALITY_GOOD);
  926. scaledValue++;
  927. CS101_ASDU_addInformationObject(newAsdu, io);
  928. InformationObject_destroy(io);
  929. CS104_Slave_enqueueASDU(slave, newAsdu);
  930. CS101_ASDU_destroy(newAsdu);
  931. }
  932. CS104_Connection con = CS104_Connection_create("127.0.0.1", 20004);
  933. CS104_Connection_setASDUReceivedHandler(con, test_CS104SlaveEventQueue1_asduReceivedHandler, &info);
  934. bool result = CS104_Connection_connect(con);
  935. TEST_ASSERT_TRUE(result);
  936. CS104_Connection_sendStartDT(con);
  937. Thread_sleep(1500);
  938. CS104_Connection_close(con);
  939. int asduSize = 12;
  940. int entrySize = sizeof(struct sTestMessageQueueEntryInfo) + asduSize;
  941. int msgQueueCapacity = ((sizeof(struct sTestMessageQueueEntryInfo) + 256) * 10) / entrySize;
  942. TEST_ASSERT_EQUAL_INT(299, info.lastScaledValue);
  943. TEST_ASSERT_EQUAL_INT(msgQueueCapacity, info.asduHandlerCalled);
  944. result = CS104_Connection_connect(con);
  945. TEST_ASSERT_TRUE(result);
  946. CS104_Connection_sendStartDT(con);
  947. for (int i = 0; i < 150; i++) {
  948. CS101_ASDU newAsdu = CS101_ASDU_create(alParams, false, CS101_COT_SPONTANEOUS, 0, 1, false, false);
  949. InformationObject io = (InformationObject) MeasuredValueScaled_create(NULL, 110, scaledValue, IEC60870_QUALITY_GOOD);
  950. scaledValue++;
  951. CS101_ASDU_addInformationObject(newAsdu, io);
  952. InformationObject_destroy(io);
  953. CS104_Slave_enqueueASDU(slave, newAsdu);
  954. CS101_ASDU_destroy(newAsdu);
  955. Thread_sleep(10);
  956. }
  957. Thread_sleep(500);
  958. CS104_Connection_close(con);
  959. TEST_ASSERT_EQUAL_INT(msgQueueCapacity + 150, info.asduHandlerCalled);
  960. TEST_ASSERT_EQUAL_INT(msgQueueCapacity + 150, info.spontCount);
  961. TEST_ASSERT_EQUAL_INT(449, info.lastScaledValue);
  962. CS104_Connection_destroy(con);
  963. CS104_Slave_destroy(slave);
  964. }
  965. void
  966. test_CS104SlaveEventQueueOverflow2()
  967. {
  968. CS104_Slave slave = CS104_Slave_create(10, 10);
  969. CS104_Slave_setServerMode(slave, CS104_MODE_SINGLE_REDUNDANCY_GROUP);
  970. CS104_Slave_setLocalPort(slave, 20004);
  971. CS104_Slave_start(slave);
  972. CS101_AppLayerParameters alParams = CS104_Slave_getAppLayerParameters(slave);
  973. struct stest_CS104SlaveEventQueue1 info;
  974. info.asduHandlerCalled = 0;
  975. info.spontCount = 0;
  976. info.lastScaledValue = 0;
  977. int16_t scaledValue = 0;
  978. for (int i = 0; i < 300; i++) {
  979. CS101_ASDU newAsdu = CS101_ASDU_create(alParams, false, CS101_COT_SPONTANEOUS, 0, 1, false, false);
  980. InformationObject io = (InformationObject) MeasuredValueScaled_create(NULL, 110, scaledValue, IEC60870_QUALITY_GOOD);
  981. scaledValue++;
  982. CS101_ASDU_addInformationObject(newAsdu, io);
  983. InformationObject_destroy(io);
  984. CS104_Slave_enqueueASDU(slave, newAsdu);
  985. CS101_ASDU_destroy(newAsdu);
  986. }
  987. CS104_Connection con = CS104_Connection_create("127.0.0.1", 20004);
  988. CS104_Connection_setASDUReceivedHandler(con, test_CS104SlaveEventQueue1_asduReceivedHandler, &info);
  989. bool result = CS104_Connection_connect(con);
  990. TEST_ASSERT_TRUE(result);
  991. CS104_Connection_sendStartDT(con);
  992. Thread_sleep(500);
  993. CS104_Connection_close(con);
  994. int asduSize = 12;
  995. int entrySize = sizeof(struct sTestMessageQueueEntryInfo) + asduSize;
  996. int msgQueueCapacity = ((sizeof(struct sTestMessageQueueEntryInfo) + 256) * 10) / entrySize;
  997. TEST_ASSERT_EQUAL_INT(299, info.lastScaledValue);
  998. TEST_ASSERT_EQUAL_INT(msgQueueCapacity, info.asduHandlerCalled);
  999. result = CS104_Connection_connect(con);
  1000. TEST_ASSERT_TRUE(result);
  1001. CS104_Connection_sendStartDT(con);
  1002. int typeNo = 0;
  1003. for (int i = 0; i < 20000; i++) {
  1004. CS101_ASDU newAsdu = CS101_ASDU_create(alParams, false, CS101_COT_SPONTANEOUS, 0, 1, false, false);
  1005. InformationObject io;
  1006. if (typeNo == 0) {
  1007. io = (InformationObject) MeasuredValueScaled_create(NULL, 110, scaledValue, IEC60870_QUALITY_GOOD);
  1008. CS101_ASDU_addInformationObject(newAsdu, io);
  1009. }
  1010. else if (typeNo == 1) {
  1011. struct sCP56Time2a cp56;
  1012. CP56Time2a_createFromMsTimestamp(&cp56, Hal_getTimeInMs());
  1013. io = (InformationObject) MeasuredValueScaledWithCP56Time2a_create(NULL, 111, scaledValue, IEC60870_QUALITY_GOOD, &cp56);
  1014. CS101_ASDU_addInformationObject(newAsdu, io);
  1015. }
  1016. else if (typeNo == 2) {
  1017. io = (InformationObject) SinglePointInformation_create(NULL, 112, true, IEC60870_QUALITY_GOOD);
  1018. CS101_ASDU_addInformationObject(newAsdu, io);
  1019. }
  1020. else if (typeNo == 3) {
  1021. io = (InformationObject) SinglePointInformation_create(NULL, 112, true, IEC60870_QUALITY_GOOD);
  1022. int j = 1;
  1023. while (CS101_ASDU_addInformationObject(newAsdu, io)) {
  1024. io = (InformationObject) SinglePointInformation_create((SinglePointInformation) io, 112 + j, true, IEC60870_QUALITY_GOOD);
  1025. j++;
  1026. }
  1027. }
  1028. typeNo++;
  1029. if (typeNo == 4)
  1030. typeNo = 0;
  1031. scaledValue++;
  1032. InformationObject_destroy(io);
  1033. CS104_Slave_enqueueASDU(slave, newAsdu);
  1034. CS101_ASDU_destroy(newAsdu);
  1035. //Thread_sleep(10);
  1036. }
  1037. Thread_sleep(500);
  1038. CS104_Connection_close(con);
  1039. CS104_Connection_destroy(con);
  1040. CS104_Slave_destroy(slave);
  1041. }
  1042. void
  1043. test_CS104SlaveEventQueueCheckCapacity()
  1044. {
  1045. CS104_Slave slave = CS104_Slave_create(2, 2);
  1046. CS104_Slave_setServerMode(slave, CS104_MODE_SINGLE_REDUNDANCY_GROUP);
  1047. CS104_Slave_setLocalPort(slave, 20004);
  1048. CS104_Slave_start(slave);
  1049. CS101_AppLayerParameters alParams = CS104_Slave_getAppLayerParameters(slave);
  1050. struct stest_CS104SlaveEventQueue1 info;
  1051. info.asduHandlerCalled = 0;
  1052. info.spontCount = 0;
  1053. info.lastScaledValue = 0;
  1054. int16_t scaledValue = 0;
  1055. /* Fill queue with small messages */
  1056. int asduSize = 6 + 3 + 1;
  1057. int entrySize = sizeof(struct sTestMessageQueueEntryInfo) + asduSize;
  1058. int msgQueueCapacity = ((sizeof(struct sTestMessageQueueEntryInfo) + 256) * 2) / entrySize;
  1059. for (int i = 0; i < 299; i++) {
  1060. CS101_ASDU newAsdu = CS101_ASDU_create(alParams, false, CS101_COT_SPONTANEOUS, 0, 1, false, false);
  1061. InformationObject io = (InformationObject) SinglePointInformation_create(NULL, 101, true, IEC60870_QUALITY_GOOD);
  1062. CS101_ASDU_addInformationObject(newAsdu, io);
  1063. InformationObject_destroy(io);
  1064. CS104_Slave_enqueueASDU(slave, newAsdu);
  1065. if (i >= msgQueueCapacity)
  1066. TEST_ASSERT_EQUAL_INT(msgQueueCapacity, CS104_Slave_getNumberOfQueueEntries(slave, NULL));
  1067. else
  1068. TEST_ASSERT_EQUAL_INT(i + 1, CS104_Slave_getNumberOfQueueEntries(slave, NULL));
  1069. CS101_ASDU_destroy(newAsdu);
  1070. }
  1071. CS104_Connection con = CS104_Connection_create("127.0.0.1", 20004);
  1072. CS104_Connection_setASDUReceivedHandler(con, test_CS104SlaveEventQueue1_asduReceivedHandler, &info);
  1073. bool result = CS104_Connection_connect(con);
  1074. TEST_ASSERT_TRUE(result);
  1075. CS104_Connection_sendStartDT(con);
  1076. Thread_sleep(1000);
  1077. CS104_Connection_close(con);
  1078. TEST_ASSERT_EQUAL_INT(msgQueueCapacity, info.asduHandlerCalled);
  1079. /* outstanding I messages that are not confirmed */
  1080. TEST_ASSERT_EQUAL_INT(0, CS104_Slave_getNumberOfQueueEntries(slave, NULL));
  1081. CS104_Connection_destroy(con);
  1082. CS104_Slave_destroy(slave);
  1083. }
  1084. void
  1085. test_CS104SlaveEventQueueOverflow3()
  1086. {
  1087. /**
  1088. * Trigger code to remove multiple messages at once from the buffer
  1089. */
  1090. CS104_Slave slave = CS104_Slave_create(2, 2);
  1091. CS104_Slave_setServerMode(slave, CS104_MODE_SINGLE_REDUNDANCY_GROUP);
  1092. CS104_Slave_setLocalPort(slave, 20004);
  1093. CS104_Slave_start(slave);
  1094. CS101_AppLayerParameters alParams = CS104_Slave_getAppLayerParameters(slave);
  1095. struct stest_CS104SlaveEventQueue1 info;
  1096. info.asduHandlerCalled = 0;
  1097. info.spontCount = 0;
  1098. info.lastScaledValue = 0;
  1099. int16_t scaledValue = 0;
  1100. /* Fill queue with small messages */
  1101. int asduSize = 6 + 3 + 1;
  1102. int entrySize = sizeof(struct sTestMessageQueueEntryInfo) + asduSize;
  1103. int msgQueueCapacity = ((sizeof(struct sTestMessageQueueEntryInfo) + 256) * 2) / entrySize;
  1104. for (int i = 0; i < 35; i++) {
  1105. CS101_ASDU newAsdu = CS101_ASDU_create(alParams, false, CS101_COT_SPONTANEOUS, 0, 1, false, false);
  1106. InformationObject io = (InformationObject) SinglePointInformation_create(NULL, 101, true, IEC60870_QUALITY_GOOD);
  1107. CS101_ASDU_addInformationObject(newAsdu, io);
  1108. InformationObject_destroy(io);
  1109. CS104_Slave_enqueueASDU(slave, newAsdu);
  1110. CS101_ASDU_destroy(newAsdu);
  1111. }
  1112. CS104_Connection con = CS104_Connection_create("127.0.0.1", 20004);
  1113. CS104_Connection_setASDUReceivedHandler(con, test_CS104SlaveEventQueue1_asduReceivedHandler, &info);
  1114. int count1 = CS104_Slave_getNumberOfQueueEntries(slave, NULL);
  1115. /* add a single large messages */
  1116. CS101_ASDU newAsdu = CS101_ASDU_create(alParams, false, CS101_COT_PERIODIC, 0, 1, false, false);
  1117. for (int i = 0; i < 50; i++) {
  1118. SinglePointInformation spi = SinglePointInformation_create(NULL, 110, false, IEC60870_QUALITY_GOOD);;
  1119. CS101_ASDU_addInformationObject(newAsdu, (InformationObject) spi);
  1120. InformationObject_destroy((InformationObject) spi);
  1121. }
  1122. CS104_Slave_enqueueASDU(slave, newAsdu);
  1123. CS101_ASDU_destroy(newAsdu);
  1124. int count2 = CS104_Slave_getNumberOfQueueEntries(slave, NULL);
  1125. /* check that multiple buffer entries were removed */
  1126. TEST_ASSERT_TRUE(count2 + 1 < count1);
  1127. info.asduHandlerCalled = 0;
  1128. bool result = CS104_Connection_connect(con);
  1129. TEST_ASSERT_TRUE(result);
  1130. CS104_Connection_sendStartDT(con);
  1131. Thread_sleep(500);
  1132. CS104_Connection_close(con);
  1133. TEST_ASSERT_EQUAL_INT(count2, info.asduHandlerCalled);
  1134. CS104_Connection_destroy(con);
  1135. CS104_Slave_destroy(slave);
  1136. }
  1137. void
  1138. test_IpAddressHandling(void)
  1139. {
  1140. struct sCS104_IPAddress ipAddr1;
  1141. CS104_IPAddress_setFromString(&ipAddr1, "192.168.34.25");
  1142. TEST_ASSERT_EQUAL_INT(IP_ADDRESS_TYPE_IPV4, ipAddr1.type);
  1143. TEST_ASSERT_EQUAL_UINT8(192, ipAddr1.address[0]);
  1144. TEST_ASSERT_EQUAL_UINT8(168, ipAddr1.address[1]);
  1145. TEST_ASSERT_EQUAL_UINT8(34, ipAddr1.address[2]);
  1146. TEST_ASSERT_EQUAL_UINT8(25, ipAddr1.address[3]);
  1147. CS104_IPAddress_setFromString(&ipAddr1, "1:22:333:aaaa:b:c:d:e");
  1148. TEST_ASSERT_EQUAL_INT(IP_ADDRESS_TYPE_IPV6, ipAddr1.type);
  1149. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[0]);
  1150. TEST_ASSERT_EQUAL_UINT8(0x01, ipAddr1.address[1]);
  1151. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[2]);
  1152. TEST_ASSERT_EQUAL_UINT8(0x22, ipAddr1.address[3]);
  1153. TEST_ASSERT_EQUAL_UINT8(0x03, ipAddr1.address[4]);
  1154. TEST_ASSERT_EQUAL_UINT8(0x33, ipAddr1.address[5]);
  1155. TEST_ASSERT_EQUAL_UINT8(0xaa, ipAddr1.address[6]);
  1156. TEST_ASSERT_EQUAL_UINT8(0xaa, ipAddr1.address[7]);
  1157. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[8]);
  1158. TEST_ASSERT_EQUAL_UINT8(0x0b, ipAddr1.address[9]);
  1159. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[10]);
  1160. TEST_ASSERT_EQUAL_UINT8(0x0c, ipAddr1.address[11]);
  1161. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[12]);
  1162. TEST_ASSERT_EQUAL_UINT8(0x0d, ipAddr1.address[13]);
  1163. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[14]);
  1164. TEST_ASSERT_EQUAL_UINT8(0x0e, ipAddr1.address[15]);
  1165. CS104_IPAddress_setFromString(&ipAddr1, "::2001:db8");
  1166. TEST_ASSERT_EQUAL_INT(IP_ADDRESS_TYPE_IPV6, ipAddr1.type);
  1167. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[0]);
  1168. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[1]);
  1169. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[2]);
  1170. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[3]);
  1171. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[4]);
  1172. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[5]);
  1173. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[6]);
  1174. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[7]);
  1175. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[8]);
  1176. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[9]);
  1177. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[10]);
  1178. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[11]);
  1179. TEST_ASSERT_EQUAL_UINT8(0x20, ipAddr1.address[12]);
  1180. TEST_ASSERT_EQUAL_UINT8(0x01, ipAddr1.address[13]);
  1181. TEST_ASSERT_EQUAL_UINT8(0x0d, ipAddr1.address[14]);
  1182. TEST_ASSERT_EQUAL_UINT8(0xb8, ipAddr1.address[15]);
  1183. CS104_IPAddress_setFromString(&ipAddr1, "fe80::70d2:6cba:a994:2ced");
  1184. TEST_ASSERT_EQUAL_INT(IP_ADDRESS_TYPE_IPV6, ipAddr1.type);
  1185. TEST_ASSERT_EQUAL_UINT8(0xfe, ipAddr1.address[0]);
  1186. TEST_ASSERT_EQUAL_UINT8(0x80, ipAddr1.address[1]);
  1187. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[2]);
  1188. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[3]);
  1189. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[4]);
  1190. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[5]);
  1191. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[6]);
  1192. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[7]);
  1193. TEST_ASSERT_EQUAL_UINT8(0x70, ipAddr1.address[8]);
  1194. TEST_ASSERT_EQUAL_UINT8(0xd2, ipAddr1.address[9]);
  1195. TEST_ASSERT_EQUAL_UINT8(0x6c, ipAddr1.address[10]);
  1196. TEST_ASSERT_EQUAL_UINT8(0xba, ipAddr1.address[11]);
  1197. TEST_ASSERT_EQUAL_UINT8(0xa9, ipAddr1.address[12]);
  1198. TEST_ASSERT_EQUAL_UINT8(0x94, ipAddr1.address[13]);
  1199. TEST_ASSERT_EQUAL_UINT8(0x2c, ipAddr1.address[14]);
  1200. TEST_ASSERT_EQUAL_UINT8(0xed, ipAddr1.address[15]);
  1201. CS104_IPAddress_setFromString(&ipAddr1, "2001:db8:1::ab9:C0A8:102");
  1202. TEST_ASSERT_EQUAL_INT(IP_ADDRESS_TYPE_IPV6, ipAddr1.type);
  1203. TEST_ASSERT_EQUAL_UINT8(0x20, ipAddr1.address[0]);
  1204. TEST_ASSERT_EQUAL_UINT8(0x01, ipAddr1.address[1]);
  1205. TEST_ASSERT_EQUAL_UINT8(0x0d, ipAddr1.address[2]);
  1206. TEST_ASSERT_EQUAL_UINT8(0xb8, ipAddr1.address[3]);
  1207. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[4]);
  1208. TEST_ASSERT_EQUAL_UINT8(0x01, ipAddr1.address[5]);
  1209. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[6]);
  1210. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[7]);
  1211. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[8]);
  1212. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[9]);
  1213. TEST_ASSERT_EQUAL_UINT8(0x0a, ipAddr1.address[10]);
  1214. TEST_ASSERT_EQUAL_UINT8(0xb9, ipAddr1.address[11]);
  1215. TEST_ASSERT_EQUAL_UINT8(0xc0, ipAddr1.address[12]);
  1216. TEST_ASSERT_EQUAL_UINT8(0xa8, ipAddr1.address[13]);
  1217. TEST_ASSERT_EQUAL_UINT8(0x01, ipAddr1.address[14]);
  1218. TEST_ASSERT_EQUAL_UINT8(0x02, ipAddr1.address[15]);
  1219. CS104_IPAddress_setFromString(&ipAddr1, "::1");
  1220. TEST_ASSERT_EQUAL_INT(IP_ADDRESS_TYPE_IPV6, ipAddr1.type);
  1221. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[0]);
  1222. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[1]);
  1223. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[2]);
  1224. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[3]);
  1225. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[4]);
  1226. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[5]);
  1227. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[6]);
  1228. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[7]);
  1229. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[8]);
  1230. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[9]);
  1231. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[10]);
  1232. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[11]);
  1233. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[12]);
  1234. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[13]);
  1235. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[14]);
  1236. TEST_ASSERT_EQUAL_UINT8(0x01, ipAddr1.address[15]);
  1237. CS104_IPAddress_setFromString(&ipAddr1, "::1");
  1238. TEST_ASSERT_EQUAL_INT(IP_ADDRESS_TYPE_IPV6, ipAddr1.type);
  1239. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[0]);
  1240. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[1]);
  1241. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[2]);
  1242. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[3]);
  1243. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[4]);
  1244. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[5]);
  1245. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[6]);
  1246. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[7]);
  1247. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[8]);
  1248. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[9]);
  1249. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[10]);
  1250. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[11]);
  1251. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[12]);
  1252. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[13]);
  1253. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[14]);
  1254. TEST_ASSERT_EQUAL_UINT8(0x01, ipAddr1.address[15]);
  1255. CS104_IPAddress_setFromString(&ipAddr1, "::");
  1256. TEST_ASSERT_EQUAL_INT(IP_ADDRESS_TYPE_IPV6, ipAddr1.type);
  1257. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[0]);
  1258. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[1]);
  1259. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[2]);
  1260. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[3]);
  1261. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[4]);
  1262. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[5]);
  1263. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[6]);
  1264. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[7]);
  1265. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[8]);
  1266. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[9]);
  1267. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[10]);
  1268. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[11]);
  1269. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[12]);
  1270. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[13]);
  1271. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[14]);
  1272. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[15]);
  1273. CS104_IPAddress_setFromString(&ipAddr1, "fe80:2001::");
  1274. TEST_ASSERT_EQUAL_INT(IP_ADDRESS_TYPE_IPV6, ipAddr1.type);
  1275. TEST_ASSERT_EQUAL_UINT8(0xfe, ipAddr1.address[0]);
  1276. TEST_ASSERT_EQUAL_UINT8(0x80, ipAddr1.address[1]);
  1277. TEST_ASSERT_EQUAL_UINT8(0x20, ipAddr1.address[2]);
  1278. TEST_ASSERT_EQUAL_UINT8(0x01, ipAddr1.address[3]);
  1279. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[4]);
  1280. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[5]);
  1281. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[6]);
  1282. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[7]);
  1283. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[8]);
  1284. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[9]);
  1285. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[10]);
  1286. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[11]);
  1287. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[12]);
  1288. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[13]);
  1289. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[14]);
  1290. TEST_ASSERT_EQUAL_UINT8(0x00, ipAddr1.address[15]);
  1291. }
  1292. void
  1293. test_DoublePointInformation(void)
  1294. {
  1295. DoublePointInformation dpi1;
  1296. DoublePointInformation dpi2;
  1297. DoublePointInformation dpi3;
  1298. dpi1 = DoublePointInformation_create(NULL, 101, IEC60870_DOUBLE_POINT_OFF, IEC60870_QUALITY_INVALID);
  1299. dpi2 = DoublePointInformation_create(NULL, 102, IEC60870_DOUBLE_POINT_ON, IEC60870_QUALITY_BLOCKED);
  1300. dpi3 = DoublePointInformation_create(NULL, 103, IEC60870_DOUBLE_POINT_INDETERMINATE, IEC60870_QUALITY_GOOD);
  1301. TEST_ASSERT_EQUAL_UINT8(IEC60870_DOUBLE_POINT_OFF, DoublePointInformation_getValue(dpi1));
  1302. TEST_ASSERT_EQUAL_UINT8(IEC60870_DOUBLE_POINT_ON, DoublePointInformation_getValue(dpi2));
  1303. TEST_ASSERT_EQUAL_UINT8(IEC60870_DOUBLE_POINT_INDETERMINATE, DoublePointInformation_getValue(dpi3));
  1304. uint8_t buffer[256];
  1305. struct sBufferFrame bf;
  1306. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  1307. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  1308. CS101_ASDU_addInformationObject(asdu, (InformationObject) dpi1);
  1309. CS101_ASDU_addInformationObject(asdu, (InformationObject) dpi2);
  1310. CS101_ASDU_addInformationObject(asdu, (InformationObject) dpi3);
  1311. InformationObject_destroy((InformationObject) dpi1);
  1312. InformationObject_destroy((InformationObject) dpi2);
  1313. InformationObject_destroy((InformationObject) dpi3);
  1314. CS101_ASDU_encode(asdu, f);
  1315. TEST_ASSERT_EQUAL_INT(18, Frame_getMsgSize(f));
  1316. CS101_ASDU_destroy(asdu);
  1317. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  1318. TEST_ASSERT_EQUAL_INT(3, CS101_ASDU_getNumberOfElements(asdu2));
  1319. DoublePointInformation dpi1_dec = (DoublePointInformation) CS101_ASDU_getElement(asdu2, 0);
  1320. DoublePointInformation dpi2_dec = (DoublePointInformation) CS101_ASDU_getElement(asdu2, 1);
  1321. DoublePointInformation dpi3_dec = (DoublePointInformation) CS101_ASDU_getElement(asdu2, 2);
  1322. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )dpi1_dec));
  1323. TEST_ASSERT_EQUAL_INT(102, InformationObject_getObjectAddress((InformationObject )dpi2_dec));
  1324. TEST_ASSERT_EQUAL_INT(103, InformationObject_getObjectAddress((InformationObject )dpi3_dec));
  1325. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, DoublePointInformation_getQuality(dpi1_dec));
  1326. TEST_ASSERT_EQUAL_UINT8(IEC60870_DOUBLE_POINT_OFF, DoublePointInformation_getValue(dpi1_dec));
  1327. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, DoublePointInformation_getQuality(dpi2_dec));
  1328. TEST_ASSERT_EQUAL_UINT8(IEC60870_DOUBLE_POINT_ON, DoublePointInformation_getValue(dpi2_dec));
  1329. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, DoublePointInformation_getQuality(dpi3_dec));
  1330. TEST_ASSERT_EQUAL_UINT8(IEC60870_DOUBLE_POINT_INDETERMINATE, DoublePointInformation_getValue(dpi3_dec));
  1331. InformationObject_destroy((InformationObject) dpi1_dec);
  1332. InformationObject_destroy((InformationObject) dpi2_dec);
  1333. InformationObject_destroy((InformationObject) dpi3_dec);
  1334. CS101_ASDU_destroy(asdu2);
  1335. }
  1336. void
  1337. test_SinglePointInformation(void)
  1338. {
  1339. SinglePointInformation spi1;
  1340. SinglePointInformation spi2;
  1341. SinglePointInformation spi3;
  1342. SinglePointInformation spi4;
  1343. spi1 = SinglePointInformation_create(NULL, 101, true, IEC60870_QUALITY_INVALID);
  1344. spi2 = SinglePointInformation_create(NULL, 102, false, IEC60870_QUALITY_BLOCKED);
  1345. spi3 = SinglePointInformation_create(NULL, 103, true, IEC60870_QUALITY_GOOD);
  1346. /* invalid quality bit (overflow) is expected to be ignored */
  1347. spi4 = SinglePointInformation_create(NULL, 104, false, IEC60870_QUALITY_OVERFLOW);
  1348. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, SinglePointInformation_getQuality(spi1));
  1349. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, SinglePointInformation_getQuality(spi2));
  1350. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, SinglePointInformation_getQuality(spi3));
  1351. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, SinglePointInformation_getQuality(spi4));
  1352. TEST_ASSERT_TRUE(SinglePointInformation_getValue(spi1));
  1353. uint8_t buffer[256];
  1354. struct sBufferFrame bf;
  1355. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  1356. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  1357. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi1);
  1358. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi2);
  1359. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi3);
  1360. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi4);
  1361. SinglePointInformation_destroy(spi1);
  1362. SinglePointInformation_destroy(spi2);
  1363. SinglePointInformation_destroy(spi3);
  1364. SinglePointInformation_destroy(spi4);
  1365. CS101_ASDU_encode(asdu, f);
  1366. TEST_ASSERT_EQUAL_INT(22, Frame_getMsgSize(f));
  1367. CS101_ASDU_destroy(asdu);
  1368. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  1369. TEST_ASSERT_EQUAL_INT(4, CS101_ASDU_getNumberOfElements(asdu2));
  1370. SinglePointInformation spi1_dec = (SinglePointInformation) CS101_ASDU_getElement(asdu2, 0);
  1371. SinglePointInformation spi2_dec = (SinglePointInformation) CS101_ASDU_getElement(asdu2, 1);
  1372. SinglePointInformation spi3_dec = (SinglePointInformation) CS101_ASDU_getElement(asdu2, 2);
  1373. SinglePointInformation spi4_dec = (SinglePointInformation) CS101_ASDU_getElement(asdu2, 3);
  1374. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject)spi1_dec));
  1375. TEST_ASSERT_EQUAL_INT(102, InformationObject_getObjectAddress((InformationObject)spi2_dec));
  1376. TEST_ASSERT_EQUAL_INT(103, InformationObject_getObjectAddress((InformationObject)spi3_dec));
  1377. TEST_ASSERT_EQUAL_INT(104, InformationObject_getObjectAddress((InformationObject)spi4_dec));
  1378. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, SinglePointInformation_getQuality(spi1_dec));
  1379. TEST_ASSERT_TRUE(SinglePointInformation_getValue(spi1_dec));
  1380. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, SinglePointInformation_getQuality(spi2_dec));
  1381. TEST_ASSERT_FALSE(SinglePointInformation_getValue(spi2_dec));
  1382. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, SinglePointInformation_getQuality(spi3_dec));
  1383. TEST_ASSERT_TRUE(SinglePointInformation_getValue(spi3_dec));
  1384. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, SinglePointInformation_getQuality(spi4_dec));
  1385. TEST_ASSERT_FALSE(SinglePointInformation_getValue(spi4_dec));
  1386. SinglePointInformation_destroy(spi1_dec);
  1387. SinglePointInformation_destroy(spi2_dec);
  1388. SinglePointInformation_destroy(spi3_dec);
  1389. SinglePointInformation_destroy(spi4_dec);
  1390. CS101_ASDU_destroy(asdu2);
  1391. }
  1392. void
  1393. test_DoublePointWithCP24Time2a(void)
  1394. {
  1395. DoublePointWithCP24Time2a dpi1;
  1396. DoublePointWithCP24Time2a dpi2;
  1397. DoublePointWithCP24Time2a dpi3;
  1398. uint64_t time1 = Hal_getTimeInMs();
  1399. uint64_t time2 = time1 + 1000;
  1400. uint64_t time3 = time2 + 1000;
  1401. struct sCP24Time2a cpTime1;
  1402. struct sCP24Time2a cpTime2;
  1403. struct sCP24Time2a cpTime3;
  1404. bzero(&cpTime1, sizeof(struct sCP24Time2a));
  1405. bzero(&cpTime2, sizeof(struct sCP24Time2a));
  1406. bzero(&cpTime3, sizeof(struct sCP24Time2a));
  1407. CP24Time2a_setMinute(&cpTime1, 12);
  1408. CP24Time2a_setMillisecond(&cpTime1, 24123);
  1409. CP24Time2a_setMinute(&cpTime2, 54);
  1410. CP24Time2a_setMillisecond(&cpTime2, 12345);
  1411. CP24Time2a_setMinute(&cpTime3, 00);
  1412. CP24Time2a_setMillisecond(&cpTime3, 00001);
  1413. dpi1 = DoublePointWithCP24Time2a_create(NULL, 101, IEC60870_DOUBLE_POINT_OFF, IEC60870_QUALITY_INVALID, &cpTime1);
  1414. dpi2 = DoublePointWithCP24Time2a_create(NULL, 102, IEC60870_DOUBLE_POINT_ON, IEC60870_QUALITY_BLOCKED, &cpTime2);
  1415. dpi3 = DoublePointWithCP24Time2a_create(NULL, 103, IEC60870_DOUBLE_POINT_INDETERMINATE, IEC60870_QUALITY_GOOD, &cpTime3);
  1416. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, DoublePointInformation_getQuality((DoublePointInformation )dpi1));
  1417. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, DoublePointInformation_getQuality((DoublePointInformation )dpi2));
  1418. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, DoublePointInformation_getQuality((DoublePointInformation )dpi3));
  1419. TEST_ASSERT_TRUE(DoublePointInformation_getQuality((DoublePointInformation )dpi1));
  1420. uint8_t buffer[256];
  1421. struct sBufferFrame bf;
  1422. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  1423. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  1424. CS101_ASDU_addInformationObject(asdu, (InformationObject) dpi1);
  1425. CS101_ASDU_addInformationObject(asdu, (InformationObject) dpi2);
  1426. CS101_ASDU_addInformationObject(asdu, (InformationObject) dpi3);
  1427. InformationObject_destroy((InformationObject) dpi1);
  1428. InformationObject_destroy((InformationObject) dpi2);
  1429. InformationObject_destroy((InformationObject) dpi3);
  1430. CS101_ASDU_encode(asdu, f);
  1431. TEST_ASSERT_EQUAL_INT(27, Frame_getMsgSize(f));
  1432. CS101_ASDU_destroy(asdu);
  1433. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  1434. TEST_ASSERT_EQUAL_INT(3, CS101_ASDU_getNumberOfElements(asdu2));
  1435. DoublePointWithCP24Time2a dpi1_dec = (DoublePointWithCP24Time2a) CS101_ASDU_getElement(asdu2, 0);
  1436. DoublePointWithCP24Time2a dpi2_dec = (DoublePointWithCP24Time2a) CS101_ASDU_getElement(asdu2, 1);
  1437. DoublePointWithCP24Time2a dpi3_dec = (DoublePointWithCP24Time2a) CS101_ASDU_getElement(asdu2, 2);
  1438. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )dpi1_dec));
  1439. TEST_ASSERT_EQUAL_INT(102, InformationObject_getObjectAddress((InformationObject )dpi2_dec));
  1440. TEST_ASSERT_EQUAL_INT(103, InformationObject_getObjectAddress((InformationObject )dpi3_dec));
  1441. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, DoublePointInformation_getQuality((DoublePointInformation )dpi1_dec));
  1442. TEST_ASSERT_TRUE(DoublePointInformation_getQuality((DoublePointInformation )dpi1_dec));
  1443. CP24Time2a time1_dec = DoublePointWithCP24Time2a_getTimestamp(dpi1_dec);
  1444. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time1_dec));
  1445. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time1_dec));
  1446. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time1_dec));
  1447. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, DoublePointInformation_getQuality((DoublePointInformation )dpi2_dec));
  1448. TEST_ASSERT_TRUE(DoublePointInformation_getQuality((DoublePointInformation )dpi2_dec));
  1449. CP24Time2a time2_dec = DoublePointWithCP24Time2a_getTimestamp(dpi2_dec);
  1450. TEST_ASSERT_EQUAL_INT(54, CP24Time2a_getMinute(time2_dec));
  1451. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getSecond(time2_dec));
  1452. TEST_ASSERT_EQUAL_INT(345, CP24Time2a_getMillisecond(time2_dec));
  1453. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, DoublePointInformation_getQuality((DoublePointInformation )dpi3_dec));
  1454. TEST_ASSERT_TRUE(DoublePointInformation_getValue((DoublePointInformation )dpi3_dec));
  1455. CP24Time2a time3_dec = DoublePointWithCP24Time2a_getTimestamp(dpi3_dec);
  1456. TEST_ASSERT_EQUAL_INT(00, CP24Time2a_getMinute(time3_dec));
  1457. TEST_ASSERT_EQUAL_INT(00, CP24Time2a_getSecond(time3_dec));
  1458. TEST_ASSERT_EQUAL_INT(1, CP24Time2a_getMillisecond(time3_dec));
  1459. InformationObject_destroy((InformationObject) dpi1_dec);
  1460. InformationObject_destroy((InformationObject) dpi2_dec);
  1461. InformationObject_destroy((InformationObject) dpi3_dec);
  1462. CS101_ASDU_destroy(asdu2);
  1463. }
  1464. void
  1465. test_SinglePointWithCP24Time2a(void)
  1466. {
  1467. SinglePointWithCP24Time2a spi1;
  1468. SinglePointWithCP24Time2a spi2;
  1469. SinglePointWithCP24Time2a spi3;
  1470. uint64_t time1 = Hal_getTimeInMs();
  1471. uint64_t time2 = time1 + 1000;
  1472. uint64_t time3 = time2 + 1000;
  1473. struct sCP24Time2a cpTime1;
  1474. struct sCP24Time2a cpTime2;
  1475. struct sCP24Time2a cpTime3;
  1476. bzero(&cpTime1, sizeof(struct sCP24Time2a));
  1477. bzero(&cpTime2, sizeof(struct sCP24Time2a));
  1478. bzero(&cpTime3, sizeof(struct sCP24Time2a));
  1479. CP24Time2a_setMinute(&cpTime1, 12);
  1480. CP24Time2a_setMillisecond(&cpTime1, 24123);
  1481. CP24Time2a_setMinute(&cpTime2, 54);
  1482. CP24Time2a_setMillisecond(&cpTime2, 12345);
  1483. CP24Time2a_setMinute(&cpTime3, 00);
  1484. CP24Time2a_setMillisecond(&cpTime3, 00001);
  1485. spi1 = SinglePointWithCP24Time2a_create(NULL, 101, true, IEC60870_QUALITY_INVALID, &cpTime1);
  1486. spi2 = SinglePointWithCP24Time2a_create(NULL, 102, false, IEC60870_QUALITY_BLOCKED, &cpTime2);
  1487. spi3 = SinglePointWithCP24Time2a_create(NULL, 103, true, IEC60870_QUALITY_GOOD, &cpTime3);
  1488. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, SinglePointInformation_getQuality((SinglePointInformation)spi1));
  1489. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, SinglePointInformation_getQuality((SinglePointInformation)spi2));
  1490. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, SinglePointInformation_getQuality((SinglePointInformation)spi3));
  1491. TEST_ASSERT_TRUE(SinglePointInformation_getValue((SinglePointInformation)spi1));
  1492. uint8_t buffer[256];
  1493. struct sBufferFrame bf;
  1494. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  1495. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  1496. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi1);
  1497. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi2);
  1498. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi3);
  1499. InformationObject_destroy((InformationObject) spi1);
  1500. InformationObject_destroy((InformationObject) spi2);
  1501. InformationObject_destroy((InformationObject) spi3);
  1502. CS101_ASDU_encode(asdu, f);
  1503. TEST_ASSERT_EQUAL_INT(27, Frame_getMsgSize(f));
  1504. CS101_ASDU_destroy(asdu);
  1505. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  1506. TEST_ASSERT_EQUAL_INT(3, CS101_ASDU_getNumberOfElements(asdu2));
  1507. SinglePointWithCP24Time2a spi1_dec = (SinglePointWithCP24Time2a) CS101_ASDU_getElement(asdu2, 0);
  1508. SinglePointWithCP24Time2a spi2_dec = (SinglePointWithCP24Time2a) CS101_ASDU_getElement(asdu2, 1);
  1509. SinglePointWithCP24Time2a spi3_dec = (SinglePointWithCP24Time2a) CS101_ASDU_getElement(asdu2, 2);
  1510. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject)spi1_dec));
  1511. TEST_ASSERT_EQUAL_INT(102, InformationObject_getObjectAddress((InformationObject)spi2_dec));
  1512. TEST_ASSERT_EQUAL_INT(103, InformationObject_getObjectAddress((InformationObject)spi3_dec));
  1513. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, SinglePointInformation_getQuality((SinglePointInformation)spi1_dec));
  1514. TEST_ASSERT_TRUE(SinglePointInformation_getValue((SinglePointInformation)spi1_dec));
  1515. CP24Time2a time1_dec = SinglePointWithCP24Time2a_getTimestamp(spi1_dec);
  1516. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time1_dec));
  1517. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time1_dec));
  1518. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time1_dec));
  1519. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, SinglePointInformation_getQuality((SinglePointInformation)spi2_dec));
  1520. TEST_ASSERT_FALSE(SinglePointInformation_getValue((SinglePointInformation)spi2_dec));
  1521. CP24Time2a time2_dec = SinglePointWithCP24Time2a_getTimestamp(spi2_dec);
  1522. TEST_ASSERT_EQUAL_INT(54, CP24Time2a_getMinute(time2_dec));
  1523. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getSecond(time2_dec));
  1524. TEST_ASSERT_EQUAL_INT(345, CP24Time2a_getMillisecond(time2_dec));
  1525. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, SinglePointInformation_getQuality((SinglePointInformation)spi3_dec));
  1526. TEST_ASSERT_TRUE(SinglePointInformation_getValue((SinglePointInformation)spi3_dec));
  1527. CP24Time2a time3_dec = SinglePointWithCP24Time2a_getTimestamp(spi3_dec);
  1528. TEST_ASSERT_EQUAL_INT(00, CP24Time2a_getMinute(time3_dec));
  1529. TEST_ASSERT_EQUAL_INT(00, CP24Time2a_getSecond(time3_dec));
  1530. TEST_ASSERT_EQUAL_INT(1, CP24Time2a_getMillisecond(time3_dec));
  1531. InformationObject_destroy((InformationObject) spi1_dec);
  1532. InformationObject_destroy((InformationObject) spi2_dec);
  1533. InformationObject_destroy((InformationObject) spi3_dec);
  1534. CS101_ASDU_destroy(asdu2);
  1535. }
  1536. void
  1537. test_DoublePointWithCP56Time2a(void)
  1538. {
  1539. DoublePointWithCP56Time2a dpi1;
  1540. DoublePointWithCP56Time2a dpi2;
  1541. DoublePointWithCP56Time2a dpi3;
  1542. uint64_t time1 = Hal_getTimeInMs();
  1543. uint64_t time2 = time1 + 1000;
  1544. uint64_t time3 = time2 + 1000;
  1545. struct sCP56Time2a cpTime1;
  1546. struct sCP56Time2a cpTime2;
  1547. struct sCP56Time2a cpTime3;
  1548. CP56Time2a_createFromMsTimestamp(&cpTime1, time1);
  1549. CP56Time2a_createFromMsTimestamp(&cpTime2, time2);
  1550. CP56Time2a_createFromMsTimestamp(&cpTime3, time3);
  1551. dpi1 = DoublePointWithCP56Time2a_create(NULL, 101, IEC60870_DOUBLE_POINT_OFF, IEC60870_QUALITY_INVALID, &cpTime1);
  1552. dpi2 = DoublePointWithCP56Time2a_create(NULL, 102, IEC60870_DOUBLE_POINT_ON, IEC60870_QUALITY_BLOCKED, &cpTime2);
  1553. dpi3 = DoublePointWithCP56Time2a_create(NULL, 103, IEC60870_DOUBLE_POINT_INDETERMINATE, IEC60870_QUALITY_GOOD, &cpTime3);
  1554. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, DoublePointInformation_getQuality((DoublePointInformation)dpi1));
  1555. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, DoublePointInformation_getQuality((DoublePointInformation)dpi2));
  1556. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, DoublePointInformation_getQuality((DoublePointInformation)dpi3));
  1557. TEST_ASSERT_TRUE(DoublePointInformation_getValue((DoublePointInformation)dpi1));
  1558. uint8_t buffer[256];
  1559. struct sBufferFrame bf;
  1560. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  1561. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  1562. CS101_ASDU_addInformationObject(asdu, (InformationObject) dpi1);
  1563. CS101_ASDU_addInformationObject(asdu, (InformationObject) dpi2);
  1564. CS101_ASDU_addInformationObject(asdu, (InformationObject) dpi3);
  1565. InformationObject_destroy((InformationObject) dpi1);
  1566. InformationObject_destroy((InformationObject) dpi2);
  1567. InformationObject_destroy((InformationObject) dpi3);
  1568. CS101_ASDU_encode(asdu, f);
  1569. TEST_ASSERT_EQUAL_INT(39, Frame_getMsgSize(f));
  1570. CS101_ASDU_destroy(asdu);
  1571. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  1572. TEST_ASSERT_EQUAL_INT(3, CS101_ASDU_getNumberOfElements(asdu2));
  1573. DoublePointWithCP56Time2a dpi1_dec = (DoublePointWithCP56Time2a) CS101_ASDU_getElement(asdu2, 0);
  1574. DoublePointWithCP56Time2a dpi2_dec = (DoublePointWithCP56Time2a) CS101_ASDU_getElement(asdu2, 1);
  1575. DoublePointWithCP56Time2a dpi3_dec = (DoublePointWithCP56Time2a) CS101_ASDU_getElement(asdu2, 2);
  1576. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject)dpi1_dec));
  1577. TEST_ASSERT_EQUAL_INT(102, InformationObject_getObjectAddress((InformationObject)dpi2_dec));
  1578. TEST_ASSERT_EQUAL_INT(103, InformationObject_getObjectAddress((InformationObject)dpi3_dec));
  1579. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, DoublePointInformation_getQuality((DoublePointInformation)dpi1_dec));
  1580. TEST_ASSERT_EQUAL_UINT8(IEC60870_DOUBLE_POINT_OFF, DoublePointInformation_getValue((DoublePointInformation)dpi1_dec));
  1581. TEST_ASSERT_EQUAL_UINT64(time1, CP56Time2a_toMsTimestamp(DoublePointWithCP56Time2a_getTimestamp(dpi1_dec)));
  1582. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, DoublePointInformation_getQuality((DoublePointInformation)dpi2_dec));
  1583. TEST_ASSERT_EQUAL_UINT8(IEC60870_DOUBLE_POINT_ON, DoublePointInformation_getValue((DoublePointInformation)dpi2_dec));
  1584. TEST_ASSERT_EQUAL_UINT64(time2, CP56Time2a_toMsTimestamp(DoublePointWithCP56Time2a_getTimestamp(dpi2_dec)));
  1585. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, DoublePointInformation_getQuality((DoublePointInformation)dpi3_dec));
  1586. TEST_ASSERT_EQUAL_UINT8(IEC60870_DOUBLE_POINT_INDETERMINATE, DoublePointInformation_getValue((DoublePointInformation)dpi3_dec));
  1587. TEST_ASSERT_EQUAL_UINT64(time3, CP56Time2a_toMsTimestamp(DoublePointWithCP56Time2a_getTimestamp(dpi3_dec)));
  1588. InformationObject_destroy((InformationObject) dpi1_dec);
  1589. InformationObject_destroy((InformationObject) dpi2_dec);
  1590. InformationObject_destroy((InformationObject) dpi3_dec);
  1591. CS101_ASDU_destroy(asdu2);
  1592. }
  1593. void
  1594. test_SinglePointWithCP56Time2a(void)
  1595. {
  1596. SinglePointWithCP56Time2a spi1;
  1597. SinglePointWithCP56Time2a spi2;
  1598. SinglePointWithCP56Time2a spi3;
  1599. uint64_t time1 = Hal_getTimeInMs();
  1600. uint64_t time2 = time1 + 1000;
  1601. uint64_t time3 = time2 + 1000;
  1602. struct sCP56Time2a cpTime1;
  1603. struct sCP56Time2a cpTime2;
  1604. struct sCP56Time2a cpTime3;
  1605. CP56Time2a_createFromMsTimestamp(&cpTime1, time1);
  1606. CP56Time2a_createFromMsTimestamp(&cpTime2, time2);
  1607. CP56Time2a_createFromMsTimestamp(&cpTime3, time3);
  1608. spi1 = SinglePointWithCP56Time2a_create(NULL, 101, true, IEC60870_QUALITY_INVALID, &cpTime1);
  1609. spi2 = SinglePointWithCP56Time2a_create(NULL, 102, false, IEC60870_QUALITY_BLOCKED, &cpTime2);
  1610. spi3 = SinglePointWithCP56Time2a_create(NULL, 103, true, IEC60870_QUALITY_GOOD, &cpTime3);
  1611. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, SinglePointInformation_getQuality((SinglePointInformation)spi1));
  1612. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, SinglePointInformation_getQuality((SinglePointInformation)spi2));
  1613. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, SinglePointInformation_getQuality((SinglePointInformation)spi3));
  1614. TEST_ASSERT_TRUE(SinglePointInformation_getValue((SinglePointInformation)spi1));
  1615. uint8_t buffer[256];
  1616. struct sBufferFrame bf;
  1617. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  1618. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  1619. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi1);
  1620. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi2);
  1621. CS101_ASDU_addInformationObject(asdu, (InformationObject) spi3);
  1622. InformationObject_destroy((InformationObject) spi1);
  1623. InformationObject_destroy((InformationObject) spi2);
  1624. InformationObject_destroy((InformationObject) spi3);
  1625. CS101_ASDU_encode(asdu, f);
  1626. TEST_ASSERT_EQUAL_INT(39, Frame_getMsgSize(f));
  1627. CS101_ASDU_destroy(asdu);
  1628. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  1629. TEST_ASSERT_EQUAL_INT(3, CS101_ASDU_getNumberOfElements(asdu2));
  1630. SinglePointWithCP56Time2a spi1_dec = (SinglePointWithCP56Time2a) CS101_ASDU_getElement(asdu2, 0);
  1631. SinglePointWithCP56Time2a spi2_dec = (SinglePointWithCP56Time2a) CS101_ASDU_getElement(asdu2, 1);
  1632. SinglePointWithCP56Time2a spi3_dec = (SinglePointWithCP56Time2a) CS101_ASDU_getElement(asdu2, 2);
  1633. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject)spi1_dec));
  1634. TEST_ASSERT_EQUAL_INT(102, InformationObject_getObjectAddress((InformationObject)spi2_dec));
  1635. TEST_ASSERT_EQUAL_INT(103, InformationObject_getObjectAddress((InformationObject)spi3_dec));
  1636. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, SinglePointInformation_getQuality((SinglePointInformation)spi1_dec));
  1637. TEST_ASSERT_TRUE(SinglePointInformation_getValue((SinglePointInformation)spi1_dec));
  1638. TEST_ASSERT_EQUAL_UINT64(time1, CP56Time2a_toMsTimestamp(SinglePointWithCP56Time2a_getTimestamp(spi1_dec)));
  1639. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, SinglePointInformation_getQuality((SinglePointInformation)spi2_dec));
  1640. TEST_ASSERT_FALSE(SinglePointInformation_getValue((SinglePointInformation)spi2_dec));
  1641. TEST_ASSERT_EQUAL_UINT64(time2, CP56Time2a_toMsTimestamp(SinglePointWithCP56Time2a_getTimestamp(spi2_dec)));
  1642. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, SinglePointInformation_getQuality((SinglePointInformation)spi3_dec));
  1643. TEST_ASSERT_TRUE(SinglePointInformation_getValue((SinglePointInformation)spi3_dec));
  1644. TEST_ASSERT_EQUAL_UINT64(time3, CP56Time2a_toMsTimestamp(SinglePointWithCP56Time2a_getTimestamp(spi3_dec)));
  1645. InformationObject_destroy((InformationObject) spi1_dec);
  1646. InformationObject_destroy((InformationObject) spi2_dec);
  1647. InformationObject_destroy((InformationObject) spi3_dec);
  1648. CS101_ASDU_destroy(asdu2);
  1649. }
  1650. void
  1651. test_NormalizeMeasureValueWithoutQuality(void)
  1652. {
  1653. MeasuredValueNormalizedWithoutQuality nmv1;
  1654. nmv1 = MeasuredValueNormalizedWithoutQuality_create(NULL, 101, 0.5f);
  1655. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.5f, MeasuredValueNormalizedWithoutQuality_getValue((MeasuredValueNormalizedWithoutQuality )nmv1));
  1656. uint8_t buffer[256];
  1657. struct sBufferFrame bf;
  1658. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  1659. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  1660. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv1);
  1661. MeasuredValueNormalizedWithoutQuality_destroy(nmv1);
  1662. CS101_ASDU_encode(asdu, f);
  1663. TEST_ASSERT_EQUAL_INT(11, Frame_getMsgSize(f));
  1664. CS101_ASDU_destroy(asdu);
  1665. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  1666. TEST_ASSERT_EQUAL_INT(1, CS101_ASDU_getNumberOfElements(asdu2));
  1667. MeasuredValueNormalizedWithoutQuality nmv1_dec = (MeasuredValueNormalizedWithoutQuality) CS101_ASDU_getElement(asdu2, 0);
  1668. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )nmv1_dec));
  1669. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.5f, MeasuredValueNormalizedWithoutQuality_getValue((MeasuredValueNormalizedWithoutQuality )nmv1_dec));
  1670. MeasuredValueNormalizedWithoutQuality_destroy(nmv1_dec);
  1671. CS101_ASDU_destroy(asdu2);
  1672. }
  1673. void
  1674. test_NormalizeMeasureValue(void)
  1675. {
  1676. MeasuredValueNormalized nmv1;
  1677. MeasuredValueNormalized nmv2;
  1678. MeasuredValueNormalized nmv3;
  1679. MeasuredValueNormalized nmv4;
  1680. MeasuredValueNormalized nmv5;
  1681. MeasuredValueNormalized nmv6;
  1682. MeasuredValueNormalized nmv7;
  1683. MeasuredValueNormalized nmv8;
  1684. nmv1 = MeasuredValueNormalized_create(NULL, 101, -0.5f, IEC60870_QUALITY_GOOD);
  1685. nmv2 = MeasuredValueNormalized_create(NULL, 102, -0.2f, IEC60870_QUALITY_OVERFLOW);
  1686. nmv3 = MeasuredValueNormalized_create(NULL, 103, -0.1f, IEC60870_QUALITY_RESERVED);
  1687. nmv4 = MeasuredValueNormalized_create(NULL, 104, 0, IEC60870_QUALITY_ELAPSED_TIME_INVALID);
  1688. nmv5 = MeasuredValueNormalized_create(NULL, 105, 0.2f, IEC60870_QUALITY_BLOCKED);
  1689. nmv6 = MeasuredValueNormalized_create(NULL, 106, 0.3f, IEC60870_QUALITY_SUBSTITUTED);
  1690. nmv7 = MeasuredValueNormalized_create(NULL, 107, 0.4f, IEC60870_QUALITY_NON_TOPICAL);
  1691. nmv8 = MeasuredValueNormalized_create(NULL, 108, 0.5f, IEC60870_QUALITY_INVALID);
  1692. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv1));
  1693. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv2));
  1694. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv3));
  1695. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv4));
  1696. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv5));
  1697. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv6));
  1698. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv7));
  1699. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv8));
  1700. TEST_ASSERT_FLOAT_WITHIN(0.01f, -0.5f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv1));
  1701. TEST_ASSERT_FLOAT_WITHIN(0.01f, -0.2f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv2));
  1702. TEST_ASSERT_FLOAT_WITHIN(0.01f, -0.1f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv3));
  1703. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv4));
  1704. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.2f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv5));
  1705. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.3f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv6));
  1706. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.4f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv7));
  1707. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.5f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv8));
  1708. uint8_t buffer[256];
  1709. struct sBufferFrame bf;
  1710. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  1711. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  1712. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv1);
  1713. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv2);
  1714. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv3);
  1715. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv4);
  1716. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv5);
  1717. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv6);
  1718. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv7);
  1719. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv8);
  1720. MeasuredValueNormalized_destroy(nmv1);
  1721. MeasuredValueNormalized_destroy(nmv2);
  1722. MeasuredValueNormalized_destroy(nmv3);
  1723. MeasuredValueNormalized_destroy(nmv4);
  1724. MeasuredValueNormalized_destroy(nmv5);
  1725. MeasuredValueNormalized_destroy(nmv6);
  1726. MeasuredValueNormalized_destroy(nmv7);
  1727. MeasuredValueNormalized_destroy(nmv8);
  1728. CS101_ASDU_encode(asdu, f);
  1729. TEST_ASSERT_EQUAL_INT(54, Frame_getMsgSize(f));
  1730. CS101_ASDU_destroy(asdu);
  1731. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  1732. TEST_ASSERT_EQUAL_INT(8, CS101_ASDU_getNumberOfElements(asdu2));
  1733. MeasuredValueNormalized nmv1_dec = (MeasuredValueNormalized) CS101_ASDU_getElement(asdu2, 0);
  1734. MeasuredValueNormalized nmv2_dec = (MeasuredValueNormalized) CS101_ASDU_getElement(asdu2, 1);
  1735. MeasuredValueNormalized nmv3_dec = (MeasuredValueNormalized) CS101_ASDU_getElement(asdu2, 2);
  1736. MeasuredValueNormalized nmv4_dec = (MeasuredValueNormalized) CS101_ASDU_getElement(asdu2, 3);
  1737. MeasuredValueNormalized nmv5_dec = (MeasuredValueNormalized) CS101_ASDU_getElement(asdu2, 4);
  1738. MeasuredValueNormalized nmv6_dec = (MeasuredValueNormalized) CS101_ASDU_getElement(asdu2, 5);
  1739. MeasuredValueNormalized nmv7_dec = (MeasuredValueNormalized) CS101_ASDU_getElement(asdu2, 6);
  1740. MeasuredValueNormalized nmv8_dec = (MeasuredValueNormalized) CS101_ASDU_getElement(asdu2, 7);
  1741. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )nmv1_dec));
  1742. TEST_ASSERT_EQUAL_INT(102, InformationObject_getObjectAddress((InformationObject )nmv2_dec));
  1743. TEST_ASSERT_EQUAL_INT(103, InformationObject_getObjectAddress((InformationObject )nmv3_dec));
  1744. TEST_ASSERT_EQUAL_INT(104, InformationObject_getObjectAddress((InformationObject )nmv4_dec));
  1745. TEST_ASSERT_EQUAL_INT(105, InformationObject_getObjectAddress((InformationObject )nmv5_dec));
  1746. TEST_ASSERT_EQUAL_INT(106, InformationObject_getObjectAddress((InformationObject )nmv6_dec));
  1747. TEST_ASSERT_EQUAL_INT(107, InformationObject_getObjectAddress((InformationObject )nmv7_dec));
  1748. TEST_ASSERT_EQUAL_INT(108, InformationObject_getObjectAddress((InformationObject )nmv8_dec));
  1749. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv1_dec));
  1750. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv2_dec));
  1751. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv3_dec));
  1752. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv4_dec));
  1753. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv5_dec));
  1754. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv6_dec));
  1755. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv7_dec));
  1756. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv8_dec));
  1757. TEST_ASSERT_FLOAT_WITHIN(0.01f, -0.5f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv1_dec));
  1758. TEST_ASSERT_FLOAT_WITHIN(0.01f, -0.2f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv2_dec));
  1759. TEST_ASSERT_FLOAT_WITHIN(0.01f, -0.1f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv3_dec));
  1760. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv4_dec));
  1761. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.2f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv5_dec));
  1762. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.3f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv6_dec));
  1763. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.4f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv7_dec));
  1764. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.5f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv8_dec));
  1765. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )nmv1_dec));
  1766. TEST_ASSERT_EQUAL_INT(102, InformationObject_getObjectAddress((InformationObject )nmv2_dec));
  1767. TEST_ASSERT_EQUAL_INT(103, InformationObject_getObjectAddress((InformationObject )nmv3_dec));
  1768. TEST_ASSERT_EQUAL_INT(104, InformationObject_getObjectAddress((InformationObject )nmv4_dec));
  1769. TEST_ASSERT_EQUAL_INT(105, InformationObject_getObjectAddress((InformationObject )nmv5_dec));
  1770. TEST_ASSERT_EQUAL_INT(106, InformationObject_getObjectAddress((InformationObject )nmv6_dec));
  1771. TEST_ASSERT_EQUAL_INT(107, InformationObject_getObjectAddress((InformationObject )nmv7_dec));
  1772. TEST_ASSERT_EQUAL_INT(108, InformationObject_getObjectAddress((InformationObject )nmv8_dec));
  1773. MeasuredValueNormalized_destroy(nmv1_dec);
  1774. MeasuredValueNormalized_destroy(nmv2_dec);
  1775. MeasuredValueNormalized_destroy(nmv3_dec);
  1776. MeasuredValueNormalized_destroy(nmv4_dec);
  1777. MeasuredValueNormalized_destroy(nmv5_dec);
  1778. MeasuredValueNormalized_destroy(nmv6_dec);
  1779. MeasuredValueNormalized_destroy(nmv7_dec);
  1780. MeasuredValueNormalized_destroy(nmv8_dec);
  1781. CS101_ASDU_destroy(asdu2);
  1782. }
  1783. void
  1784. test_MeasuredValueNormalizedWithCP24Time2a(void)
  1785. {
  1786. MeasuredValueNormalizedWithCP24Time2a nmv1;
  1787. MeasuredValueNormalizedWithCP24Time2a nmv2;
  1788. MeasuredValueNormalizedWithCP24Time2a nmv3;
  1789. MeasuredValueNormalizedWithCP24Time2a nmv4;
  1790. MeasuredValueNormalizedWithCP24Time2a nmv5;
  1791. MeasuredValueNormalizedWithCP24Time2a nmv6;
  1792. MeasuredValueNormalizedWithCP24Time2a nmv7;
  1793. MeasuredValueNormalizedWithCP24Time2a nmv8;
  1794. uint64_t time1 = Hal_getTimeInMs();
  1795. uint64_t time2 = time1 + 1000;
  1796. uint64_t time3 = time2 + 1000;
  1797. uint64_t time4 = time3 + 1000;
  1798. uint64_t time5 = time4 + 1000;
  1799. uint64_t time6 = time5 + 1000;
  1800. uint64_t time7 = time6 + 1000;
  1801. uint64_t time8 = time7 + 1000;
  1802. struct sCP24Time2a cpTime1;
  1803. struct sCP24Time2a cpTime2;
  1804. struct sCP24Time2a cpTime3;
  1805. struct sCP24Time2a cpTime4;
  1806. struct sCP24Time2a cpTime5;
  1807. struct sCP24Time2a cpTime6;
  1808. struct sCP24Time2a cpTime7;
  1809. struct sCP24Time2a cpTime8;
  1810. bzero(&cpTime1, sizeof(struct sCP24Time2a));
  1811. bzero(&cpTime2, sizeof(struct sCP24Time2a));
  1812. bzero(&cpTime3, sizeof(struct sCP24Time2a));
  1813. bzero(&cpTime4, sizeof(struct sCP24Time2a));
  1814. bzero(&cpTime5, sizeof(struct sCP24Time2a));
  1815. bzero(&cpTime6, sizeof(struct sCP24Time2a));
  1816. bzero(&cpTime7, sizeof(struct sCP24Time2a));
  1817. bzero(&cpTime8, sizeof(struct sCP24Time2a));
  1818. CP24Time2a_setMinute(&cpTime1, 12);
  1819. CP24Time2a_setMillisecond(&cpTime1, 24123);
  1820. CP24Time2a_setMinute(&cpTime2, 54);
  1821. CP24Time2a_setMillisecond(&cpTime2, 12345);
  1822. CP24Time2a_setMinute(&cpTime3, 00);
  1823. CP24Time2a_setMillisecond(&cpTime3, 00001);
  1824. CP24Time2a_setMinute(&cpTime4, 12);
  1825. CP24Time2a_setMillisecond(&cpTime4, 24123);
  1826. CP24Time2a_setMinute(&cpTime5, 12);
  1827. CP24Time2a_setMillisecond(&cpTime5, 24123);
  1828. CP24Time2a_setMinute(&cpTime6, 12);
  1829. CP24Time2a_setMillisecond(&cpTime6, 24123);
  1830. CP24Time2a_setMinute(&cpTime7, 12);
  1831. CP24Time2a_setMillisecond(&cpTime7, 24123);
  1832. CP24Time2a_setMinute(&cpTime8, 12);
  1833. CP24Time2a_setMillisecond(&cpTime8, 24123);
  1834. nmv1 = MeasuredValueNormalizedWithCP24Time2a_create(NULL, 101, -0.5f, IEC60870_QUALITY_GOOD, &cpTime1);
  1835. nmv2 = MeasuredValueNormalizedWithCP24Time2a_create(NULL, 102, -0.2f, IEC60870_QUALITY_OVERFLOW, &cpTime2);
  1836. nmv3 = MeasuredValueNormalizedWithCP24Time2a_create(NULL, 103, -0.1f, IEC60870_QUALITY_RESERVED, &cpTime3);
  1837. nmv4 = MeasuredValueNormalizedWithCP24Time2a_create(NULL, 104, 0, IEC60870_QUALITY_ELAPSED_TIME_INVALID, &cpTime4);
  1838. nmv5 = MeasuredValueNormalizedWithCP24Time2a_create(NULL, 105, 0.2f, IEC60870_QUALITY_BLOCKED, &cpTime5);
  1839. nmv6 = MeasuredValueNormalizedWithCP24Time2a_create(NULL, 106, 0.3f, IEC60870_QUALITY_SUBSTITUTED, &cpTime6);
  1840. nmv7 = MeasuredValueNormalizedWithCP24Time2a_create(NULL, 107, 0.4f, IEC60870_QUALITY_NON_TOPICAL, &cpTime7);
  1841. nmv8 = MeasuredValueNormalizedWithCP24Time2a_create(NULL, 108, 0.5f, IEC60870_QUALITY_INVALID, &cpTime8);
  1842. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv1));
  1843. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv2));
  1844. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv3));
  1845. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv4));
  1846. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv5));
  1847. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv6));
  1848. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv7));
  1849. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv8));
  1850. TEST_ASSERT_FLOAT_WITHIN(0.01f, -0.5f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv1));
  1851. TEST_ASSERT_FLOAT_WITHIN(0.01f, -0.2f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv2));
  1852. TEST_ASSERT_FLOAT_WITHIN(0.01f, -0.1f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv3));
  1853. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv4));
  1854. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.2f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv5));
  1855. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.3f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv6));
  1856. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.4f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv7));
  1857. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.5f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv8));
  1858. uint8_t buffer[256];
  1859. struct sBufferFrame bf;
  1860. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  1861. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  1862. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv1);
  1863. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv2);
  1864. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv3);
  1865. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv4);
  1866. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv5);
  1867. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv6);
  1868. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv7);
  1869. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv8);
  1870. MeasuredValueNormalizedWithCP24Time2a_destroy(nmv1);
  1871. MeasuredValueNormalizedWithCP24Time2a_destroy(nmv2);
  1872. MeasuredValueNormalizedWithCP24Time2a_destroy(nmv3);
  1873. MeasuredValueNormalizedWithCP24Time2a_destroy(nmv4);
  1874. MeasuredValueNormalizedWithCP24Time2a_destroy(nmv5);
  1875. MeasuredValueNormalizedWithCP24Time2a_destroy(nmv6);
  1876. MeasuredValueNormalizedWithCP24Time2a_destroy(nmv7);
  1877. MeasuredValueNormalizedWithCP24Time2a_destroy(nmv8);
  1878. CS101_ASDU_encode(asdu, f);
  1879. TEST_ASSERT_EQUAL_INT(78, Frame_getMsgSize(f));
  1880. CS101_ASDU_destroy(asdu);
  1881. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  1882. TEST_ASSERT_EQUAL_INT(8, CS101_ASDU_getNumberOfElements(asdu2));
  1883. MeasuredValueNormalizedWithCP24Time2a nmv1_dec = (MeasuredValueNormalizedWithCP24Time2a) CS101_ASDU_getElement(asdu2, 0);
  1884. MeasuredValueNormalizedWithCP24Time2a nmv2_dec = (MeasuredValueNormalizedWithCP24Time2a) CS101_ASDU_getElement(asdu2, 1);
  1885. MeasuredValueNormalizedWithCP24Time2a nmv3_dec = (MeasuredValueNormalizedWithCP24Time2a) CS101_ASDU_getElement(asdu2, 2);
  1886. MeasuredValueNormalizedWithCP24Time2a nmv4_dec = (MeasuredValueNormalizedWithCP24Time2a) CS101_ASDU_getElement(asdu2, 3);
  1887. MeasuredValueNormalizedWithCP24Time2a nmv5_dec = (MeasuredValueNormalizedWithCP24Time2a) CS101_ASDU_getElement(asdu2, 4);
  1888. MeasuredValueNormalizedWithCP24Time2a nmv6_dec = (MeasuredValueNormalizedWithCP24Time2a) CS101_ASDU_getElement(asdu2, 5);
  1889. MeasuredValueNormalizedWithCP24Time2a nmv7_dec = (MeasuredValueNormalizedWithCP24Time2a) CS101_ASDU_getElement(asdu2, 6);
  1890. MeasuredValueNormalizedWithCP24Time2a nmv8_dec = (MeasuredValueNormalizedWithCP24Time2a) CS101_ASDU_getElement(asdu2, 7);
  1891. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )nmv1_dec));
  1892. TEST_ASSERT_EQUAL_INT(102, InformationObject_getObjectAddress((InformationObject )nmv2_dec));
  1893. TEST_ASSERT_EQUAL_INT(103, InformationObject_getObjectAddress((InformationObject )nmv3_dec));
  1894. TEST_ASSERT_EQUAL_INT(104, InformationObject_getObjectAddress((InformationObject )nmv4_dec));
  1895. TEST_ASSERT_EQUAL_INT(105, InformationObject_getObjectAddress((InformationObject )nmv5_dec));
  1896. TEST_ASSERT_EQUAL_INT(106, InformationObject_getObjectAddress((InformationObject )nmv6_dec));
  1897. TEST_ASSERT_EQUAL_INT(107, InformationObject_getObjectAddress((InformationObject )nmv7_dec));
  1898. TEST_ASSERT_EQUAL_INT(108, InformationObject_getObjectAddress((InformationObject )nmv8_dec));
  1899. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv1_dec));
  1900. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv2_dec));
  1901. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv3_dec));
  1902. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv4_dec));
  1903. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv5_dec));
  1904. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv6_dec));
  1905. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv7_dec));
  1906. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv8_dec));
  1907. TEST_ASSERT_FLOAT_WITHIN(0.01f, -0.5f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv1_dec));
  1908. TEST_ASSERT_FLOAT_WITHIN(0.01f, -0.2f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv2_dec));
  1909. TEST_ASSERT_FLOAT_WITHIN(0.01f, -0.1f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv3_dec));
  1910. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv4_dec));
  1911. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.2f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv5_dec));
  1912. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.3f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv6_dec));
  1913. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.4f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv7_dec));
  1914. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.5f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv8_dec));
  1915. CP24Time2a time1_dec = MeasuredValueNormalizedWithCP24Time2a_getTimestamp(nmv1_dec);
  1916. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time1_dec));
  1917. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time1_dec));
  1918. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time1_dec));
  1919. CP24Time2a time2_dec = MeasuredValueNormalizedWithCP24Time2a_getTimestamp(nmv2_dec);
  1920. TEST_ASSERT_EQUAL_INT(54, CP24Time2a_getMinute(time2_dec));
  1921. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getSecond(time2_dec));
  1922. TEST_ASSERT_EQUAL_INT(345, CP24Time2a_getMillisecond(time2_dec));
  1923. CP24Time2a time3_dec = MeasuredValueNormalizedWithCP24Time2a_getTimestamp(nmv3_dec);
  1924. TEST_ASSERT_EQUAL_INT(00, CP24Time2a_getMinute(time3_dec));
  1925. TEST_ASSERT_EQUAL_INT(00, CP24Time2a_getSecond(time3_dec));
  1926. TEST_ASSERT_EQUAL_INT(1, CP24Time2a_getMillisecond(time3_dec));
  1927. CP24Time2a time4_dec = MeasuredValueNormalizedWithCP24Time2a_getTimestamp(nmv4_dec);
  1928. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time4_dec));
  1929. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time4_dec));
  1930. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time4_dec));
  1931. CP24Time2a time5_dec = MeasuredValueNormalizedWithCP24Time2a_getTimestamp(nmv5_dec);
  1932. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time5_dec));
  1933. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time5_dec));
  1934. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time5_dec));
  1935. CP24Time2a time6_dec = MeasuredValueNormalizedWithCP24Time2a_getTimestamp(nmv6_dec);
  1936. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time6_dec));
  1937. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time6_dec));
  1938. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time6_dec));
  1939. CP24Time2a time7_dec = MeasuredValueNormalizedWithCP24Time2a_getTimestamp(nmv7_dec);
  1940. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time7_dec));
  1941. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time7_dec));
  1942. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time7_dec));
  1943. CP24Time2a time8_dec = MeasuredValueNormalizedWithCP24Time2a_getTimestamp(nmv8_dec);
  1944. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time8_dec));
  1945. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time8_dec));
  1946. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time8_dec));
  1947. MeasuredValueNormalizedWithCP24Time2a_destroy(nmv1_dec);
  1948. MeasuredValueNormalizedWithCP24Time2a_destroy(nmv2_dec);
  1949. MeasuredValueNormalizedWithCP24Time2a_destroy(nmv3_dec);
  1950. MeasuredValueNormalizedWithCP24Time2a_destroy(nmv4_dec);
  1951. MeasuredValueNormalizedWithCP24Time2a_destroy(nmv5_dec);
  1952. MeasuredValueNormalizedWithCP24Time2a_destroy(nmv6_dec);
  1953. MeasuredValueNormalizedWithCP24Time2a_destroy(nmv7_dec);
  1954. MeasuredValueNormalizedWithCP24Time2a_destroy(nmv8_dec);
  1955. CS101_ASDU_destroy(asdu2);
  1956. }
  1957. void
  1958. test_MeasuredValueNormalizedWithCP56Time2a(void)
  1959. {
  1960. MeasuredValueNormalizedWithCP56Time2a nmv1;
  1961. MeasuredValueNormalizedWithCP56Time2a nmv2;
  1962. MeasuredValueNormalizedWithCP56Time2a nmv3;
  1963. MeasuredValueNormalizedWithCP56Time2a nmv4;
  1964. MeasuredValueNormalizedWithCP56Time2a nmv5;
  1965. MeasuredValueNormalizedWithCP56Time2a nmv6;
  1966. MeasuredValueNormalizedWithCP56Time2a nmv7;
  1967. MeasuredValueNormalizedWithCP56Time2a nmv8;
  1968. uint64_t time1 = Hal_getTimeInMs();
  1969. uint64_t time2 = time1 + 1000;
  1970. uint64_t time3 = time2 + 1000;
  1971. uint64_t time4 = time3 + 1000;
  1972. uint64_t time5 = time4 + 1000;
  1973. uint64_t time6 = time5 + 1000;
  1974. uint64_t time7 = time6 + 1000;
  1975. uint64_t time8 = time7 + 1000;
  1976. struct sCP56Time2a cpTime1;
  1977. struct sCP56Time2a cpTime2;
  1978. struct sCP56Time2a cpTime3;
  1979. struct sCP56Time2a cpTime4;
  1980. struct sCP56Time2a cpTime5;
  1981. struct sCP56Time2a cpTime6;
  1982. struct sCP56Time2a cpTime7;
  1983. struct sCP56Time2a cpTime8;
  1984. CP56Time2a_createFromMsTimestamp(&cpTime1, time1);
  1985. CP56Time2a_createFromMsTimestamp(&cpTime2, time2);
  1986. CP56Time2a_createFromMsTimestamp(&cpTime3, time3);
  1987. CP56Time2a_createFromMsTimestamp(&cpTime4, time4);
  1988. CP56Time2a_createFromMsTimestamp(&cpTime5, time5);
  1989. CP56Time2a_createFromMsTimestamp(&cpTime6, time6);
  1990. CP56Time2a_createFromMsTimestamp(&cpTime7, time7);
  1991. CP56Time2a_createFromMsTimestamp(&cpTime8, time8);
  1992. nmv1 = MeasuredValueNormalizedWithCP56Time2a_create(NULL, 101, -0.5f, IEC60870_QUALITY_GOOD, &cpTime1);
  1993. nmv2 = MeasuredValueNormalizedWithCP56Time2a_create(NULL, 102, -0.2f, IEC60870_QUALITY_OVERFLOW, &cpTime2);
  1994. nmv3 = MeasuredValueNormalizedWithCP56Time2a_create(NULL, 103, -0.1f, IEC60870_QUALITY_RESERVED, &cpTime3);
  1995. nmv4 = MeasuredValueNormalizedWithCP56Time2a_create(NULL, 104, 0, IEC60870_QUALITY_ELAPSED_TIME_INVALID, &cpTime4);
  1996. nmv5 = MeasuredValueNormalizedWithCP56Time2a_create(NULL, 105, 0.2f, IEC60870_QUALITY_BLOCKED, &cpTime5);
  1997. nmv6 = MeasuredValueNormalizedWithCP56Time2a_create(NULL, 106, 0.3f, IEC60870_QUALITY_SUBSTITUTED, &cpTime6);
  1998. nmv7 = MeasuredValueNormalizedWithCP56Time2a_create(NULL, 107, 0.4f, IEC60870_QUALITY_NON_TOPICAL, &cpTime7);
  1999. nmv8 = MeasuredValueNormalizedWithCP56Time2a_create(NULL, 108, 0.5f, IEC60870_QUALITY_INVALID, &cpTime8);
  2000. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv1));
  2001. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv2));
  2002. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv3));
  2003. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv4));
  2004. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv5));
  2005. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv6));
  2006. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv7));
  2007. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv8));
  2008. TEST_ASSERT_FLOAT_WITHIN(0.01f, -0.5f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv1));
  2009. TEST_ASSERT_FLOAT_WITHIN(0.01f, -0.2f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv2));
  2010. TEST_ASSERT_FLOAT_WITHIN(0.01f, -0.1f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv3));
  2011. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv4));
  2012. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.2f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv5));
  2013. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.3f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv6));
  2014. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.4f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv7));
  2015. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.5f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv8));
  2016. uint8_t buffer[256];
  2017. struct sBufferFrame bf;
  2018. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  2019. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  2020. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv1);
  2021. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv2);
  2022. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv3);
  2023. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv4);
  2024. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv5);
  2025. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv6);
  2026. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv7);
  2027. CS101_ASDU_addInformationObject(asdu, (InformationObject) nmv8);
  2028. MeasuredValueNormalizedWithCP56Time2a_destroy(nmv1);
  2029. MeasuredValueNormalizedWithCP56Time2a_destroy(nmv2);
  2030. MeasuredValueNormalizedWithCP56Time2a_destroy(nmv3);
  2031. MeasuredValueNormalizedWithCP56Time2a_destroy(nmv4);
  2032. MeasuredValueNormalizedWithCP56Time2a_destroy(nmv5);
  2033. MeasuredValueNormalizedWithCP56Time2a_destroy(nmv6);
  2034. MeasuredValueNormalizedWithCP56Time2a_destroy(nmv7);
  2035. MeasuredValueNormalizedWithCP56Time2a_destroy(nmv8);
  2036. CS101_ASDU_encode(asdu, f);
  2037. TEST_ASSERT_EQUAL_INT(110, Frame_getMsgSize(f));
  2038. CS101_ASDU_destroy(asdu);
  2039. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  2040. TEST_ASSERT_EQUAL_INT(8, CS101_ASDU_getNumberOfElements(asdu2));
  2041. MeasuredValueNormalizedWithCP56Time2a nmv1_dec = (MeasuredValueNormalizedWithCP56Time2a) CS101_ASDU_getElement(asdu2, 0);
  2042. MeasuredValueNormalizedWithCP56Time2a nmv2_dec = (MeasuredValueNormalizedWithCP56Time2a) CS101_ASDU_getElement(asdu2, 1);
  2043. MeasuredValueNormalizedWithCP56Time2a nmv3_dec = (MeasuredValueNormalizedWithCP56Time2a) CS101_ASDU_getElement(asdu2, 2);
  2044. MeasuredValueNormalizedWithCP56Time2a nmv4_dec = (MeasuredValueNormalizedWithCP56Time2a) CS101_ASDU_getElement(asdu2, 3);
  2045. MeasuredValueNormalizedWithCP56Time2a nmv5_dec = (MeasuredValueNormalizedWithCP56Time2a) CS101_ASDU_getElement(asdu2, 4);
  2046. MeasuredValueNormalizedWithCP56Time2a nmv6_dec = (MeasuredValueNormalizedWithCP56Time2a) CS101_ASDU_getElement(asdu2, 5);
  2047. MeasuredValueNormalizedWithCP56Time2a nmv7_dec = (MeasuredValueNormalizedWithCP56Time2a) CS101_ASDU_getElement(asdu2, 6);
  2048. MeasuredValueNormalizedWithCP56Time2a nmv8_dec = (MeasuredValueNormalizedWithCP56Time2a) CS101_ASDU_getElement(asdu2, 7);
  2049. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )nmv1_dec));
  2050. TEST_ASSERT_EQUAL_INT(102, InformationObject_getObjectAddress((InformationObject )nmv2_dec));
  2051. TEST_ASSERT_EQUAL_INT(103, InformationObject_getObjectAddress((InformationObject )nmv3_dec));
  2052. TEST_ASSERT_EQUAL_INT(104, InformationObject_getObjectAddress((InformationObject )nmv4_dec));
  2053. TEST_ASSERT_EQUAL_INT(105, InformationObject_getObjectAddress((InformationObject )nmv5_dec));
  2054. TEST_ASSERT_EQUAL_INT(106, InformationObject_getObjectAddress((InformationObject )nmv6_dec));
  2055. TEST_ASSERT_EQUAL_INT(107, InformationObject_getObjectAddress((InformationObject )nmv7_dec));
  2056. TEST_ASSERT_EQUAL_INT(108, InformationObject_getObjectAddress((InformationObject )nmv8_dec));
  2057. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv1_dec));
  2058. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv2_dec));
  2059. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv3_dec));
  2060. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv4_dec));
  2061. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv5_dec));
  2062. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv6_dec));
  2063. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv7_dec));
  2064. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, MeasuredValueNormalized_getQuality((MeasuredValueNormalized )nmv8_dec));
  2065. TEST_ASSERT_FLOAT_WITHIN(0.01f, -0.5f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv1_dec));
  2066. TEST_ASSERT_FLOAT_WITHIN(0.01f, -0.2f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv2_dec));
  2067. TEST_ASSERT_FLOAT_WITHIN(0.01f, -0.1f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv3_dec));
  2068. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv4_dec));
  2069. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.2f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv5_dec));
  2070. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.3f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv6_dec));
  2071. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.4f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv7_dec));
  2072. TEST_ASSERT_FLOAT_WITHIN(0.01f, 0.5f, MeasuredValueNormalized_getValue((MeasuredValueNormalized )nmv8_dec));
  2073. TEST_ASSERT_EQUAL_UINT64(time1, CP56Time2a_toMsTimestamp(MeasuredValueNormalizedWithCP56Time2a_getTimestamp(nmv1_dec)));
  2074. TEST_ASSERT_EQUAL_UINT64(time2, CP56Time2a_toMsTimestamp(MeasuredValueNormalizedWithCP56Time2a_getTimestamp(nmv2_dec)));
  2075. TEST_ASSERT_EQUAL_UINT64(time3, CP56Time2a_toMsTimestamp(MeasuredValueNormalizedWithCP56Time2a_getTimestamp(nmv3_dec)));
  2076. TEST_ASSERT_EQUAL_UINT64(time4, CP56Time2a_toMsTimestamp(MeasuredValueNormalizedWithCP56Time2a_getTimestamp(nmv4_dec)));
  2077. TEST_ASSERT_EQUAL_UINT64(time5, CP56Time2a_toMsTimestamp(MeasuredValueNormalizedWithCP56Time2a_getTimestamp(nmv5_dec)));
  2078. TEST_ASSERT_EQUAL_UINT64(time6, CP56Time2a_toMsTimestamp(MeasuredValueNormalizedWithCP56Time2a_getTimestamp(nmv6_dec)));
  2079. TEST_ASSERT_EQUAL_UINT64(time7, CP56Time2a_toMsTimestamp(MeasuredValueNormalizedWithCP56Time2a_getTimestamp(nmv7_dec)));
  2080. TEST_ASSERT_EQUAL_UINT64(time8, CP56Time2a_toMsTimestamp(MeasuredValueNormalizedWithCP56Time2a_getTimestamp(nmv8_dec)));
  2081. MeasuredValueNormalizedWithCP56Time2a_destroy(nmv1_dec);
  2082. MeasuredValueNormalizedWithCP56Time2a_destroy(nmv2_dec);
  2083. MeasuredValueNormalizedWithCP56Time2a_destroy(nmv3_dec);
  2084. MeasuredValueNormalizedWithCP56Time2a_destroy(nmv4_dec);
  2085. MeasuredValueNormalizedWithCP56Time2a_destroy(nmv5_dec);
  2086. MeasuredValueNormalizedWithCP56Time2a_destroy(nmv6_dec);
  2087. MeasuredValueNormalizedWithCP56Time2a_destroy(nmv7_dec);
  2088. MeasuredValueNormalizedWithCP56Time2a_destroy(nmv8_dec);
  2089. CS101_ASDU_destroy(asdu2);
  2090. }
  2091. void
  2092. test_MeasuredValueScaled(void)
  2093. {
  2094. MeasuredValueScaled mvs1;
  2095. MeasuredValueScaled mvs2;
  2096. MeasuredValueScaled mvs3;
  2097. MeasuredValueScaled mvs4;
  2098. MeasuredValueScaled mvs5;
  2099. MeasuredValueScaled mvs6;
  2100. MeasuredValueScaled mvs7;
  2101. MeasuredValueScaled mvs8;
  2102. mvs1 = MeasuredValueScaled_create(NULL, 101, INT16_MAX, IEC60870_QUALITY_GOOD);
  2103. mvs2 = MeasuredValueScaled_create(NULL, 102, INT16_MAX, IEC60870_QUALITY_OVERFLOW);
  2104. mvs3 = MeasuredValueScaled_create(NULL, 103, INT16_MAX, IEC60870_QUALITY_RESERVED);
  2105. mvs4 = MeasuredValueScaled_create(NULL, 104, INT16_MAX, IEC60870_QUALITY_ELAPSED_TIME_INVALID);
  2106. mvs5 = MeasuredValueScaled_create(NULL, 105, INT16_MIN, IEC60870_QUALITY_BLOCKED);
  2107. mvs6 = MeasuredValueScaled_create(NULL, 106, INT16_MIN, IEC60870_QUALITY_SUBSTITUTED);
  2108. mvs7 = MeasuredValueScaled_create(NULL, 107, INT16_MIN, IEC60870_QUALITY_NON_TOPICAL);
  2109. mvs8 = MeasuredValueScaled_create(NULL, 108, INT16_MIN, IEC60870_QUALITY_INVALID);
  2110. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs1));
  2111. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs2));
  2112. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs3));
  2113. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs4));
  2114. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs5));
  2115. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs6));
  2116. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs7));
  2117. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs8));
  2118. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs1));
  2119. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs2));
  2120. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs3));
  2121. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs4));
  2122. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs5));
  2123. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs6));
  2124. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs7));
  2125. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs8));
  2126. uint8_t buffer[256];
  2127. struct sBufferFrame bf;
  2128. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  2129. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  2130. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs1);
  2131. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs2);
  2132. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs3);
  2133. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs4);
  2134. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs5);
  2135. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs6);
  2136. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs7);
  2137. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs8);
  2138. MeasuredValueScaled_destroy(mvs1);
  2139. MeasuredValueScaled_destroy(mvs2);
  2140. MeasuredValueScaled_destroy(mvs3);
  2141. MeasuredValueScaled_destroy(mvs4);
  2142. MeasuredValueScaled_destroy(mvs5);
  2143. MeasuredValueScaled_destroy(mvs6);
  2144. MeasuredValueScaled_destroy(mvs7);
  2145. MeasuredValueScaled_destroy(mvs8);
  2146. CS101_ASDU_encode(asdu, f);
  2147. TEST_ASSERT_EQUAL_INT(54, Frame_getMsgSize(f));
  2148. CS101_ASDU_destroy(asdu);
  2149. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  2150. TEST_ASSERT_EQUAL_INT(8, CS101_ASDU_getNumberOfElements(asdu2));
  2151. MeasuredValueScaled mvs1_dec = (MeasuredValueScaled) CS101_ASDU_getElement(asdu2, 0);
  2152. MeasuredValueScaled mvs2_dec = (MeasuredValueScaled) CS101_ASDU_getElement(asdu2, 1);
  2153. MeasuredValueScaled mvs3_dec = (MeasuredValueScaled) CS101_ASDU_getElement(asdu2, 2);
  2154. MeasuredValueScaled mvs4_dec = (MeasuredValueScaled) CS101_ASDU_getElement(asdu2, 3);
  2155. MeasuredValueScaled mvs5_dec = (MeasuredValueScaled) CS101_ASDU_getElement(asdu2, 4);
  2156. MeasuredValueScaled mvs6_dec = (MeasuredValueScaled) CS101_ASDU_getElement(asdu2, 5);
  2157. MeasuredValueScaled mvs7_dec = (MeasuredValueScaled) CS101_ASDU_getElement(asdu2, 6);
  2158. MeasuredValueScaled mvs8_dec = (MeasuredValueScaled) CS101_ASDU_getElement(asdu2, 7);
  2159. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )mvs1_dec));
  2160. TEST_ASSERT_EQUAL_INT(102, InformationObject_getObjectAddress((InformationObject )mvs2_dec));
  2161. TEST_ASSERT_EQUAL_INT(103, InformationObject_getObjectAddress((InformationObject )mvs3_dec));
  2162. TEST_ASSERT_EQUAL_INT(104, InformationObject_getObjectAddress((InformationObject )mvs4_dec));
  2163. TEST_ASSERT_EQUAL_INT(105, InformationObject_getObjectAddress((InformationObject )mvs5_dec));
  2164. TEST_ASSERT_EQUAL_INT(106, InformationObject_getObjectAddress((InformationObject )mvs6_dec));
  2165. TEST_ASSERT_EQUAL_INT(107, InformationObject_getObjectAddress((InformationObject )mvs7_dec));
  2166. TEST_ASSERT_EQUAL_INT(108, InformationObject_getObjectAddress((InformationObject )mvs8_dec));
  2167. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs1_dec));
  2168. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs2_dec));
  2169. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs3_dec));
  2170. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs4_dec));
  2171. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs5_dec));
  2172. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs6_dec));
  2173. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs7_dec));
  2174. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs8_dec));
  2175. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs1_dec));
  2176. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs2_dec));
  2177. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs3_dec));
  2178. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs4_dec));
  2179. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs5_dec));
  2180. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs6_dec));
  2181. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs7_dec));
  2182. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs8_dec));
  2183. MeasuredValueScaled_destroy(mvs1_dec);
  2184. MeasuredValueScaled_destroy(mvs2_dec);
  2185. MeasuredValueScaled_destroy(mvs3_dec);
  2186. MeasuredValueScaled_destroy(mvs4_dec);
  2187. MeasuredValueScaled_destroy(mvs5_dec);
  2188. MeasuredValueScaled_destroy(mvs6_dec);
  2189. MeasuredValueScaled_destroy(mvs7_dec);
  2190. MeasuredValueScaled_destroy(mvs8_dec);
  2191. CS101_ASDU_destroy(asdu2);
  2192. }
  2193. void
  2194. test_MeasuredValueScaledWithCP24Time2a(void)
  2195. {
  2196. MeasuredValueScaledWithCP24Time2a mvs1;
  2197. MeasuredValueScaledWithCP24Time2a mvs2;
  2198. MeasuredValueScaledWithCP24Time2a mvs3;
  2199. MeasuredValueScaledWithCP24Time2a mvs4;
  2200. MeasuredValueScaledWithCP24Time2a mvs5;
  2201. MeasuredValueScaledWithCP24Time2a mvs6;
  2202. MeasuredValueScaledWithCP24Time2a mvs7;
  2203. MeasuredValueScaledWithCP24Time2a mvs8;
  2204. uint64_t time1 = Hal_getTimeInMs();
  2205. uint64_t time2 = time1 + 1000;
  2206. uint64_t time3 = time2 + 1000;
  2207. uint64_t time4 = time3 + 1000;
  2208. uint64_t time5 = time4 + 1000;
  2209. uint64_t time6 = time5 + 1000;
  2210. uint64_t time7 = time6 + 1000;
  2211. uint64_t time8 = time7 + 1000;
  2212. struct sCP24Time2a cpTime1;
  2213. struct sCP24Time2a cpTime2;
  2214. struct sCP24Time2a cpTime3;
  2215. struct sCP24Time2a cpTime4;
  2216. struct sCP24Time2a cpTime5;
  2217. struct sCP24Time2a cpTime6;
  2218. struct sCP24Time2a cpTime7;
  2219. struct sCP24Time2a cpTime8;
  2220. bzero(&cpTime1, sizeof(struct sCP24Time2a));
  2221. bzero(&cpTime2, sizeof(struct sCP24Time2a));
  2222. bzero(&cpTime3, sizeof(struct sCP24Time2a));
  2223. bzero(&cpTime4, sizeof(struct sCP24Time2a));
  2224. bzero(&cpTime5, sizeof(struct sCP24Time2a));
  2225. bzero(&cpTime6, sizeof(struct sCP24Time2a));
  2226. bzero(&cpTime7, sizeof(struct sCP24Time2a));
  2227. bzero(&cpTime8, sizeof(struct sCP24Time2a));
  2228. CP24Time2a_setMinute(&cpTime1, 12);
  2229. CP24Time2a_setMillisecond(&cpTime1, 24123);
  2230. CP24Time2a_setMinute(&cpTime2, 54);
  2231. CP24Time2a_setMillisecond(&cpTime2, 12345);
  2232. CP24Time2a_setMinute(&cpTime3, 00);
  2233. CP24Time2a_setMillisecond(&cpTime3, 00001);
  2234. CP24Time2a_setMinute(&cpTime4, 12);
  2235. CP24Time2a_setMillisecond(&cpTime4, 24123);
  2236. CP24Time2a_setMinute(&cpTime5, 12);
  2237. CP24Time2a_setMillisecond(&cpTime5, 24123);
  2238. CP24Time2a_setMinute(&cpTime6, 12);
  2239. CP24Time2a_setMillisecond(&cpTime6, 24123);
  2240. CP24Time2a_setMinute(&cpTime7, 12);
  2241. CP24Time2a_setMillisecond(&cpTime7, 24123);
  2242. CP24Time2a_setMinute(&cpTime8, 12);
  2243. CP24Time2a_setMillisecond(&cpTime8, 24123);
  2244. mvs1 = MeasuredValueScaledWithCP24Time2a_create(NULL, 101, INT16_MAX, IEC60870_QUALITY_GOOD, &cpTime1);
  2245. mvs2 = MeasuredValueScaledWithCP24Time2a_create(NULL, 102, INT16_MAX, IEC60870_QUALITY_OVERFLOW, &cpTime2);
  2246. mvs3 = MeasuredValueScaledWithCP24Time2a_create(NULL, 103, INT16_MAX, IEC60870_QUALITY_RESERVED, &cpTime3);
  2247. mvs4 = MeasuredValueScaledWithCP24Time2a_create(NULL, 104, INT16_MAX, IEC60870_QUALITY_ELAPSED_TIME_INVALID, &cpTime4);
  2248. mvs5 = MeasuredValueScaledWithCP24Time2a_create(NULL, 105, INT16_MIN, IEC60870_QUALITY_BLOCKED, &cpTime5);
  2249. mvs6 = MeasuredValueScaledWithCP24Time2a_create(NULL, 106, INT16_MIN, IEC60870_QUALITY_SUBSTITUTED, &cpTime6);
  2250. mvs7 = MeasuredValueScaledWithCP24Time2a_create(NULL, 107, INT16_MIN, IEC60870_QUALITY_NON_TOPICAL, &cpTime7);
  2251. mvs8 = MeasuredValueScaledWithCP24Time2a_create(NULL, 108, INT16_MIN, IEC60870_QUALITY_INVALID, &cpTime8);
  2252. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs1));
  2253. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs2));
  2254. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs3));
  2255. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs4));
  2256. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs5));
  2257. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs6));
  2258. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs7));
  2259. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs8));
  2260. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs1));
  2261. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs2));
  2262. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs3));
  2263. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs4));
  2264. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs5));
  2265. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs6));
  2266. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs7));
  2267. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs8));
  2268. uint8_t buffer[256];
  2269. struct sBufferFrame bf;
  2270. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  2271. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  2272. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs1);
  2273. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs2);
  2274. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs3);
  2275. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs4);
  2276. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs5);
  2277. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs6);
  2278. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs7);
  2279. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs8);
  2280. MeasuredValueScaledWithCP24Time2a_destroy(mvs1);
  2281. MeasuredValueScaledWithCP24Time2a_destroy(mvs2);
  2282. MeasuredValueScaledWithCP24Time2a_destroy(mvs3);
  2283. MeasuredValueScaledWithCP24Time2a_destroy(mvs4);
  2284. MeasuredValueScaledWithCP24Time2a_destroy(mvs5);
  2285. MeasuredValueScaledWithCP24Time2a_destroy(mvs6);
  2286. MeasuredValueScaledWithCP24Time2a_destroy(mvs7);
  2287. MeasuredValueScaledWithCP24Time2a_destroy(mvs8);
  2288. CS101_ASDU_encode(asdu, f);
  2289. TEST_ASSERT_EQUAL_INT(78, Frame_getMsgSize(f));
  2290. CS101_ASDU_destroy(asdu);
  2291. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  2292. TEST_ASSERT_EQUAL_INT(8, CS101_ASDU_getNumberOfElements(asdu2));
  2293. MeasuredValueScaledWithCP24Time2a mvs1_dec = (MeasuredValueScaledWithCP24Time2a) CS101_ASDU_getElement(asdu2, 0);
  2294. MeasuredValueScaledWithCP24Time2a mvs2_dec = (MeasuredValueScaledWithCP24Time2a) CS101_ASDU_getElement(asdu2, 1);
  2295. MeasuredValueScaledWithCP24Time2a mvs3_dec = (MeasuredValueScaledWithCP24Time2a) CS101_ASDU_getElement(asdu2, 2);
  2296. MeasuredValueScaledWithCP24Time2a mvs4_dec = (MeasuredValueScaledWithCP24Time2a) CS101_ASDU_getElement(asdu2, 3);
  2297. MeasuredValueScaledWithCP24Time2a mvs5_dec = (MeasuredValueScaledWithCP24Time2a) CS101_ASDU_getElement(asdu2, 4);
  2298. MeasuredValueScaledWithCP24Time2a mvs6_dec = (MeasuredValueScaledWithCP24Time2a) CS101_ASDU_getElement(asdu2, 5);
  2299. MeasuredValueScaledWithCP24Time2a mvs7_dec = (MeasuredValueScaledWithCP24Time2a) CS101_ASDU_getElement(asdu2, 6);
  2300. MeasuredValueScaledWithCP24Time2a mvs8_dec = (MeasuredValueScaledWithCP24Time2a) CS101_ASDU_getElement(asdu2, 7);
  2301. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )mvs1_dec));
  2302. TEST_ASSERT_EQUAL_INT(102, InformationObject_getObjectAddress((InformationObject )mvs2_dec));
  2303. TEST_ASSERT_EQUAL_INT(103, InformationObject_getObjectAddress((InformationObject )mvs3_dec));
  2304. TEST_ASSERT_EQUAL_INT(104, InformationObject_getObjectAddress((InformationObject )mvs4_dec));
  2305. TEST_ASSERT_EQUAL_INT(105, InformationObject_getObjectAddress((InformationObject )mvs5_dec));
  2306. TEST_ASSERT_EQUAL_INT(106, InformationObject_getObjectAddress((InformationObject )mvs6_dec));
  2307. TEST_ASSERT_EQUAL_INT(107, InformationObject_getObjectAddress((InformationObject )mvs7_dec));
  2308. TEST_ASSERT_EQUAL_INT(108, InformationObject_getObjectAddress((InformationObject )mvs8_dec));
  2309. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs1_dec));
  2310. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs2_dec));
  2311. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs3_dec));
  2312. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs4_dec));
  2313. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs5_dec));
  2314. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs6_dec));
  2315. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs7_dec));
  2316. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs8_dec));
  2317. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs1_dec));
  2318. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs2_dec));
  2319. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs3_dec));
  2320. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs4_dec));
  2321. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs5_dec));
  2322. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs6_dec));
  2323. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs7_dec));
  2324. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs8_dec));
  2325. CP24Time2a time1_dec = MeasuredValueScaledWithCP24Time2a_getTimestamp(mvs1_dec);
  2326. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time1_dec));
  2327. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time1_dec));
  2328. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time1_dec));
  2329. CP24Time2a time2_dec = MeasuredValueScaledWithCP24Time2a_getTimestamp(mvs2_dec);
  2330. TEST_ASSERT_EQUAL_INT(54, CP24Time2a_getMinute(time2_dec));
  2331. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getSecond(time2_dec));
  2332. TEST_ASSERT_EQUAL_INT(345, CP24Time2a_getMillisecond(time2_dec));
  2333. CP24Time2a time3_dec = MeasuredValueScaledWithCP24Time2a_getTimestamp(mvs3_dec);
  2334. TEST_ASSERT_EQUAL_INT(00, CP24Time2a_getMinute(time3_dec));
  2335. TEST_ASSERT_EQUAL_INT(00, CP24Time2a_getSecond(time3_dec));
  2336. TEST_ASSERT_EQUAL_INT(1, CP24Time2a_getMillisecond(time3_dec));
  2337. CP24Time2a time4_dec = MeasuredValueScaledWithCP24Time2a_getTimestamp(mvs4_dec);
  2338. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time4_dec));
  2339. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time4_dec));
  2340. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time4_dec));
  2341. CP24Time2a time5_dec = MeasuredValueScaledWithCP24Time2a_getTimestamp(mvs5_dec);
  2342. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time5_dec));
  2343. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time5_dec));
  2344. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time5_dec));
  2345. CP24Time2a time6_dec = MeasuredValueScaledWithCP24Time2a_getTimestamp(mvs6_dec);
  2346. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time6_dec));
  2347. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time6_dec));
  2348. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time6_dec));
  2349. CP24Time2a time7_dec = MeasuredValueScaledWithCP24Time2a_getTimestamp(mvs7_dec);
  2350. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time7_dec));
  2351. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time7_dec));
  2352. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time7_dec));
  2353. CP24Time2a time8_dec = MeasuredValueScaledWithCP24Time2a_getTimestamp(mvs8_dec);
  2354. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time8_dec));
  2355. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time8_dec));
  2356. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time8_dec));
  2357. MeasuredValueScaledWithCP24Time2a_destroy(mvs1_dec);
  2358. MeasuredValueScaledWithCP24Time2a_destroy(mvs2_dec);
  2359. MeasuredValueScaledWithCP24Time2a_destroy(mvs3_dec);
  2360. MeasuredValueScaledWithCP24Time2a_destroy(mvs4_dec);
  2361. MeasuredValueScaledWithCP24Time2a_destroy(mvs5_dec);
  2362. MeasuredValueScaledWithCP24Time2a_destroy(mvs6_dec);
  2363. MeasuredValueScaledWithCP24Time2a_destroy(mvs7_dec);
  2364. MeasuredValueScaledWithCP24Time2a_destroy(mvs8_dec);
  2365. CS101_ASDU_destroy(asdu2);
  2366. }
  2367. void
  2368. test_MeasuredValueScaledWithCP56Time2a(void)
  2369. {
  2370. MeasuredValueScaledWithCP56Time2a mvs1;
  2371. MeasuredValueScaledWithCP56Time2a mvs2;
  2372. MeasuredValueScaledWithCP56Time2a mvs3;
  2373. MeasuredValueScaledWithCP56Time2a mvs4;
  2374. MeasuredValueScaledWithCP56Time2a mvs5;
  2375. MeasuredValueScaledWithCP56Time2a mvs6;
  2376. MeasuredValueScaledWithCP56Time2a mvs7;
  2377. MeasuredValueScaledWithCP56Time2a mvs8;
  2378. uint64_t time1 = Hal_getTimeInMs();
  2379. uint64_t time2 = time1 + 1000;
  2380. uint64_t time3 = time2 + 1000;
  2381. uint64_t time4 = time3 + 1000;
  2382. uint64_t time5 = time4 + 1000;
  2383. uint64_t time6 = time5 + 1000;
  2384. uint64_t time7 = time6 + 1000;
  2385. uint64_t time8 = time7 + 1000;
  2386. struct sCP56Time2a cpTime1;
  2387. struct sCP56Time2a cpTime2;
  2388. struct sCP56Time2a cpTime3;
  2389. struct sCP56Time2a cpTime4;
  2390. struct sCP56Time2a cpTime5;
  2391. struct sCP56Time2a cpTime6;
  2392. struct sCP56Time2a cpTime7;
  2393. struct sCP56Time2a cpTime8;
  2394. CP56Time2a_createFromMsTimestamp(&cpTime1, time1);
  2395. CP56Time2a_createFromMsTimestamp(&cpTime2, time2);
  2396. CP56Time2a_createFromMsTimestamp(&cpTime3, time3);
  2397. CP56Time2a_createFromMsTimestamp(&cpTime4, time4);
  2398. CP56Time2a_createFromMsTimestamp(&cpTime5, time5);
  2399. CP56Time2a_createFromMsTimestamp(&cpTime6, time6);
  2400. CP56Time2a_createFromMsTimestamp(&cpTime7, time7);
  2401. CP56Time2a_createFromMsTimestamp(&cpTime8, time8);
  2402. mvs1 = MeasuredValueScaledWithCP56Time2a_create(NULL, 101, INT16_MAX, IEC60870_QUALITY_GOOD, &cpTime1);
  2403. mvs2 = MeasuredValueScaledWithCP56Time2a_create(NULL, 102, INT16_MAX, IEC60870_QUALITY_OVERFLOW, &cpTime2);
  2404. mvs3 = MeasuredValueScaledWithCP56Time2a_create(NULL, 103, INT16_MAX, IEC60870_QUALITY_RESERVED, &cpTime3);
  2405. mvs4 = MeasuredValueScaledWithCP56Time2a_create(NULL, 104, INT16_MAX, IEC60870_QUALITY_ELAPSED_TIME_INVALID, &cpTime4);
  2406. mvs5 = MeasuredValueScaledWithCP56Time2a_create(NULL, 105, INT16_MIN, IEC60870_QUALITY_BLOCKED, &cpTime5);
  2407. mvs6 = MeasuredValueScaledWithCP56Time2a_create(NULL, 106, INT16_MIN, IEC60870_QUALITY_SUBSTITUTED, &cpTime6);
  2408. mvs7 = MeasuredValueScaledWithCP56Time2a_create(NULL, 107, INT16_MIN, IEC60870_QUALITY_NON_TOPICAL, &cpTime7);
  2409. mvs8 = MeasuredValueScaledWithCP56Time2a_create(NULL, 108, INT16_MIN, IEC60870_QUALITY_INVALID, &cpTime8);
  2410. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs1));
  2411. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs2));
  2412. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs3));
  2413. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs4));
  2414. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs5));
  2415. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs6));
  2416. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs7));
  2417. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs8));
  2418. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs1));
  2419. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs2));
  2420. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs3));
  2421. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs4));
  2422. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs5));
  2423. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs6));
  2424. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs7));
  2425. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs8));
  2426. uint8_t buffer[256];
  2427. struct sBufferFrame bf;
  2428. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  2429. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  2430. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs1);
  2431. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs2);
  2432. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs3);
  2433. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs4);
  2434. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs5);
  2435. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs6);
  2436. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs7);
  2437. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs8);
  2438. MeasuredValueScaledWithCP56Time2a_destroy(mvs1);
  2439. MeasuredValueScaledWithCP56Time2a_destroy(mvs2);
  2440. MeasuredValueScaledWithCP56Time2a_destroy(mvs3);
  2441. MeasuredValueScaledWithCP56Time2a_destroy(mvs4);
  2442. MeasuredValueScaledWithCP56Time2a_destroy(mvs5);
  2443. MeasuredValueScaledWithCP56Time2a_destroy(mvs6);
  2444. MeasuredValueScaledWithCP56Time2a_destroy(mvs7);
  2445. MeasuredValueScaledWithCP56Time2a_destroy(mvs8);
  2446. CS101_ASDU_encode(asdu, f);
  2447. TEST_ASSERT_EQUAL_INT(110, Frame_getMsgSize(f));
  2448. CS101_ASDU_destroy(asdu);
  2449. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  2450. TEST_ASSERT_EQUAL_INT(8, CS101_ASDU_getNumberOfElements(asdu2));
  2451. MeasuredValueScaledWithCP56Time2a mvs1_dec = (MeasuredValueScaledWithCP56Time2a) CS101_ASDU_getElement(asdu2, 0);
  2452. MeasuredValueScaledWithCP56Time2a mvs2_dec = (MeasuredValueScaledWithCP56Time2a) CS101_ASDU_getElement(asdu2, 1);
  2453. MeasuredValueScaledWithCP56Time2a mvs3_dec = (MeasuredValueScaledWithCP56Time2a) CS101_ASDU_getElement(asdu2, 2);
  2454. MeasuredValueScaledWithCP56Time2a mvs4_dec = (MeasuredValueScaledWithCP56Time2a) CS101_ASDU_getElement(asdu2, 3);
  2455. MeasuredValueScaledWithCP56Time2a mvs5_dec = (MeasuredValueScaledWithCP56Time2a) CS101_ASDU_getElement(asdu2, 4);
  2456. MeasuredValueScaledWithCP56Time2a mvs6_dec = (MeasuredValueScaledWithCP56Time2a) CS101_ASDU_getElement(asdu2, 5);
  2457. MeasuredValueScaledWithCP56Time2a mvs7_dec = (MeasuredValueScaledWithCP56Time2a) CS101_ASDU_getElement(asdu2, 6);
  2458. MeasuredValueScaledWithCP56Time2a mvs8_dec = (MeasuredValueScaledWithCP56Time2a) CS101_ASDU_getElement(asdu2, 7);
  2459. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )mvs1_dec));
  2460. TEST_ASSERT_EQUAL_INT(102, InformationObject_getObjectAddress((InformationObject )mvs2_dec));
  2461. TEST_ASSERT_EQUAL_INT(103, InformationObject_getObjectAddress((InformationObject )mvs3_dec));
  2462. TEST_ASSERT_EQUAL_INT(104, InformationObject_getObjectAddress((InformationObject )mvs4_dec));
  2463. TEST_ASSERT_EQUAL_INT(105, InformationObject_getObjectAddress((InformationObject )mvs5_dec));
  2464. TEST_ASSERT_EQUAL_INT(106, InformationObject_getObjectAddress((InformationObject )mvs6_dec));
  2465. TEST_ASSERT_EQUAL_INT(107, InformationObject_getObjectAddress((InformationObject )mvs7_dec));
  2466. TEST_ASSERT_EQUAL_INT(108, InformationObject_getObjectAddress((InformationObject )mvs8_dec));
  2467. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs1_dec));
  2468. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs2_dec));
  2469. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs3_dec));
  2470. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs4_dec));
  2471. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs5_dec));
  2472. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs6_dec));
  2473. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs7_dec));
  2474. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, MeasuredValueScaled_getQuality((MeasuredValueScaled )mvs8_dec));
  2475. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs1_dec));
  2476. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs2_dec));
  2477. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs3_dec));
  2478. TEST_ASSERT_EQUAL_INT(INT16_MAX, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs4_dec));
  2479. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs5_dec));
  2480. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs6_dec));
  2481. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs7_dec));
  2482. TEST_ASSERT_EQUAL_INT(INT16_MIN, MeasuredValueScaled_getValue((MeasuredValueScaled )mvs8_dec));
  2483. TEST_ASSERT_EQUAL_UINT64(time1, CP56Time2a_toMsTimestamp(MeasuredValueScaledWithCP56Time2a_getTimestamp(mvs1_dec)));
  2484. TEST_ASSERT_EQUAL_UINT64(time2, CP56Time2a_toMsTimestamp(MeasuredValueScaledWithCP56Time2a_getTimestamp(mvs2_dec)));
  2485. TEST_ASSERT_EQUAL_UINT64(time3, CP56Time2a_toMsTimestamp(MeasuredValueScaledWithCP56Time2a_getTimestamp(mvs3_dec)));
  2486. TEST_ASSERT_EQUAL_UINT64(time4, CP56Time2a_toMsTimestamp(MeasuredValueScaledWithCP56Time2a_getTimestamp(mvs4_dec)));
  2487. TEST_ASSERT_EQUAL_UINT64(time5, CP56Time2a_toMsTimestamp(MeasuredValueScaledWithCP56Time2a_getTimestamp(mvs5_dec)));
  2488. TEST_ASSERT_EQUAL_UINT64(time6, CP56Time2a_toMsTimestamp(MeasuredValueScaledWithCP56Time2a_getTimestamp(mvs6_dec)));
  2489. TEST_ASSERT_EQUAL_UINT64(time7, CP56Time2a_toMsTimestamp(MeasuredValueScaledWithCP56Time2a_getTimestamp(mvs7_dec)));
  2490. TEST_ASSERT_EQUAL_UINT64(time8, CP56Time2a_toMsTimestamp(MeasuredValueScaledWithCP56Time2a_getTimestamp(mvs8_dec)));
  2491. MeasuredValueScaledWithCP56Time2a_destroy(mvs1_dec);
  2492. MeasuredValueScaledWithCP56Time2a_destroy(mvs2_dec);
  2493. MeasuredValueScaledWithCP56Time2a_destroy(mvs3_dec);
  2494. MeasuredValueScaledWithCP56Time2a_destroy(mvs4_dec);
  2495. MeasuredValueScaledWithCP56Time2a_destroy(mvs5_dec);
  2496. MeasuredValueScaledWithCP56Time2a_destroy(mvs6_dec);
  2497. MeasuredValueScaledWithCP56Time2a_destroy(mvs7_dec);
  2498. MeasuredValueScaledWithCP56Time2a_destroy(mvs8_dec);
  2499. CS101_ASDU_destroy(asdu2);
  2500. }
  2501. void
  2502. test_MeasuredValueShort(void)
  2503. {
  2504. MeasuredValueShort mvs1;
  2505. MeasuredValueShort mvs2;
  2506. MeasuredValueShort mvs3;
  2507. MeasuredValueShort mvs4;
  2508. MeasuredValueShort mvs5;
  2509. MeasuredValueShort mvs6;
  2510. MeasuredValueShort mvs7;
  2511. MeasuredValueShort mvs8;
  2512. mvs1 = MeasuredValueShort_create(NULL, 101, 10.5f, IEC60870_QUALITY_GOOD);
  2513. mvs2 = MeasuredValueShort_create(NULL, 102, 11.5f, IEC60870_QUALITY_OVERFLOW);
  2514. mvs3 = MeasuredValueShort_create(NULL, 103, 12.5f, IEC60870_QUALITY_RESERVED);
  2515. mvs4 = MeasuredValueShort_create(NULL, 104, 13.5f, IEC60870_QUALITY_ELAPSED_TIME_INVALID);
  2516. mvs5 = MeasuredValueShort_create(NULL, 105, 14.5f, IEC60870_QUALITY_BLOCKED);
  2517. mvs6 = MeasuredValueShort_create(NULL, 106, 15.5f, IEC60870_QUALITY_SUBSTITUTED);
  2518. mvs7 = MeasuredValueShort_create(NULL, 107, 16.5f, IEC60870_QUALITY_NON_TOPICAL);
  2519. mvs8 = MeasuredValueShort_create(NULL, 108, 17.5f, IEC60870_QUALITY_INVALID);
  2520. TEST_ASSERT_EQUAL_FLOAT(10.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs1));
  2521. TEST_ASSERT_EQUAL_FLOAT(11.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs2));
  2522. TEST_ASSERT_EQUAL_FLOAT(12.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs3));
  2523. TEST_ASSERT_EQUAL_FLOAT(13.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs4));
  2524. TEST_ASSERT_EQUAL_FLOAT(14.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs5));
  2525. TEST_ASSERT_EQUAL_FLOAT(15.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs6));
  2526. TEST_ASSERT_EQUAL_FLOAT(16.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs7));
  2527. TEST_ASSERT_EQUAL_FLOAT(17.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs8));
  2528. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, MeasuredValueShort_getQuality(mvs1));
  2529. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, MeasuredValueShort_getQuality(mvs2));
  2530. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, MeasuredValueShort_getQuality(mvs3));
  2531. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, MeasuredValueShort_getQuality(mvs4));
  2532. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, MeasuredValueShort_getQuality(mvs5));
  2533. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, MeasuredValueShort_getQuality(mvs6));
  2534. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, MeasuredValueShort_getQuality(mvs7));
  2535. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, MeasuredValueShort_getQuality(mvs8));
  2536. uint8_t buffer[256];
  2537. struct sBufferFrame bf;
  2538. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  2539. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  2540. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs1);
  2541. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs2);
  2542. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs3);
  2543. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs4);
  2544. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs5);
  2545. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs6);
  2546. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs7);
  2547. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs8);
  2548. MeasuredValueShort_destroy(mvs1);
  2549. MeasuredValueShort_destroy(mvs2);
  2550. MeasuredValueShort_destroy(mvs3);
  2551. MeasuredValueShort_destroy(mvs4);
  2552. MeasuredValueShort_destroy(mvs5);
  2553. MeasuredValueShort_destroy(mvs6);
  2554. MeasuredValueShort_destroy(mvs7);
  2555. MeasuredValueShort_destroy(mvs8);
  2556. CS101_ASDU_encode(asdu, f);
  2557. TEST_ASSERT_EQUAL_INT(70, Frame_getMsgSize(f));
  2558. CS101_ASDU_destroy(asdu);
  2559. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  2560. TEST_ASSERT_EQUAL_INT(8, CS101_ASDU_getNumberOfElements(asdu2));
  2561. MeasuredValueShort mvs1_dec = (MeasuredValueShort) CS101_ASDU_getElement(asdu2, 0);
  2562. MeasuredValueShort mvs2_dec = (MeasuredValueShort) CS101_ASDU_getElement(asdu2, 1);
  2563. MeasuredValueShort mvs3_dec = (MeasuredValueShort) CS101_ASDU_getElement(asdu2, 2);
  2564. MeasuredValueShort mvs4_dec = (MeasuredValueShort) CS101_ASDU_getElement(asdu2, 3);
  2565. MeasuredValueShort mvs5_dec = (MeasuredValueShort) CS101_ASDU_getElement(asdu2, 4);
  2566. MeasuredValueShort mvs6_dec = (MeasuredValueShort) CS101_ASDU_getElement(asdu2, 5);
  2567. MeasuredValueShort mvs7_dec = (MeasuredValueShort) CS101_ASDU_getElement(asdu2, 6);
  2568. MeasuredValueShort mvs8_dec = (MeasuredValueShort) CS101_ASDU_getElement(asdu2, 7);
  2569. TEST_ASSERT_EQUAL_FLOAT(10.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs1_dec));
  2570. TEST_ASSERT_EQUAL_FLOAT(11.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs2_dec));
  2571. TEST_ASSERT_EQUAL_FLOAT(12.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs3_dec));
  2572. TEST_ASSERT_EQUAL_FLOAT(13.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs4_dec));
  2573. TEST_ASSERT_EQUAL_FLOAT(14.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs5_dec));
  2574. TEST_ASSERT_EQUAL_FLOAT(15.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs6_dec));
  2575. TEST_ASSERT_EQUAL_FLOAT(16.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs7_dec));
  2576. TEST_ASSERT_EQUAL_FLOAT(17.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs8_dec));
  2577. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, MeasuredValueShort_getQuality(mvs1_dec));
  2578. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, MeasuredValueShort_getQuality(mvs2_dec));
  2579. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, MeasuredValueShort_getQuality(mvs3_dec));
  2580. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, MeasuredValueShort_getQuality(mvs4_dec));
  2581. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, MeasuredValueShort_getQuality(mvs5_dec));
  2582. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, MeasuredValueShort_getQuality(mvs6_dec));
  2583. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, MeasuredValueShort_getQuality(mvs7_dec));
  2584. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, MeasuredValueShort_getQuality(mvs8_dec));
  2585. MeasuredValueShort_destroy(mvs1_dec);
  2586. MeasuredValueShort_destroy(mvs2_dec);
  2587. MeasuredValueShort_destroy(mvs3_dec);
  2588. MeasuredValueShort_destroy(mvs4_dec);
  2589. MeasuredValueShort_destroy(mvs5_dec);
  2590. MeasuredValueShort_destroy(mvs6_dec);
  2591. MeasuredValueShort_destroy(mvs7_dec);
  2592. MeasuredValueShort_destroy(mvs8_dec);
  2593. CS101_ASDU_destroy(asdu2);
  2594. }
  2595. void
  2596. test_MeasuredValueShortWithCP24Time2a(void)
  2597. {
  2598. MeasuredValueShortWithCP24Time2a mvs1;
  2599. MeasuredValueShortWithCP24Time2a mvs2;
  2600. MeasuredValueShortWithCP24Time2a mvs3;
  2601. MeasuredValueShortWithCP24Time2a mvs4;
  2602. MeasuredValueShortWithCP24Time2a mvs5;
  2603. MeasuredValueShortWithCP24Time2a mvs6;
  2604. MeasuredValueShortWithCP24Time2a mvs7;
  2605. MeasuredValueShortWithCP24Time2a mvs8;
  2606. uint64_t time1 = Hal_getTimeInMs();
  2607. uint64_t time2 = time1 + 1000;
  2608. uint64_t time3 = time2 + 1000;
  2609. uint64_t time4 = time3 + 1000;
  2610. uint64_t time5 = time4 + 1000;
  2611. uint64_t time6 = time5 + 1000;
  2612. uint64_t time7 = time6 + 1000;
  2613. uint64_t time8 = time7 + 1000;
  2614. struct sCP24Time2a cpTime1;
  2615. struct sCP24Time2a cpTime2;
  2616. struct sCP24Time2a cpTime3;
  2617. struct sCP24Time2a cpTime4;
  2618. struct sCP24Time2a cpTime5;
  2619. struct sCP24Time2a cpTime6;
  2620. struct sCP24Time2a cpTime7;
  2621. struct sCP24Time2a cpTime8;
  2622. bzero(&cpTime1, sizeof(struct sCP24Time2a));
  2623. bzero(&cpTime2, sizeof(struct sCP24Time2a));
  2624. bzero(&cpTime3, sizeof(struct sCP24Time2a));
  2625. bzero(&cpTime4, sizeof(struct sCP24Time2a));
  2626. bzero(&cpTime5, sizeof(struct sCP24Time2a));
  2627. bzero(&cpTime6, sizeof(struct sCP24Time2a));
  2628. bzero(&cpTime7, sizeof(struct sCP24Time2a));
  2629. bzero(&cpTime8, sizeof(struct sCP24Time2a));
  2630. CP24Time2a_setMinute(&cpTime1, 12);
  2631. CP24Time2a_setMillisecond(&cpTime1, 24123);
  2632. CP24Time2a_setMinute(&cpTime2, 54);
  2633. CP24Time2a_setMillisecond(&cpTime2, 12345);
  2634. CP24Time2a_setMinute(&cpTime3, 00);
  2635. CP24Time2a_setMillisecond(&cpTime3, 00001);
  2636. CP24Time2a_setMinute(&cpTime4, 12);
  2637. CP24Time2a_setMillisecond(&cpTime4, 24123);
  2638. CP24Time2a_setMinute(&cpTime5, 12);
  2639. CP24Time2a_setMillisecond(&cpTime5, 24123);
  2640. CP24Time2a_setMinute(&cpTime6, 12);
  2641. CP24Time2a_setMillisecond(&cpTime6, 24123);
  2642. CP24Time2a_setMinute(&cpTime7, 12);
  2643. CP24Time2a_setMillisecond(&cpTime7, 24123);
  2644. CP24Time2a_setMinute(&cpTime8, 12);
  2645. CP24Time2a_setMillisecond(&cpTime8, 24123);
  2646. mvs1 = MeasuredValueShortWithCP24Time2a_create(NULL, 101, 10.5f, IEC60870_QUALITY_GOOD, &cpTime1);
  2647. mvs2 = MeasuredValueShortWithCP24Time2a_create(NULL, 102, 11.5f, IEC60870_QUALITY_OVERFLOW, &cpTime2);
  2648. mvs3 = MeasuredValueShortWithCP24Time2a_create(NULL, 103, 12.5f, IEC60870_QUALITY_RESERVED, &cpTime3);
  2649. mvs4 = MeasuredValueShortWithCP24Time2a_create(NULL, 104, 13.5f, IEC60870_QUALITY_ELAPSED_TIME_INVALID, &cpTime4);
  2650. mvs5 = MeasuredValueShortWithCP24Time2a_create(NULL, 105, 14.5f, IEC60870_QUALITY_BLOCKED, &cpTime5);
  2651. mvs6 = MeasuredValueShortWithCP24Time2a_create(NULL, 106, 15.5f, IEC60870_QUALITY_SUBSTITUTED, &cpTime6);
  2652. mvs7 = MeasuredValueShortWithCP24Time2a_create(NULL, 107, 16.5f, IEC60870_QUALITY_NON_TOPICAL, &cpTime7);
  2653. mvs8 = MeasuredValueShortWithCP24Time2a_create(NULL, 108, 17.5f, IEC60870_QUALITY_INVALID, &cpTime8);
  2654. TEST_ASSERT_EQUAL_FLOAT(10.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs1));
  2655. TEST_ASSERT_EQUAL_FLOAT(11.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs2));
  2656. TEST_ASSERT_EQUAL_FLOAT(12.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs3));
  2657. TEST_ASSERT_EQUAL_FLOAT(13.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs4));
  2658. TEST_ASSERT_EQUAL_FLOAT(14.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs5));
  2659. TEST_ASSERT_EQUAL_FLOAT(15.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs6));
  2660. TEST_ASSERT_EQUAL_FLOAT(16.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs7));
  2661. TEST_ASSERT_EQUAL_FLOAT(17.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs8));
  2662. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, MeasuredValueShort_getQuality((MeasuredValueShort )mvs1));
  2663. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, MeasuredValueShort_getQuality((MeasuredValueShort )mvs2));
  2664. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, MeasuredValueShort_getQuality((MeasuredValueShort )mvs3));
  2665. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, MeasuredValueShort_getQuality((MeasuredValueShort )mvs4));
  2666. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, MeasuredValueShort_getQuality((MeasuredValueShort )mvs5));
  2667. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, MeasuredValueShort_getQuality((MeasuredValueShort )mvs6));
  2668. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, MeasuredValueShort_getQuality((MeasuredValueShort )mvs7));
  2669. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, MeasuredValueShort_getQuality((MeasuredValueShort )mvs8));
  2670. uint8_t buffer[256];
  2671. struct sBufferFrame bf;
  2672. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  2673. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  2674. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs1);
  2675. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs2);
  2676. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs3);
  2677. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs4);
  2678. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs5);
  2679. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs6);
  2680. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs7);
  2681. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs8);
  2682. MeasuredValueShortWithCP24Time2a_destroy(mvs1);
  2683. MeasuredValueShortWithCP24Time2a_destroy(mvs2);
  2684. MeasuredValueShortWithCP24Time2a_destroy(mvs3);
  2685. MeasuredValueShortWithCP24Time2a_destroy(mvs4);
  2686. MeasuredValueShortWithCP24Time2a_destroy(mvs5);
  2687. MeasuredValueShortWithCP24Time2a_destroy(mvs6);
  2688. MeasuredValueShortWithCP24Time2a_destroy(mvs7);
  2689. MeasuredValueShortWithCP24Time2a_destroy(mvs8);
  2690. CS101_ASDU_encode(asdu, f);
  2691. TEST_ASSERT_EQUAL_INT(94, Frame_getMsgSize(f));
  2692. CS101_ASDU_destroy(asdu);
  2693. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  2694. TEST_ASSERT_EQUAL_INT(8, CS101_ASDU_getNumberOfElements(asdu2));
  2695. MeasuredValueShortWithCP24Time2a mvs1_dec = (MeasuredValueShortWithCP24Time2a) CS101_ASDU_getElement(asdu2, 0);
  2696. MeasuredValueShortWithCP24Time2a mvs2_dec = (MeasuredValueShortWithCP24Time2a) CS101_ASDU_getElement(asdu2, 1);
  2697. MeasuredValueShortWithCP24Time2a mvs3_dec = (MeasuredValueShortWithCP24Time2a) CS101_ASDU_getElement(asdu2, 2);
  2698. MeasuredValueShortWithCP24Time2a mvs4_dec = (MeasuredValueShortWithCP24Time2a) CS101_ASDU_getElement(asdu2, 3);
  2699. MeasuredValueShortWithCP24Time2a mvs5_dec = (MeasuredValueShortWithCP24Time2a) CS101_ASDU_getElement(asdu2, 4);
  2700. MeasuredValueShortWithCP24Time2a mvs6_dec = (MeasuredValueShortWithCP24Time2a) CS101_ASDU_getElement(asdu2, 5);
  2701. MeasuredValueShortWithCP24Time2a mvs7_dec = (MeasuredValueShortWithCP24Time2a) CS101_ASDU_getElement(asdu2, 6);
  2702. MeasuredValueShortWithCP24Time2a mvs8_dec = (MeasuredValueShortWithCP24Time2a) CS101_ASDU_getElement(asdu2, 7);
  2703. TEST_ASSERT_EQUAL_FLOAT(10.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs1_dec));
  2704. TEST_ASSERT_EQUAL_FLOAT(11.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs2_dec));
  2705. TEST_ASSERT_EQUAL_FLOAT(12.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs3_dec));
  2706. TEST_ASSERT_EQUAL_FLOAT(13.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs4_dec));
  2707. TEST_ASSERT_EQUAL_FLOAT(14.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs5_dec));
  2708. TEST_ASSERT_EQUAL_FLOAT(15.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs6_dec));
  2709. TEST_ASSERT_EQUAL_FLOAT(16.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs7_dec));
  2710. TEST_ASSERT_EQUAL_FLOAT(17.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs8_dec));
  2711. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, MeasuredValueShort_getQuality((MeasuredValueShort )mvs1_dec));
  2712. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, MeasuredValueShort_getQuality((MeasuredValueShort )mvs2_dec));
  2713. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, MeasuredValueShort_getQuality((MeasuredValueShort )mvs3_dec));
  2714. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, MeasuredValueShort_getQuality((MeasuredValueShort )mvs4_dec));
  2715. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, MeasuredValueShort_getQuality((MeasuredValueShort )mvs5_dec));
  2716. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, MeasuredValueShort_getQuality((MeasuredValueShort )mvs6_dec));
  2717. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, MeasuredValueShort_getQuality((MeasuredValueShort )mvs7_dec));
  2718. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, MeasuredValueShort_getQuality((MeasuredValueShort )mvs8_dec));
  2719. CP24Time2a time1_dec = MeasuredValueShortWithCP24Time2a_getTimestamp(mvs1_dec);
  2720. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time1_dec));
  2721. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time1_dec));
  2722. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time1_dec));
  2723. CP24Time2a time2_dec = MeasuredValueShortWithCP24Time2a_getTimestamp(mvs2_dec);
  2724. TEST_ASSERT_EQUAL_INT(54, CP24Time2a_getMinute(time2_dec));
  2725. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getSecond(time2_dec));
  2726. TEST_ASSERT_EQUAL_INT(345, CP24Time2a_getMillisecond(time2_dec));
  2727. CP24Time2a time3_dec = MeasuredValueShortWithCP24Time2a_getTimestamp(mvs3_dec);
  2728. TEST_ASSERT_EQUAL_INT(00, CP24Time2a_getMinute(time3_dec));
  2729. TEST_ASSERT_EQUAL_INT(00, CP24Time2a_getSecond(time3_dec));
  2730. TEST_ASSERT_EQUAL_INT(1, CP24Time2a_getMillisecond(time3_dec));
  2731. CP24Time2a time4_dec = MeasuredValueShortWithCP24Time2a_getTimestamp(mvs4_dec);
  2732. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time4_dec));
  2733. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time4_dec));
  2734. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time4_dec));
  2735. CP24Time2a time5_dec = MeasuredValueShortWithCP24Time2a_getTimestamp(mvs5_dec);
  2736. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time5_dec));
  2737. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time5_dec));
  2738. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time5_dec));
  2739. CP24Time2a time6_dec = MeasuredValueShortWithCP24Time2a_getTimestamp(mvs6_dec);
  2740. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time6_dec));
  2741. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time6_dec));
  2742. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time6_dec));
  2743. CP24Time2a time7_dec = MeasuredValueShortWithCP24Time2a_getTimestamp(mvs7_dec);
  2744. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time7_dec));
  2745. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time7_dec));
  2746. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time7_dec));
  2747. CP24Time2a time8_dec = MeasuredValueShortWithCP24Time2a_getTimestamp(mvs8_dec);
  2748. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time8_dec));
  2749. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time8_dec));
  2750. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time8_dec));
  2751. MeasuredValueShortWithCP24Time2a_destroy(mvs1_dec);
  2752. MeasuredValueShortWithCP24Time2a_destroy(mvs2_dec);
  2753. MeasuredValueShortWithCP24Time2a_destroy(mvs3_dec);
  2754. MeasuredValueShortWithCP24Time2a_destroy(mvs4_dec);
  2755. MeasuredValueShortWithCP24Time2a_destroy(mvs5_dec);
  2756. MeasuredValueShortWithCP24Time2a_destroy(mvs6_dec);
  2757. MeasuredValueShortWithCP24Time2a_destroy(mvs7_dec);
  2758. MeasuredValueShortWithCP24Time2a_destroy(mvs8_dec);
  2759. CS101_ASDU_destroy(asdu2);
  2760. }
  2761. void
  2762. test_MeasuredValueShortWithCP56Time2a(void)
  2763. {
  2764. MeasuredValueShortWithCP56Time2a mvs1;
  2765. MeasuredValueShortWithCP56Time2a mvs2;
  2766. MeasuredValueShortWithCP56Time2a mvs3;
  2767. MeasuredValueShortWithCP56Time2a mvs4;
  2768. MeasuredValueShortWithCP56Time2a mvs5;
  2769. MeasuredValueShortWithCP56Time2a mvs6;
  2770. MeasuredValueShortWithCP56Time2a mvs7;
  2771. MeasuredValueShortWithCP56Time2a mvs8;
  2772. uint64_t time1 = Hal_getTimeInMs();
  2773. uint64_t time2 = time1 + 1000;
  2774. uint64_t time3 = time2 + 1000;
  2775. uint64_t time4 = time3 + 1000;
  2776. uint64_t time5 = time4 + 1000;
  2777. uint64_t time6 = time5 + 1000;
  2778. uint64_t time7 = time6 + 1000;
  2779. uint64_t time8 = time7 + 1000;
  2780. struct sCP56Time2a cpTime1;
  2781. struct sCP56Time2a cpTime2;
  2782. struct sCP56Time2a cpTime3;
  2783. struct sCP56Time2a cpTime4;
  2784. struct sCP56Time2a cpTime5;
  2785. struct sCP56Time2a cpTime6;
  2786. struct sCP56Time2a cpTime7;
  2787. struct sCP56Time2a cpTime8;
  2788. CP56Time2a_createFromMsTimestamp(&cpTime1, time1);
  2789. CP56Time2a_createFromMsTimestamp(&cpTime2, time2);
  2790. CP56Time2a_createFromMsTimestamp(&cpTime3, time3);
  2791. CP56Time2a_createFromMsTimestamp(&cpTime4, time4);
  2792. CP56Time2a_createFromMsTimestamp(&cpTime5, time5);
  2793. CP56Time2a_createFromMsTimestamp(&cpTime6, time6);
  2794. CP56Time2a_createFromMsTimestamp(&cpTime7, time7);
  2795. CP56Time2a_createFromMsTimestamp(&cpTime8, time8);
  2796. mvs1 = MeasuredValueShortWithCP56Time2a_create(NULL, 101, 10.5f, IEC60870_QUALITY_GOOD, &cpTime1);
  2797. mvs2 = MeasuredValueShortWithCP56Time2a_create(NULL, 102, 11.5f, IEC60870_QUALITY_OVERFLOW, &cpTime2);
  2798. mvs3 = MeasuredValueShortWithCP56Time2a_create(NULL, 103, 12.5f, IEC60870_QUALITY_RESERVED, &cpTime3);
  2799. mvs4 = MeasuredValueShortWithCP56Time2a_create(NULL, 104, 13.5f, IEC60870_QUALITY_ELAPSED_TIME_INVALID, &cpTime4);
  2800. mvs5 = MeasuredValueShortWithCP56Time2a_create(NULL, 105, 14.5f, IEC60870_QUALITY_BLOCKED, &cpTime5);
  2801. mvs6 = MeasuredValueShortWithCP56Time2a_create(NULL, 106, 15.5f, IEC60870_QUALITY_SUBSTITUTED, &cpTime6);
  2802. mvs7 = MeasuredValueShortWithCP56Time2a_create(NULL, 107, 16.5f, IEC60870_QUALITY_NON_TOPICAL, &cpTime7);
  2803. mvs8 = MeasuredValueShortWithCP56Time2a_create(NULL, 108, 17.5f, IEC60870_QUALITY_INVALID, &cpTime8);
  2804. TEST_ASSERT_EQUAL_FLOAT(10.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs1));
  2805. TEST_ASSERT_EQUAL_FLOAT(11.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs2));
  2806. TEST_ASSERT_EQUAL_FLOAT(12.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs3));
  2807. TEST_ASSERT_EQUAL_FLOAT(13.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs4));
  2808. TEST_ASSERT_EQUAL_FLOAT(14.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs5));
  2809. TEST_ASSERT_EQUAL_FLOAT(15.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs6));
  2810. TEST_ASSERT_EQUAL_FLOAT(16.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs7));
  2811. TEST_ASSERT_EQUAL_FLOAT(17.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs8));
  2812. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, MeasuredValueShort_getQuality((MeasuredValueShort )mvs1));
  2813. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, MeasuredValueShort_getQuality((MeasuredValueShort )mvs2));
  2814. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, MeasuredValueShort_getQuality((MeasuredValueShort )mvs3));
  2815. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, MeasuredValueShort_getQuality((MeasuredValueShort )mvs4));
  2816. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, MeasuredValueShort_getQuality((MeasuredValueShort )mvs5));
  2817. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, MeasuredValueShort_getQuality((MeasuredValueShort )mvs6));
  2818. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, MeasuredValueShort_getQuality((MeasuredValueShort )mvs7));
  2819. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, MeasuredValueShort_getQuality((MeasuredValueShort )mvs8));
  2820. uint8_t buffer[256];
  2821. struct sBufferFrame bf;
  2822. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  2823. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  2824. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs1);
  2825. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs2);
  2826. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs3);
  2827. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs4);
  2828. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs5);
  2829. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs6);
  2830. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs7);
  2831. CS101_ASDU_addInformationObject(asdu, (InformationObject) mvs8);
  2832. MeasuredValueShortWithCP56Time2a_destroy(mvs1);
  2833. MeasuredValueShortWithCP56Time2a_destroy(mvs2);
  2834. MeasuredValueShortWithCP56Time2a_destroy(mvs3);
  2835. MeasuredValueShortWithCP56Time2a_destroy(mvs4);
  2836. MeasuredValueShortWithCP56Time2a_destroy(mvs5);
  2837. MeasuredValueShortWithCP56Time2a_destroy(mvs6);
  2838. MeasuredValueShortWithCP56Time2a_destroy(mvs7);
  2839. MeasuredValueShortWithCP56Time2a_destroy(mvs8);
  2840. CS101_ASDU_encode(asdu, f);
  2841. TEST_ASSERT_EQUAL_INT(126, Frame_getMsgSize(f));
  2842. CS101_ASDU_destroy(asdu);
  2843. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  2844. TEST_ASSERT_EQUAL_INT(8, CS101_ASDU_getNumberOfElements(asdu2));
  2845. MeasuredValueShortWithCP56Time2a mvs1_dec = (MeasuredValueShortWithCP56Time2a) CS101_ASDU_getElement(asdu2, 0);
  2846. MeasuredValueShortWithCP56Time2a mvs2_dec = (MeasuredValueShortWithCP56Time2a) CS101_ASDU_getElement(asdu2, 1);
  2847. MeasuredValueShortWithCP56Time2a mvs3_dec = (MeasuredValueShortWithCP56Time2a) CS101_ASDU_getElement(asdu2, 2);
  2848. MeasuredValueShortWithCP56Time2a mvs4_dec = (MeasuredValueShortWithCP56Time2a) CS101_ASDU_getElement(asdu2, 3);
  2849. MeasuredValueShortWithCP56Time2a mvs5_dec = (MeasuredValueShortWithCP56Time2a) CS101_ASDU_getElement(asdu2, 4);
  2850. MeasuredValueShortWithCP56Time2a mvs6_dec = (MeasuredValueShortWithCP56Time2a) CS101_ASDU_getElement(asdu2, 5);
  2851. MeasuredValueShortWithCP56Time2a mvs7_dec = (MeasuredValueShortWithCP56Time2a) CS101_ASDU_getElement(asdu2, 6);
  2852. MeasuredValueShortWithCP56Time2a mvs8_dec = (MeasuredValueShortWithCP56Time2a) CS101_ASDU_getElement(asdu2, 7);
  2853. TEST_ASSERT_EQUAL_FLOAT(10.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs1_dec));
  2854. TEST_ASSERT_EQUAL_FLOAT(11.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs2_dec));
  2855. TEST_ASSERT_EQUAL_FLOAT(12.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs3_dec));
  2856. TEST_ASSERT_EQUAL_FLOAT(13.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs4_dec));
  2857. TEST_ASSERT_EQUAL_FLOAT(14.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs5_dec));
  2858. TEST_ASSERT_EQUAL_FLOAT(15.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs6_dec));
  2859. TEST_ASSERT_EQUAL_FLOAT(16.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs7_dec));
  2860. TEST_ASSERT_EQUAL_FLOAT(17.5f, MeasuredValueShort_getValue((MeasuredValueShort )mvs8_dec));
  2861. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, MeasuredValueShort_getQuality((MeasuredValueShort )mvs1_dec));
  2862. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_OVERFLOW, MeasuredValueShort_getQuality((MeasuredValueShort )mvs2_dec));
  2863. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_RESERVED, MeasuredValueShort_getQuality((MeasuredValueShort )mvs3_dec));
  2864. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_ELAPSED_TIME_INVALID, MeasuredValueShort_getQuality((MeasuredValueShort )mvs4_dec));
  2865. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_BLOCKED, MeasuredValueShort_getQuality((MeasuredValueShort )mvs5_dec));
  2866. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_SUBSTITUTED, MeasuredValueShort_getQuality((MeasuredValueShort )mvs6_dec));
  2867. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_NON_TOPICAL, MeasuredValueShort_getQuality((MeasuredValueShort )mvs7_dec));
  2868. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, MeasuredValueShort_getQuality((MeasuredValueShort )mvs8_dec));
  2869. TEST_ASSERT_EQUAL_UINT64(time1, CP56Time2a_toMsTimestamp(MeasuredValueShortWithCP56Time2a_getTimestamp(mvs1_dec)));
  2870. TEST_ASSERT_EQUAL_UINT64(time2, CP56Time2a_toMsTimestamp(MeasuredValueShortWithCP56Time2a_getTimestamp(mvs2_dec)));
  2871. TEST_ASSERT_EQUAL_UINT64(time3, CP56Time2a_toMsTimestamp(MeasuredValueShortWithCP56Time2a_getTimestamp(mvs3_dec)));
  2872. TEST_ASSERT_EQUAL_UINT64(time4, CP56Time2a_toMsTimestamp(MeasuredValueShortWithCP56Time2a_getTimestamp(mvs4_dec)));
  2873. TEST_ASSERT_EQUAL_UINT64(time5, CP56Time2a_toMsTimestamp(MeasuredValueShortWithCP56Time2a_getTimestamp(mvs5_dec)));
  2874. TEST_ASSERT_EQUAL_UINT64(time6, CP56Time2a_toMsTimestamp(MeasuredValueShortWithCP56Time2a_getTimestamp(mvs6_dec)));
  2875. TEST_ASSERT_EQUAL_UINT64(time7, CP56Time2a_toMsTimestamp(MeasuredValueShortWithCP56Time2a_getTimestamp(mvs7_dec)));
  2876. TEST_ASSERT_EQUAL_UINT64(time8, CP56Time2a_toMsTimestamp(MeasuredValueShortWithCP56Time2a_getTimestamp(mvs8_dec)));
  2877. MeasuredValueShortWithCP56Time2a_destroy(mvs1_dec);
  2878. MeasuredValueShortWithCP56Time2a_destroy(mvs2_dec);
  2879. MeasuredValueShortWithCP56Time2a_destroy(mvs3_dec);
  2880. MeasuredValueShortWithCP56Time2a_destroy(mvs4_dec);
  2881. MeasuredValueShortWithCP56Time2a_destroy(mvs5_dec);
  2882. MeasuredValueShortWithCP56Time2a_destroy(mvs6_dec);
  2883. MeasuredValueShortWithCP56Time2a_destroy(mvs7_dec);
  2884. MeasuredValueShortWithCP56Time2a_destroy(mvs8_dec);
  2885. CS101_ASDU_destroy(asdu2);
  2886. }
  2887. void
  2888. test_IntegratedTotals(void)
  2889. {
  2890. IntegratedTotals it1;
  2891. IntegratedTotals it2;
  2892. BinaryCounterReading bcr1;
  2893. BinaryCounterReading bcr2;
  2894. bcr1 = BinaryCounterReading_create(NULL, INT32_MAX, 0, true, true, true);
  2895. bcr2 = BinaryCounterReading_create(NULL, INT32_MIN, 15, false, false, false);
  2896. it1 = IntegratedTotals_create(NULL, 101, bcr1);
  2897. it2 = IntegratedTotals_create(NULL, 102, bcr2);
  2898. BinaryCounterReading_destroy(bcr1);
  2899. BinaryCounterReading_destroy(bcr2);
  2900. TEST_ASSERT_EQUAL_INT32(INT32_MAX, BinaryCounterReading_getValue(IntegratedTotals_getBCR(it1)));
  2901. TEST_ASSERT_EQUAL_UINT8(0, BinaryCounterReading_getSequenceNumber(IntegratedTotals_getBCR(it1)));
  2902. TEST_ASSERT_TRUE(BinaryCounterReading_hasCarry(IntegratedTotals_getBCR(it1)));
  2903. TEST_ASSERT_TRUE(BinaryCounterReading_isAdjusted(IntegratedTotals_getBCR(it1)));
  2904. TEST_ASSERT_TRUE(BinaryCounterReading_isInvalid(IntegratedTotals_getBCR(it1)));
  2905. TEST_ASSERT_EQUAL_INT32(INT32_MIN, BinaryCounterReading_getValue(IntegratedTotals_getBCR(it2)));
  2906. TEST_ASSERT_EQUAL_UINT8(15, BinaryCounterReading_getSequenceNumber(IntegratedTotals_getBCR(it2)));
  2907. TEST_ASSERT_FALSE(BinaryCounterReading_hasCarry(IntegratedTotals_getBCR(it2)));
  2908. TEST_ASSERT_FALSE(BinaryCounterReading_isAdjusted(IntegratedTotals_getBCR(it2)));
  2909. TEST_ASSERT_FALSE(BinaryCounterReading_isInvalid(IntegratedTotals_getBCR(it2)));
  2910. uint8_t buffer[256];
  2911. struct sBufferFrame bf;
  2912. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  2913. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  2914. CS101_ASDU_addInformationObject(asdu, (InformationObject) it1);
  2915. CS101_ASDU_addInformationObject(asdu, (InformationObject) it2);
  2916. IntegratedTotals_destroy(it1);
  2917. IntegratedTotals_destroy(it2);
  2918. CS101_ASDU_encode(asdu, f);
  2919. TEST_ASSERT_EQUAL_INT(22, Frame_getMsgSize(f));
  2920. CS101_ASDU_destroy(asdu);
  2921. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  2922. TEST_ASSERT_EQUAL_INT(2, CS101_ASDU_getNumberOfElements(asdu2));
  2923. IntegratedTotals it1_dec = (IntegratedTotals) CS101_ASDU_getElement(asdu2, 0);
  2924. IntegratedTotals it2_dec = (IntegratedTotals) CS101_ASDU_getElement(asdu2, 1);
  2925. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )it1_dec));
  2926. TEST_ASSERT_EQUAL_INT32(INT32_MAX, BinaryCounterReading_getValue(IntegratedTotals_getBCR(it1_dec)));
  2927. TEST_ASSERT_EQUAL_UINT8(0, BinaryCounterReading_getSequenceNumber(IntegratedTotals_getBCR(it1_dec)));
  2928. TEST_ASSERT_TRUE(BinaryCounterReading_hasCarry(IntegratedTotals_getBCR(it1_dec)));
  2929. TEST_ASSERT_TRUE(BinaryCounterReading_isAdjusted(IntegratedTotals_getBCR(it1_dec)));
  2930. TEST_ASSERT_TRUE(BinaryCounterReading_isInvalid(IntegratedTotals_getBCR(it1_dec)));
  2931. TEST_ASSERT_EQUAL_INT(102, InformationObject_getObjectAddress((InformationObject )it2_dec));
  2932. TEST_ASSERT_EQUAL_INT32(INT32_MIN, BinaryCounterReading_getValue(IntegratedTotals_getBCR(it2_dec)));
  2933. TEST_ASSERT_EQUAL_UINT8(15, BinaryCounterReading_getSequenceNumber(IntegratedTotals_getBCR(it2_dec)));
  2934. TEST_ASSERT_FALSE(BinaryCounterReading_hasCarry(IntegratedTotals_getBCR(it2_dec)));
  2935. TEST_ASSERT_FALSE(BinaryCounterReading_isAdjusted(IntegratedTotals_getBCR(it2_dec)));
  2936. TEST_ASSERT_FALSE(BinaryCounterReading_isInvalid(IntegratedTotals_getBCR(it2_dec)));
  2937. IntegratedTotals_destroy(it1_dec);
  2938. IntegratedTotals_destroy(it2_dec);
  2939. CS101_ASDU_destroy(asdu2);
  2940. }
  2941. void
  2942. test_IntegratedTotalsWithCP24Time2a(void)
  2943. {
  2944. IntegratedTotalsWithCP24Time2a it1;
  2945. IntegratedTotalsWithCP24Time2a it2;
  2946. BinaryCounterReading bcr1;
  2947. BinaryCounterReading bcr2;
  2948. uint64_t time1 = Hal_getTimeInMs();
  2949. uint64_t time2 = time1 + 1000;
  2950. struct sCP24Time2a cpTime1;
  2951. struct sCP24Time2a cpTime2;
  2952. bzero(&cpTime1, sizeof(struct sCP24Time2a));
  2953. bzero(&cpTime2, sizeof(struct sCP24Time2a));
  2954. CP24Time2a_setMinute(&cpTime1, 12);
  2955. CP24Time2a_setMillisecond(&cpTime1, 24123);
  2956. CP24Time2a_setMinute(&cpTime2, 54);
  2957. CP24Time2a_setMillisecond(&cpTime2, 12345);
  2958. bcr1 = BinaryCounterReading_create(NULL, INT32_MAX, 0, true, true, true);
  2959. bcr2 = BinaryCounterReading_create(NULL, INT32_MIN, 15, false, false, false);
  2960. it1 = IntegratedTotalsWithCP24Time2a_create(NULL, 101, bcr1, &cpTime1);
  2961. it2 = IntegratedTotalsWithCP24Time2a_create(NULL, 102, bcr2, &cpTime2);
  2962. BinaryCounterReading_destroy(bcr1);
  2963. BinaryCounterReading_destroy(bcr2);
  2964. TEST_ASSERT_EQUAL_INT32(INT32_MAX, BinaryCounterReading_getValue(IntegratedTotals_getBCR((IntegratedTotals )it1)));
  2965. TEST_ASSERT_EQUAL_UINT8(0, BinaryCounterReading_getSequenceNumber(IntegratedTotals_getBCR((IntegratedTotals )it1)));
  2966. TEST_ASSERT_TRUE(BinaryCounterReading_hasCarry(IntegratedTotals_getBCR((IntegratedTotals )it1)));
  2967. TEST_ASSERT_TRUE(BinaryCounterReading_isAdjusted(IntegratedTotals_getBCR((IntegratedTotals )it1)));
  2968. TEST_ASSERT_TRUE(BinaryCounterReading_isInvalid(IntegratedTotals_getBCR((IntegratedTotals )it1)));
  2969. TEST_ASSERT_EQUAL_INT32(INT32_MIN, BinaryCounterReading_getValue(IntegratedTotals_getBCR((IntegratedTotals )it2)));
  2970. TEST_ASSERT_EQUAL_UINT8(15, BinaryCounterReading_getSequenceNumber(IntegratedTotals_getBCR((IntegratedTotals )it2)));
  2971. TEST_ASSERT_FALSE(BinaryCounterReading_hasCarry(IntegratedTotals_getBCR((IntegratedTotals )it2)));
  2972. TEST_ASSERT_FALSE(BinaryCounterReading_isAdjusted(IntegratedTotals_getBCR((IntegratedTotals )it2)));
  2973. TEST_ASSERT_FALSE(BinaryCounterReading_isInvalid(IntegratedTotals_getBCR((IntegratedTotals )it2)));
  2974. uint8_t buffer[256];
  2975. struct sBufferFrame bf;
  2976. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  2977. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  2978. CS101_ASDU_addInformationObject(asdu, (InformationObject) it1);
  2979. CS101_ASDU_addInformationObject(asdu, (InformationObject) it2);
  2980. IntegratedTotalsWithCP24Time2a_destroy(it1);
  2981. IntegratedTotalsWithCP24Time2a_destroy(it2);
  2982. CS101_ASDU_encode(asdu, f);
  2983. TEST_ASSERT_EQUAL_INT(28, Frame_getMsgSize(f));
  2984. CS101_ASDU_destroy(asdu);
  2985. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  2986. TEST_ASSERT_EQUAL_INT(2, CS101_ASDU_getNumberOfElements(asdu2));
  2987. IntegratedTotalsWithCP24Time2a it1_dec = (IntegratedTotalsWithCP24Time2a) CS101_ASDU_getElement(asdu2, 0);
  2988. IntegratedTotalsWithCP24Time2a it2_dec = (IntegratedTotalsWithCP24Time2a) CS101_ASDU_getElement(asdu2, 1);
  2989. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )it1_dec));
  2990. TEST_ASSERT_EQUAL_INT32(INT32_MAX, BinaryCounterReading_getValue(IntegratedTotals_getBCR((IntegratedTotals )it1_dec)));
  2991. TEST_ASSERT_EQUAL_UINT8(0, BinaryCounterReading_getSequenceNumber(IntegratedTotals_getBCR((IntegratedTotals )it1_dec)));
  2992. TEST_ASSERT_TRUE(BinaryCounterReading_hasCarry(IntegratedTotals_getBCR((IntegratedTotals )it1_dec)));
  2993. TEST_ASSERT_TRUE(BinaryCounterReading_isAdjusted(IntegratedTotals_getBCR((IntegratedTotals )it1_dec)));
  2994. TEST_ASSERT_TRUE(BinaryCounterReading_isInvalid(IntegratedTotals_getBCR((IntegratedTotals )it1_dec)));
  2995. TEST_ASSERT_EQUAL_INT(102, InformationObject_getObjectAddress((InformationObject )it2_dec));
  2996. TEST_ASSERT_EQUAL_INT32(INT32_MIN, BinaryCounterReading_getValue(IntegratedTotals_getBCR((IntegratedTotals )it2_dec)));
  2997. TEST_ASSERT_EQUAL_UINT8(15, BinaryCounterReading_getSequenceNumber(IntegratedTotals_getBCR((IntegratedTotals )it2_dec)));
  2998. TEST_ASSERT_FALSE(BinaryCounterReading_hasCarry(IntegratedTotals_getBCR((IntegratedTotals )it2_dec)));
  2999. TEST_ASSERT_FALSE(BinaryCounterReading_isAdjusted(IntegratedTotals_getBCR((IntegratedTotals )it2_dec)));
  3000. TEST_ASSERT_FALSE(BinaryCounterReading_isInvalid(IntegratedTotals_getBCR((IntegratedTotals )it2_dec)));
  3001. CP24Time2a time1_dec = IntegratedTotalsWithCP24Time2a_getTimestamp(it1_dec);
  3002. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getMinute(time1_dec));
  3003. TEST_ASSERT_EQUAL_INT(24, CP24Time2a_getSecond(time1_dec));
  3004. TEST_ASSERT_EQUAL_INT(123, CP24Time2a_getMillisecond(time1_dec));
  3005. CP24Time2a time2_dec = IntegratedTotalsWithCP24Time2a_getTimestamp(it2_dec);
  3006. TEST_ASSERT_EQUAL_INT(54, CP24Time2a_getMinute(time2_dec));
  3007. TEST_ASSERT_EQUAL_INT(12, CP24Time2a_getSecond(time2_dec));
  3008. TEST_ASSERT_EQUAL_INT(345, CP24Time2a_getMillisecond(time2_dec));
  3009. IntegratedTotalsWithCP24Time2a_destroy(it1_dec);
  3010. IntegratedTotalsWithCP24Time2a_destroy(it2_dec);
  3011. CS101_ASDU_destroy(asdu2);
  3012. }
  3013. void
  3014. test_IntegratedTotalsWithCP56Time2a(void)
  3015. {
  3016. IntegratedTotalsWithCP56Time2a it1;
  3017. IntegratedTotalsWithCP56Time2a it2;
  3018. BinaryCounterReading bcr1;
  3019. BinaryCounterReading bcr2;
  3020. uint64_t time1 = Hal_getTimeInMs();
  3021. uint64_t time2 = time1 + 1000;
  3022. struct sCP56Time2a cpTime1;
  3023. struct sCP56Time2a cpTime2;
  3024. CP56Time2a_createFromMsTimestamp(&cpTime1, time1);
  3025. CP56Time2a_createFromMsTimestamp(&cpTime2, time2);
  3026. bcr1 = BinaryCounterReading_create(NULL, INT32_MAX, 0, true, true, true);
  3027. bcr2 = BinaryCounterReading_create(NULL, INT32_MIN, 15, false, false, false);
  3028. it1 = IntegratedTotalsWithCP56Time2a_create(NULL, 101, bcr1, &cpTime1);
  3029. it2 = IntegratedTotalsWithCP56Time2a_create(NULL, 102, bcr2, &cpTime2);
  3030. BinaryCounterReading_destroy(bcr1);
  3031. BinaryCounterReading_destroy(bcr2);
  3032. TEST_ASSERT_EQUAL_INT32(INT32_MAX, BinaryCounterReading_getValue(IntegratedTotals_getBCR((IntegratedTotals )it1)));
  3033. TEST_ASSERT_EQUAL_UINT8(0, BinaryCounterReading_getSequenceNumber(IntegratedTotals_getBCR((IntegratedTotals )it1)));
  3034. TEST_ASSERT_TRUE(BinaryCounterReading_hasCarry(IntegratedTotals_getBCR((IntegratedTotals )it1)));
  3035. TEST_ASSERT_TRUE(BinaryCounterReading_isAdjusted(IntegratedTotals_getBCR((IntegratedTotals )it1)));
  3036. TEST_ASSERT_TRUE(BinaryCounterReading_isInvalid(IntegratedTotals_getBCR((IntegratedTotals )it1)));
  3037. TEST_ASSERT_EQUAL_INT32(INT32_MIN, BinaryCounterReading_getValue(IntegratedTotals_getBCR((IntegratedTotals )it2)));
  3038. TEST_ASSERT_EQUAL_UINT8(15, BinaryCounterReading_getSequenceNumber(IntegratedTotals_getBCR((IntegratedTotals )it2)));
  3039. TEST_ASSERT_FALSE(BinaryCounterReading_hasCarry(IntegratedTotals_getBCR((IntegratedTotals )it2)));
  3040. TEST_ASSERT_FALSE(BinaryCounterReading_isAdjusted(IntegratedTotals_getBCR((IntegratedTotals )it2)));
  3041. TEST_ASSERT_FALSE(BinaryCounterReading_isInvalid(IntegratedTotals_getBCR((IntegratedTotals )it2)));
  3042. uint8_t buffer[256];
  3043. struct sBufferFrame bf;
  3044. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  3045. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  3046. CS101_ASDU_addInformationObject(asdu, (InformationObject) it1);
  3047. CS101_ASDU_addInformationObject(asdu, (InformationObject) it2);
  3048. IntegratedTotalsWithCP56Time2a_destroy(it1);
  3049. IntegratedTotalsWithCP56Time2a_destroy(it2);
  3050. CS101_ASDU_encode(asdu, f);
  3051. TEST_ASSERT_EQUAL_INT(36, Frame_getMsgSize(f));
  3052. CS101_ASDU_destroy(asdu);
  3053. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  3054. TEST_ASSERT_EQUAL_INT(2, CS101_ASDU_getNumberOfElements(asdu2));
  3055. IntegratedTotalsWithCP56Time2a it1_dec = (IntegratedTotalsWithCP56Time2a) CS101_ASDU_getElement(asdu2, 0);
  3056. IntegratedTotalsWithCP56Time2a it2_dec = (IntegratedTotalsWithCP56Time2a) CS101_ASDU_getElement(asdu2, 1);
  3057. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )it1_dec));
  3058. TEST_ASSERT_EQUAL_INT32(INT32_MAX, BinaryCounterReading_getValue(IntegratedTotals_getBCR((IntegratedTotals )it1_dec)));
  3059. TEST_ASSERT_EQUAL_UINT8(0, BinaryCounterReading_getSequenceNumber(IntegratedTotals_getBCR((IntegratedTotals )it1_dec)));
  3060. TEST_ASSERT_TRUE(BinaryCounterReading_hasCarry(IntegratedTotals_getBCR((IntegratedTotals )it1_dec)));
  3061. TEST_ASSERT_TRUE(BinaryCounterReading_isAdjusted(IntegratedTotals_getBCR((IntegratedTotals )it1_dec)));
  3062. TEST_ASSERT_TRUE(BinaryCounterReading_isInvalid(IntegratedTotals_getBCR((IntegratedTotals )it1_dec)));
  3063. TEST_ASSERT_EQUAL_INT(102, InformationObject_getObjectAddress((InformationObject )it2_dec));
  3064. TEST_ASSERT_EQUAL_INT32(INT32_MIN, BinaryCounterReading_getValue(IntegratedTotals_getBCR((IntegratedTotals )it2_dec)));
  3065. TEST_ASSERT_EQUAL_UINT8(15, BinaryCounterReading_getSequenceNumber(IntegratedTotals_getBCR((IntegratedTotals )it2_dec)));
  3066. TEST_ASSERT_FALSE(BinaryCounterReading_hasCarry(IntegratedTotals_getBCR((IntegratedTotals )it2_dec)));
  3067. TEST_ASSERT_FALSE(BinaryCounterReading_isAdjusted(IntegratedTotals_getBCR((IntegratedTotals )it2_dec)));
  3068. TEST_ASSERT_FALSE(BinaryCounterReading_isInvalid(IntegratedTotals_getBCR((IntegratedTotals )it2_dec)));
  3069. TEST_ASSERT_EQUAL_UINT64(time1, CP56Time2a_toMsTimestamp(IntegratedTotalsWithCP56Time2a_getTimestamp(it1_dec)));
  3070. TEST_ASSERT_EQUAL_UINT64(time2, CP56Time2a_toMsTimestamp(IntegratedTotalsWithCP56Time2a_getTimestamp(it2_dec)));
  3071. IntegratedTotalsWithCP56Time2a_destroy(it1_dec);
  3072. IntegratedTotalsWithCP56Time2a_destroy(it2_dec);
  3073. CS101_ASDU_destroy(asdu2);
  3074. }
  3075. void
  3076. test_SingleCommand(void)
  3077. {
  3078. SingleCommand sc;
  3079. sc = SingleCommand_create(NULL, 101, true, true, 0);
  3080. TEST_ASSERT_TRUE(SingleCommand_getState(sc));
  3081. TEST_ASSERT_TRUE(SingleCommand_isSelect(sc));
  3082. TEST_ASSERT_EQUAL_INT(0, SingleCommand_getQU(sc));
  3083. uint8_t buffer[256];
  3084. struct sBufferFrame bf;
  3085. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  3086. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_ACTIVATION, 0, 1, false, false);
  3087. CS101_ASDU_addInformationObject(asdu, (InformationObject) sc);
  3088. SingleCommand_destroy(sc);
  3089. CS101_ASDU_encode(asdu, f);
  3090. TEST_ASSERT_EQUAL_INT(10, Frame_getMsgSize(f));
  3091. CS101_ASDU_destroy(asdu);
  3092. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  3093. TEST_ASSERT_EQUAL_INT(1, CS101_ASDU_getNumberOfElements(asdu2));
  3094. SingleCommand sc_dec = (SingleCommand) CS101_ASDU_getElement(asdu2, 0);
  3095. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )sc_dec));
  3096. TEST_ASSERT_TRUE(SingleCommand_getState(sc_dec));
  3097. TEST_ASSERT_TRUE(SingleCommand_isSelect(sc_dec));
  3098. TEST_ASSERT_EQUAL_INT(0, SingleCommand_getQU(sc_dec));
  3099. SingleCommand_destroy(sc_dec);
  3100. CS101_ASDU_destroy(asdu2);
  3101. }
  3102. void
  3103. test_SingleCommandWithCP56Time2a(void)
  3104. {
  3105. SingleCommandWithCP56Time2a sc;
  3106. uint64_t time1 = Hal_getTimeInMs();
  3107. struct sCP56Time2a cpTime1;
  3108. CP56Time2a_createFromMsTimestamp(&cpTime1, time1);
  3109. sc = SingleCommandWithCP56Time2a_create(NULL, 101, true, true, 0, &cpTime1);
  3110. TEST_ASSERT_TRUE(SingleCommand_getState((SingleCommand )sc));
  3111. TEST_ASSERT_TRUE(SingleCommand_isSelect((SingleCommand )sc));
  3112. TEST_ASSERT_EQUAL_INT(0, SingleCommand_getQU((SingleCommand )sc));
  3113. uint8_t buffer[256];
  3114. struct sBufferFrame bf;
  3115. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  3116. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_ACTIVATION, 0, 1, false, false);
  3117. CS101_ASDU_addInformationObject(asdu, (InformationObject) sc);
  3118. SingleCommandWithCP56Time2a_destroy(sc);
  3119. CS101_ASDU_encode(asdu, f);
  3120. TEST_ASSERT_EQUAL_INT(17, Frame_getMsgSize(f));
  3121. CS101_ASDU_destroy(asdu);
  3122. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  3123. TEST_ASSERT_EQUAL_INT(1, CS101_ASDU_getNumberOfElements(asdu2));
  3124. SingleCommandWithCP56Time2a sc_dec = (SingleCommandWithCP56Time2a) CS101_ASDU_getElement(asdu2, 0);
  3125. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )sc_dec));
  3126. TEST_ASSERT_TRUE(SingleCommand_getState((SingleCommand )sc_dec));
  3127. TEST_ASSERT_TRUE(SingleCommand_isSelect((SingleCommand )sc_dec));
  3128. TEST_ASSERT_EQUAL_INT(0, SingleCommand_getQU((SingleCommand )sc_dec));
  3129. TEST_ASSERT_EQUAL_UINT64(time1, CP56Time2a_toMsTimestamp(SingleCommandWithCP56Time2a_getTimestamp(sc_dec)));
  3130. SingleCommandWithCP56Time2a_destroy(sc_dec);
  3131. CS101_ASDU_destroy(asdu2);
  3132. }
  3133. void
  3134. test_DoubleCommand(void)
  3135. {
  3136. DoubleCommand dc;
  3137. dc = DoubleCommand_create(NULL, 101, 1, true, 0);
  3138. TEST_ASSERT_TRUE(DoubleCommand_isSelect(dc));
  3139. TEST_ASSERT_EQUAL_INT(1, DoubleCommand_getState(dc));
  3140. TEST_ASSERT_EQUAL_INT(0, DoubleCommand_getQU(dc));
  3141. uint8_t buffer[256];
  3142. struct sBufferFrame bf;
  3143. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  3144. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_ACTIVATION, 0, 1, false, false);
  3145. CS101_ASDU_addInformationObject(asdu, (InformationObject) dc);
  3146. DoubleCommand_destroy(dc);
  3147. CS101_ASDU_encode(asdu, f);
  3148. TEST_ASSERT_EQUAL_INT(10, Frame_getMsgSize(f));
  3149. CS101_ASDU_destroy(asdu);
  3150. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  3151. TEST_ASSERT_EQUAL_INT(1, CS101_ASDU_getNumberOfElements(asdu2));
  3152. DoubleCommand dc_dec = (DoubleCommand) CS101_ASDU_getElement(asdu2, 0);
  3153. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )dc_dec));
  3154. TEST_ASSERT_TRUE(DoubleCommand_isSelect(dc_dec));
  3155. TEST_ASSERT_EQUAL_INT(1, DoubleCommand_getState(dc_dec));
  3156. TEST_ASSERT_EQUAL_INT(0, DoubleCommand_getQU(dc_dec));
  3157. DoubleCommand_destroy(dc_dec);
  3158. CS101_ASDU_destroy(asdu2);
  3159. }
  3160. void
  3161. test_DoubleCommandWithCP56Time2a(void)
  3162. {
  3163. DoubleCommandWithCP56Time2a dc;
  3164. uint64_t time1 = Hal_getTimeInMs();
  3165. struct sCP56Time2a cpTime1;
  3166. CP56Time2a_createFromMsTimestamp(&cpTime1, time1);
  3167. dc = DoubleCommandWithCP56Time2a_create(NULL, 101, 1, true, 0, &cpTime1);
  3168. TEST_ASSERT_TRUE(DoubleCommandWithCP56Time2a_isSelect(dc));
  3169. TEST_ASSERT_EQUAL_INT(1, DoubleCommandWithCP56Time2a_getState(dc));
  3170. TEST_ASSERT_EQUAL_INT(0, DoubleCommandWithCP56Time2a_getQU(dc));
  3171. uint8_t buffer[256];
  3172. struct sBufferFrame bf;
  3173. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  3174. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_ACTIVATION, 0, 1, false, false);
  3175. CS101_ASDU_addInformationObject(asdu, (InformationObject) dc);
  3176. DoubleCommandWithCP56Time2a_destroy(dc);
  3177. CS101_ASDU_encode(asdu, f);
  3178. TEST_ASSERT_EQUAL_INT(17, Frame_getMsgSize(f));
  3179. CS101_ASDU_destroy(asdu);
  3180. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  3181. TEST_ASSERT_EQUAL_INT(1, CS101_ASDU_getNumberOfElements(asdu2));
  3182. DoubleCommandWithCP56Time2a dc_dec = (DoubleCommandWithCP56Time2a) CS101_ASDU_getElement(asdu2, 0);
  3183. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )dc_dec));
  3184. TEST_ASSERT_TRUE(DoubleCommandWithCP56Time2a_isSelect(dc_dec));
  3185. TEST_ASSERT_EQUAL_INT(1, DoubleCommandWithCP56Time2a_getState(dc_dec));
  3186. TEST_ASSERT_EQUAL_INT(0, DoubleCommandWithCP56Time2a_getQU(dc_dec));
  3187. TEST_ASSERT_EQUAL_UINT64(time1, CP56Time2a_toMsTimestamp(DoubleCommandWithCP56Time2a_getTimestamp(dc_dec)));
  3188. DoubleCommandWithCP56Time2a_destroy(dc_dec);
  3189. CS101_ASDU_destroy(asdu2);
  3190. }
  3191. void
  3192. test_StepCommandValue(void)
  3193. {
  3194. StepCommand scv;
  3195. scv = StepCommand_create(NULL, 101, IEC60870_STEP_INVALID_0, true, 0);
  3196. TEST_ASSERT_TRUE(StepCommand_isSelect(scv));
  3197. TEST_ASSERT_EQUAL_INT(IEC60870_STEP_INVALID_0, StepCommand_getState(scv));
  3198. TEST_ASSERT_EQUAL_INT(0, StepCommand_getQU(scv));
  3199. uint8_t buffer[256];
  3200. struct sBufferFrame bf;
  3201. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  3202. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_ACTIVATION, 0, 1, false, false);
  3203. CS101_ASDU_addInformationObject(asdu, (InformationObject) scv);
  3204. StepCommand_destroy(scv);
  3205. CS101_ASDU_encode(asdu, f);
  3206. TEST_ASSERT_EQUAL_INT(10, Frame_getMsgSize(f));
  3207. CS101_ASDU_destroy(asdu);
  3208. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  3209. TEST_ASSERT_EQUAL_INT(1, CS101_ASDU_getNumberOfElements(asdu2));
  3210. StepCommand scv_dec = (StepCommand) CS101_ASDU_getElement(asdu2, 0);
  3211. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )scv_dec));
  3212. TEST_ASSERT_TRUE(StepCommand_isSelect(scv_dec));
  3213. TEST_ASSERT_EQUAL_INT(IEC60870_STEP_INVALID_0, StepCommand_getState(scv_dec));
  3214. TEST_ASSERT_EQUAL_INT(0, StepCommand_getQU(scv_dec));
  3215. StepCommand_destroy(scv_dec);
  3216. CS101_ASDU_destroy(asdu2);
  3217. }
  3218. void
  3219. test_StepCommandWithCP56Time2a(void)
  3220. {
  3221. StepCommandWithCP56Time2a scv;
  3222. uint64_t time1 = Hal_getTimeInMs();
  3223. struct sCP56Time2a cpTime1;
  3224. CP56Time2a_createFromMsTimestamp(&cpTime1, time1);
  3225. scv = StepCommandWithCP56Time2a_create(NULL, 101, IEC60870_STEP_INVALID_0, true, 0, &cpTime1);
  3226. TEST_ASSERT_TRUE(StepCommandWithCP56Time2a_isSelect(scv));
  3227. TEST_ASSERT_EQUAL_INT(IEC60870_STEP_INVALID_0, StepCommandWithCP56Time2a_getState(scv));
  3228. TEST_ASSERT_EQUAL_INT(0, StepCommandWithCP56Time2a_getQU(scv));
  3229. uint8_t buffer[256];
  3230. struct sBufferFrame bf;
  3231. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  3232. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_ACTIVATION, 0, 1, false, false);
  3233. CS101_ASDU_addInformationObject(asdu, (InformationObject) scv);
  3234. StepCommandWithCP56Time2a_destroy((StepCommandWithCP56Time2a) scv);
  3235. CS101_ASDU_encode(asdu, f);
  3236. TEST_ASSERT_EQUAL_INT(17, Frame_getMsgSize(f));
  3237. CS101_ASDU_destroy(asdu);
  3238. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  3239. TEST_ASSERT_EQUAL_INT(1, CS101_ASDU_getNumberOfElements(asdu2));
  3240. StepCommandWithCP56Time2a scv_dec = (StepCommandWithCP56Time2a) CS101_ASDU_getElement(asdu2, 0);
  3241. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )scv_dec));
  3242. TEST_ASSERT_TRUE(StepCommandWithCP56Time2a_isSelect(scv_dec));
  3243. TEST_ASSERT_EQUAL_INT(IEC60870_STEP_INVALID_0, StepCommandWithCP56Time2a_getState(scv_dec));
  3244. TEST_ASSERT_EQUAL_INT(0, StepCommandWithCP56Time2a_getQU(scv_dec));
  3245. TEST_ASSERT_EQUAL_UINT64(time1, CP56Time2a_toMsTimestamp(StepCommandWithCP56Time2a_getTimestamp(scv_dec)));
  3246. StepCommandWithCP56Time2a_destroy((StepCommandWithCP56Time2a) scv_dec);
  3247. CS101_ASDU_destroy(asdu2);
  3248. }
  3249. void
  3250. test_SetpointCommandNormalized(void)
  3251. {
  3252. SetpointCommandNormalized spcn;
  3253. spcn = SetpointCommandNormalized_create(NULL, 101, -1, true, 0);
  3254. TEST_ASSERT_EQUAL_INT(-1, SetpointCommandNormalized_getValue(spcn));
  3255. TEST_ASSERT_EQUAL_INT(0, SetpointCommandNormalized_getQL(spcn));
  3256. TEST_ASSERT_TRUE(SetpointCommandNormalized_isSelect(spcn));
  3257. uint8_t buffer[256];
  3258. struct sBufferFrame bf;
  3259. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  3260. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_ACTIVATION, 0, 1, false, false);
  3261. CS101_ASDU_addInformationObject(asdu, (InformationObject) spcn);
  3262. SetpointCommandNormalized_destroy(spcn);
  3263. CS101_ASDU_encode(asdu, f);
  3264. TEST_ASSERT_EQUAL_INT(12, Frame_getMsgSize(f));
  3265. CS101_ASDU_destroy(asdu);
  3266. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  3267. TEST_ASSERT_EQUAL_INT(1, CS101_ASDU_getNumberOfElements(asdu2));
  3268. SetpointCommandNormalized spcn_dec = (SetpointCommandNormalized) CS101_ASDU_getElement(asdu2, 0);
  3269. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )spcn_dec));
  3270. TEST_ASSERT_EQUAL_INT(-1, SetpointCommandNormalized_getValue(spcn_dec));
  3271. TEST_ASSERT_EQUAL_INT(0, SetpointCommandNormalized_getQL(spcn_dec));
  3272. TEST_ASSERT_TRUE(SetpointCommandNormalized_isSelect(spcn_dec));
  3273. SetpointCommandNormalized_destroy(spcn_dec);
  3274. CS101_ASDU_destroy(asdu2);
  3275. }
  3276. void
  3277. test_SetpointCommandNormalizedWithCP56Time2a(void)
  3278. {
  3279. SetpointCommandNormalizedWithCP56Time2a spcn;
  3280. uint64_t time1 = Hal_getTimeInMs();
  3281. struct sCP56Time2a cpTime1;
  3282. CP56Time2a_createFromMsTimestamp(&cpTime1, time1);
  3283. spcn = SetpointCommandNormalizedWithCP56Time2a_create(NULL, 101, 0, true, 0, &cpTime1);
  3284. TEST_ASSERT_EQUAL_INT(0, SetpointCommandNormalizedWithCP56Time2a_getValue(spcn));
  3285. TEST_ASSERT_EQUAL_INT(0, SetpointCommandNormalizedWithCP56Time2a_getQL(spcn));
  3286. TEST_ASSERT_TRUE(SetpointCommandNormalizedWithCP56Time2a_isSelect(spcn));
  3287. uint8_t buffer[256];
  3288. struct sBufferFrame bf;
  3289. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  3290. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_ACTIVATION, 0, 1, false, false);
  3291. CS101_ASDU_addInformationObject(asdu, (InformationObject) spcn);
  3292. SetpointCommandNormalizedWithCP56Time2a_destroy(spcn);
  3293. CS101_ASDU_encode(asdu, f);
  3294. TEST_ASSERT_EQUAL_INT(19, Frame_getMsgSize(f));
  3295. CS101_ASDU_destroy(asdu);
  3296. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  3297. TEST_ASSERT_EQUAL_INT(1, CS101_ASDU_getNumberOfElements(asdu2));
  3298. SetpointCommandNormalizedWithCP56Time2a spcn_dec = (SetpointCommandNormalizedWithCP56Time2a) CS101_ASDU_getElement(asdu2, 0);
  3299. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )spcn_dec));
  3300. TEST_ASSERT_EQUAL_INT(0, SetpointCommandNormalizedWithCP56Time2a_getValue(spcn_dec));
  3301. TEST_ASSERT_EQUAL_INT(0, SetpointCommandNormalizedWithCP56Time2a_getQL(spcn_dec));
  3302. TEST_ASSERT_TRUE(SetpointCommandNormalizedWithCP56Time2a_isSelect(spcn_dec));
  3303. TEST_ASSERT_EQUAL_UINT64(time1, CP56Time2a_toMsTimestamp(SetpointCommandNormalizedWithCP56Time2a_getTimestamp(spcn_dec)));
  3304. SetpointCommandNormalizedWithCP56Time2a_destroy(spcn_dec);
  3305. CS101_ASDU_destroy(asdu2);
  3306. }
  3307. void
  3308. test_SetpointCommandScaled(void)
  3309. {
  3310. SetpointCommandScaled spcs;
  3311. spcs = SetpointCommandScaled_create(NULL, 101, -32768, true, 0);
  3312. TEST_ASSERT_EQUAL_INT(-32768, SetpointCommandScaled_getValue(spcs));
  3313. TEST_ASSERT_EQUAL_INT(0, SetpointCommandScaled_getQL(spcs));
  3314. TEST_ASSERT_TRUE(SetpointCommandScaled_isSelect(spcs));
  3315. uint8_t buffer[256];
  3316. struct sBufferFrame bf;
  3317. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  3318. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_ACTIVATION, 0, 1, false, false);
  3319. CS101_ASDU_addInformationObject(asdu, (InformationObject) spcs);
  3320. SetpointCommandScaled_destroy(spcs);
  3321. CS101_ASDU_encode(asdu, f);
  3322. TEST_ASSERT_EQUAL_INT(12, Frame_getMsgSize(f));
  3323. CS101_ASDU_destroy(asdu);
  3324. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  3325. TEST_ASSERT_EQUAL_INT(1, CS101_ASDU_getNumberOfElements(asdu2));
  3326. SetpointCommandScaled spcs_dec = (SetpointCommandScaled) CS101_ASDU_getElement(asdu2, 0);
  3327. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )spcs_dec));
  3328. TEST_ASSERT_EQUAL_INT(-32768, SetpointCommandScaled_getValue(spcs_dec));
  3329. TEST_ASSERT_EQUAL_INT(0, SetpointCommandScaled_getQL(spcs_dec));
  3330. TEST_ASSERT_TRUE(SetpointCommandScaled_isSelect(spcs_dec));
  3331. SetpointCommandScaled_destroy(spcs_dec);
  3332. CS101_ASDU_destroy(asdu2);
  3333. }
  3334. void
  3335. test_SetpointCommandScaledWithCP56Time2a(void)
  3336. {
  3337. SetpointCommandScaledWithCP56Time2a spcs;
  3338. uint64_t time1 = Hal_getTimeInMs();
  3339. struct sCP56Time2a cpTime1;
  3340. CP56Time2a_createFromMsTimestamp(&cpTime1, time1);
  3341. spcs = SetpointCommandScaledWithCP56Time2a_create(NULL, 101, -32768, true, 0, &cpTime1);
  3342. TEST_ASSERT_EQUAL_INT(-32768, SetpointCommandScaledWithCP56Time2a_getValue(spcs));
  3343. TEST_ASSERT_EQUAL_INT(0, SetpointCommandScaledWithCP56Time2a_getQL(spcs));
  3344. TEST_ASSERT_TRUE(SetpointCommandScaledWithCP56Time2a_isSelect(spcs));
  3345. uint8_t buffer[256];
  3346. struct sBufferFrame bf;
  3347. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  3348. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_ACTIVATION, 0, 1, false, false);
  3349. CS101_ASDU_addInformationObject(asdu, (InformationObject) spcs);
  3350. SetpointCommandScaledWithCP56Time2a_destroy(spcs);
  3351. CS101_ASDU_encode(asdu, f);
  3352. TEST_ASSERT_EQUAL_INT(19, Frame_getMsgSize(f));
  3353. CS101_ASDU_destroy(asdu);
  3354. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  3355. TEST_ASSERT_EQUAL_INT(1, CS101_ASDU_getNumberOfElements(asdu2));
  3356. SetpointCommandScaledWithCP56Time2a spcs_dec = (SetpointCommandScaledWithCP56Time2a) CS101_ASDU_getElement(asdu2, 0);
  3357. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )spcs_dec));
  3358. TEST_ASSERT_EQUAL_INT(-32768, SetpointCommandScaledWithCP56Time2a_getValue(spcs_dec));
  3359. TEST_ASSERT_EQUAL_INT(0, SetpointCommandScaledWithCP56Time2a_getQL(spcs_dec));
  3360. TEST_ASSERT_TRUE(SetpointCommandScaledWithCP56Time2a_isSelect(spcs_dec));
  3361. TEST_ASSERT_EQUAL_UINT64(time1, CP56Time2a_toMsTimestamp(SetpointCommandScaledWithCP56Time2a_getTimestamp(spcs_dec)));
  3362. SetpointCommandScaledWithCP56Time2a_destroy(spcs_dec);
  3363. CS101_ASDU_destroy(asdu2);
  3364. }
  3365. void
  3366. test_SetpointCommandShort(void)
  3367. {
  3368. SetpointCommandShort spcs;
  3369. spcs = SetpointCommandShort_create(NULL, 101, 10.5f, true, 0);
  3370. TEST_ASSERT_EQUAL_FLOAT(10.5f, SetpointCommandShort_getValue(spcs));
  3371. TEST_ASSERT_EQUAL_INT(0, SetpointCommandShort_getQL(spcs));
  3372. TEST_ASSERT_TRUE(SetpointCommandShort_isSelect(spcs));
  3373. uint8_t buffer[256];
  3374. struct sBufferFrame bf;
  3375. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  3376. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_ACTIVATION, 0, 1, false, false);
  3377. CS101_ASDU_addInformationObject(asdu, (InformationObject) spcs);
  3378. SetpointCommandShort_destroy(spcs);
  3379. CS101_ASDU_encode(asdu, f);
  3380. TEST_ASSERT_EQUAL_INT(14, Frame_getMsgSize(f));
  3381. CS101_ASDU_destroy(asdu);
  3382. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  3383. TEST_ASSERT_EQUAL_INT(1, CS101_ASDU_getNumberOfElements(asdu2));
  3384. SetpointCommandShort spcs_dec = (SetpointCommandShort) CS101_ASDU_getElement(asdu2, 0);
  3385. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )spcs_dec));
  3386. TEST_ASSERT_EQUAL_FLOAT(10.5f, SetpointCommandShort_getValue(spcs_dec));
  3387. TEST_ASSERT_EQUAL_INT(0, SetpointCommandShort_getQL(spcs_dec));
  3388. TEST_ASSERT_TRUE(SetpointCommandShort_isSelect(spcs_dec));
  3389. SetpointCommandShort_destroy(spcs_dec);
  3390. CS101_ASDU_destroy(asdu2);
  3391. }
  3392. void
  3393. test_SetpointCommandShortWithCP56Time2a(void)
  3394. {
  3395. SetpointCommandShortWithCP56Time2a spcs;
  3396. uint64_t time1 = Hal_getTimeInMs();
  3397. struct sCP56Time2a cpTime1;
  3398. CP56Time2a_createFromMsTimestamp(&cpTime1, time1);
  3399. spcs = SetpointCommandShortWithCP56Time2a_create(NULL, 101, 10.5f, true, 0, &cpTime1);
  3400. TEST_ASSERT_EQUAL_FLOAT(10.5f, SetpointCommandShortWithCP56Time2a_getValue(spcs));
  3401. TEST_ASSERT_EQUAL_INT(0, SetpointCommandShortWithCP56Time2a_getQL(spcs));
  3402. TEST_ASSERT_TRUE(SetpointCommandShortWithCP56Time2a_isSelect(spcs));
  3403. uint8_t buffer[256];
  3404. struct sBufferFrame bf;
  3405. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  3406. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_ACTIVATION, 0, 1, false, false);
  3407. CS101_ASDU_addInformationObject(asdu, (InformationObject) spcs);
  3408. SetpointCommandShortWithCP56Time2a_destroy(spcs);
  3409. CS101_ASDU_encode(asdu, f);
  3410. TEST_ASSERT_EQUAL_INT(21, Frame_getMsgSize(f));
  3411. CS101_ASDU_destroy(asdu);
  3412. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  3413. TEST_ASSERT_EQUAL_INT(1, CS101_ASDU_getNumberOfElements(asdu2));
  3414. SetpointCommandShortWithCP56Time2a spcs_dec = (SetpointCommandShortWithCP56Time2a) CS101_ASDU_getElement(asdu2, 0);
  3415. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )spcs_dec));
  3416. TEST_ASSERT_EQUAL_FLOAT(10.5f, SetpointCommandShortWithCP56Time2a_getValue(spcs_dec));
  3417. TEST_ASSERT_EQUAL_INT(0, SetpointCommandShortWithCP56Time2a_getQL(spcs_dec));
  3418. TEST_ASSERT_TRUE(SetpointCommandShortWithCP56Time2a_isSelect(spcs_dec));
  3419. TEST_ASSERT_EQUAL_UINT64(time1, CP56Time2a_toMsTimestamp(SetpointCommandShortWithCP56Time2a_getTimestamp(spcs_dec)));
  3420. SetpointCommandShortWithCP56Time2a_destroy(spcs_dec);
  3421. CS101_ASDU_destroy(asdu2);
  3422. }
  3423. void
  3424. test_InterrogationCommand(void)
  3425. {
  3426. InterrogationCommand ic;
  3427. uint8_t qoi = 21;
  3428. ic = InterrogationCommand_create(NULL, 101, qoi);
  3429. TEST_ASSERT_EQUAL_INT(21, InterrogationCommand_getQOI(ic));
  3430. uint8_t buffer[256];
  3431. struct sBufferFrame bf;
  3432. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  3433. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_ACTIVATION, 0, 1, false, false);
  3434. CS101_ASDU_addInformationObject(asdu, (InformationObject) ic);
  3435. InterrogationCommand_destroy(ic);
  3436. CS101_ASDU_encode(asdu, f);
  3437. TEST_ASSERT_EQUAL_INT(10, Frame_getMsgSize(f));
  3438. CS101_ASDU_destroy(asdu);
  3439. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  3440. TEST_ASSERT_EQUAL_INT(1, CS101_ASDU_getNumberOfElements(asdu2));
  3441. InterrogationCommand ic_dec = (InterrogationCommand) CS101_ASDU_getElement(asdu2, 0);
  3442. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )ic_dec));
  3443. TEST_ASSERT_EQUAL_INT(21, InterrogationCommand_getQOI(ic_dec));
  3444. InterrogationCommand_destroy(ic_dec);
  3445. CS101_ASDU_destroy(asdu2);
  3446. }
  3447. void
  3448. test_CounterInterrogationCommand(void)
  3449. {
  3450. CounterInterrogationCommand cic;
  3451. uint8_t qcc = 1;
  3452. cic = CounterInterrogationCommand_create(NULL, 101, qcc);
  3453. TEST_ASSERT_EQUAL_INT(1, CounterInterrogationCommand_getQCC(cic));
  3454. uint8_t buffer[256];
  3455. struct sBufferFrame bf;
  3456. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  3457. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_ACTIVATION, 0, 1, false, false);
  3458. CS101_ASDU_addInformationObject(asdu, (InformationObject) cic);
  3459. CounterInterrogationCommand_destroy(cic);
  3460. CS101_ASDU_encode(asdu, f);
  3461. TEST_ASSERT_EQUAL_INT(10, Frame_getMsgSize(f));
  3462. CS101_ASDU_destroy(asdu);
  3463. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  3464. TEST_ASSERT_EQUAL_INT(1, CS101_ASDU_getNumberOfElements(asdu2));
  3465. CounterInterrogationCommand cic_dec = (CounterInterrogationCommand) CS101_ASDU_getElement(asdu2, 0);
  3466. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )cic_dec));
  3467. TEST_ASSERT_EQUAL_INT(1, CounterInterrogationCommand_getQCC(cic_dec));
  3468. CounterInterrogationCommand_destroy(cic_dec);
  3469. CS101_ASDU_destroy(asdu2);
  3470. }
  3471. void
  3472. test_ReadCommand(void)
  3473. {
  3474. ReadCommand rc;
  3475. rc = ReadCommand_create( NULL, 101);
  3476. uint8_t buffer[256];
  3477. struct sBufferFrame bf;
  3478. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  3479. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_ACTIVATION, 0, 1, false, false);
  3480. CS101_ASDU_addInformationObject(asdu, (InformationObject) rc);
  3481. ReadCommand_destroy(rc);
  3482. CS101_ASDU_encode(asdu, f);
  3483. TEST_ASSERT_EQUAL_INT(9, Frame_getMsgSize(f));
  3484. CS101_ASDU_destroy(asdu);
  3485. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  3486. TEST_ASSERT_EQUAL_INT(1, CS101_ASDU_getNumberOfElements(asdu2));
  3487. ReadCommand rc_dec = (ReadCommand) CS101_ASDU_getElement(asdu2, 0);
  3488. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )rc_dec));
  3489. ReadCommand_destroy(rc_dec);
  3490. CS101_ASDU_destroy(asdu2);
  3491. }
  3492. void
  3493. test_ClockSynchronizationCommand(void)
  3494. {
  3495. ClockSynchronizationCommand csc;
  3496. uint64_t time1 = Hal_getTimeInMs();
  3497. struct sCP56Time2a cpTime1;
  3498. CP56Time2a_createFromMsTimestamp(&cpTime1, time1);
  3499. csc = ClockSynchronizationCommand_create(NULL, 101, &cpTime1);
  3500. uint8_t buffer[256];
  3501. struct sBufferFrame bf;
  3502. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  3503. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_ACTIVATION, 0, 1, false, false);
  3504. CS101_ASDU_addInformationObject(asdu, (InformationObject) csc);
  3505. ClockSynchronizationCommand_destroy(csc);
  3506. CS101_ASDU_encode(asdu, f);
  3507. TEST_ASSERT_EQUAL_INT(16, Frame_getMsgSize(f));
  3508. CS101_ASDU_destroy(asdu);
  3509. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  3510. TEST_ASSERT_EQUAL_INT(1, CS101_ASDU_getNumberOfElements(asdu2));
  3511. ClockSynchronizationCommand csc_dec = (ClockSynchronizationCommand) CS101_ASDU_getElement(asdu2, 0);
  3512. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )csc_dec));
  3513. TEST_ASSERT_EQUAL_UINT64(time1, CP56Time2a_toMsTimestamp(ClockSynchronizationCommand_getTime(csc_dec)));
  3514. ClockSynchronizationCommand_destroy(csc_dec);
  3515. CS101_ASDU_destroy(asdu2);
  3516. }
  3517. void
  3518. test_ResetProcessCommand(void)
  3519. {
  3520. ResetProcessCommand rpc;
  3521. uint8_t qrp = 0;
  3522. rpc = ResetProcessCommand_create(NULL, 101, qrp);
  3523. TEST_ASSERT_EQUAL_INT(0, ResetProcessCommand_getQRP(rpc));
  3524. uint8_t buffer[256];
  3525. struct sBufferFrame bf;
  3526. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  3527. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_ACTIVATION, 0, 1, false, false);
  3528. CS101_ASDU_addInformationObject(asdu, (InformationObject) rpc);
  3529. ResetProcessCommand_destroy(rpc);
  3530. CS101_ASDU_encode(asdu, f);
  3531. TEST_ASSERT_EQUAL_INT(10, Frame_getMsgSize(f));
  3532. CS101_ASDU_destroy(asdu);
  3533. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  3534. TEST_ASSERT_EQUAL_INT(1, CS101_ASDU_getNumberOfElements(asdu2));
  3535. ResetProcessCommand rpc_dec = (ResetProcessCommand) CS101_ASDU_getElement(asdu2, 0);
  3536. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )rpc_dec));
  3537. TEST_ASSERT_EQUAL_INT(0, ResetProcessCommand_getQRP(rpc_dec));
  3538. ResetProcessCommand_destroy(rpc_dec);
  3539. CS101_ASDU_destroy(asdu2);
  3540. }
  3541. void
  3542. test_DelayAcquisitionCommand(void)
  3543. {
  3544. DelayAcquisitionCommand dac;
  3545. uint64_t time1 = Hal_getTimeInMs();
  3546. struct sCP16Time2a delay;
  3547. bzero(&delay, sizeof(struct sCP16Time2a));
  3548. CP16Time2a_setEplapsedTimeInMs(&delay, 24123);
  3549. dac = DelayAcquisitionCommand_create(NULL, 101, &delay);
  3550. uint8_t buffer[256];
  3551. struct sBufferFrame bf;
  3552. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  3553. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_ACTIVATION, 0, 1, false, false);
  3554. CS101_ASDU_addInformationObject(asdu, (InformationObject) dac);
  3555. DelayAcquisitionCommand_destroy(dac);
  3556. CS101_ASDU_encode(asdu, f);
  3557. TEST_ASSERT_EQUAL_INT(11, Frame_getMsgSize(f));
  3558. CS101_ASDU_destroy(asdu);
  3559. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  3560. TEST_ASSERT_EQUAL_INT(1, CS101_ASDU_getNumberOfElements(asdu2));
  3561. DelayAcquisitionCommand dac_dec = (DelayAcquisitionCommand) CS101_ASDU_getElement(asdu2, 0);
  3562. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )dac_dec));
  3563. CP16Time2a time1_dec = DelayAcquisitionCommand_getDelay(dac_dec);
  3564. TEST_ASSERT_EQUAL_INT(24123, CP16Time2a_getEplapsedTimeInMs(time1_dec));
  3565. DelayAcquisitionCommand_destroy(dac_dec);
  3566. CS101_ASDU_destroy(asdu2);
  3567. }
  3568. void
  3569. test_BitString32(void)
  3570. {
  3571. BitString32 bs32;
  3572. bs32 = BitString32_createEx(NULL, 101, 0xaaaa, IEC60870_QUALITY_INVALID);
  3573. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, BitString32_getQuality(bs32));
  3574. BitString32_destroy(bs32);
  3575. bs32 = BitString32_create(NULL, 101, 0xaaaa);
  3576. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, BitString32_getQuality(bs32));
  3577. BitString32_destroy(bs32);
  3578. bs32 = BitString32_createEx(NULL, 101, 0xaaaa, IEC60870_QUALITY_INVALID | IEC60870_QUALITY_NON_TOPICAL);
  3579. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID + IEC60870_QUALITY_NON_TOPICAL, BitString32_getQuality(bs32));
  3580. TEST_ASSERT_EQUAL_UINT32(0xaaaa, BitString32_getValue(bs32));
  3581. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject ) bs32));
  3582. BitString32_destroy(bs32);
  3583. Bitstring32WithCP24Time2a bs32cp24;
  3584. struct sCP24Time2a cp24;
  3585. bs32cp24 = Bitstring32WithCP24Time2a_createEx(NULL, 100002, 0xbbbb, IEC60870_QUALITY_INVALID, &cp24);
  3586. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID, BitString32_getQuality((BitString32 )bs32cp24));
  3587. TEST_ASSERT_EQUAL_UINT32(0xbbbb, BitString32_getValue((BitString32 )bs32cp24));
  3588. TEST_ASSERT_EQUAL_INT(100002, InformationObject_getObjectAddress((InformationObject ) bs32cp24));
  3589. Bitstring32WithCP24Time2a_destroy(bs32cp24);
  3590. bs32cp24 = Bitstring32WithCP24Time2a_create(NULL, 100002, 0xbbbb, &cp24);
  3591. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, BitString32_getQuality((BitString32 )bs32cp24));
  3592. TEST_ASSERT_EQUAL_UINT32(0xbbbb, BitString32_getValue((BitString32 )bs32cp24));
  3593. TEST_ASSERT_EQUAL_INT(100002, InformationObject_getObjectAddress((InformationObject ) bs32cp24));
  3594. Bitstring32WithCP24Time2a_destroy(bs32cp24);
  3595. Bitstring32WithCP56Time2a bs32cp56;
  3596. struct sCP56Time2a cp56;
  3597. bs32cp56 = Bitstring32WithCP56Time2a_createEx(NULL, 1000002, 0xcccc, IEC60870_QUALITY_INVALID | IEC60870_QUALITY_NON_TOPICAL, &cp56);
  3598. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_INVALID + IEC60870_QUALITY_NON_TOPICAL, BitString32_getQuality((BitString32 )bs32cp56));
  3599. TEST_ASSERT_EQUAL_UINT32(0xcccc, BitString32_getValue((BitString32 )bs32cp56));
  3600. TEST_ASSERT_EQUAL_INT(1000002, InformationObject_getObjectAddress((InformationObject ) bs32cp56));
  3601. Bitstring32WithCP56Time2a_destroy(bs32cp56);
  3602. bs32cp56 = Bitstring32WithCP56Time2a_create(NULL, 1000002, 0xcccc, &cp56);
  3603. TEST_ASSERT_EQUAL_UINT8(IEC60870_QUALITY_GOOD, BitString32_getQuality((BitString32 )bs32cp56));
  3604. TEST_ASSERT_EQUAL_UINT32(0xcccc, BitString32_getValue((BitString32 )bs32cp56));
  3605. TEST_ASSERT_EQUAL_INT(1000002, InformationObject_getObjectAddress((InformationObject ) bs32cp56));
  3606. Bitstring32WithCP56Time2a_destroy(bs32cp56);
  3607. }
  3608. void
  3609. test_Bitstring32CommandWithCP56Time2a(void)
  3610. {
  3611. Bitstring32CommandWithCP56Time2a bsc;
  3612. uint64_t time1 = Hal_getTimeInMs();
  3613. struct sCP56Time2a cpTime1;
  3614. CP56Time2a_createFromMsTimestamp(&cpTime1, time1);
  3615. bsc = Bitstring32CommandWithCP56Time2a_create(NULL, 101, (uint32_t) 0x0000000000, &cpTime1);
  3616. TEST_ASSERT_EQUAL_UINT32(0x0000000000, Bitstring32CommandWithCP56Time2a_getValue(bsc));
  3617. uint8_t buffer[256];
  3618. struct sBufferFrame bf;
  3619. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  3620. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_ACTIVATION, 0, 1, false, false);
  3621. CS101_ASDU_addInformationObject(asdu, (InformationObject) bsc);
  3622. Bitstring32CommandWithCP56Time2a_destroy(bsc);
  3623. CS101_ASDU_encode(asdu, f);
  3624. TEST_ASSERT_EQUAL_INT(20, Frame_getMsgSize(f));
  3625. CS101_ASDU_destroy(asdu);
  3626. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  3627. TEST_ASSERT_EQUAL_INT(1, CS101_ASDU_getNumberOfElements(asdu2));
  3628. Bitstring32CommandWithCP56Time2a bsc_dec = (Bitstring32CommandWithCP56Time2a) CS101_ASDU_getElement(asdu2, 0);
  3629. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )bsc_dec));
  3630. TEST_ASSERT_EQUAL_UINT64(time1, CP56Time2a_toMsTimestamp(Bitstring32CommandWithCP56Time2a_getTimestamp(bsc_dec)));
  3631. TEST_ASSERT_EQUAL_UINT32(0x0000000000, Bitstring32CommandWithCP56Time2a_getValue(bsc_dec));
  3632. Bitstring32CommandWithCP56Time2a_destroy(bsc_dec);
  3633. CS101_ASDU_destroy(asdu2);
  3634. }
  3635. void
  3636. test_QueryLog(void)
  3637. {
  3638. QueryLog queryLog;
  3639. uint64_t stopTime = Hal_getTimeInMs();
  3640. uint64_t startTime = stopTime - 2000;
  3641. struct sCP56Time2a rangeStartTime;
  3642. struct sCP56Time2a rangeStopTime;
  3643. CP56Time2a_createFromMsTimestamp(&rangeStartTime, startTime);
  3644. CP56Time2a_createFromMsTimestamp(&rangeStopTime, stopTime);
  3645. queryLog = QueryLog_create(NULL, 101, 256, &rangeStartTime, &rangeStopTime);
  3646. TEST_ASSERT_EQUAL_UINT16(256, QueryLog_getNOF(queryLog));
  3647. uint8_t buffer[256];
  3648. struct sBufferFrame bf;
  3649. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  3650. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_ACTIVATION, 0, 1, false, false);
  3651. CS101_ASDU_addInformationObject(asdu, (InformationObject) queryLog);
  3652. QueryLog_destroy(queryLog);
  3653. CS101_ASDU_encode(asdu, f);
  3654. TEST_ASSERT_EQUAL_INT(25, Frame_getMsgSize(f));
  3655. CS101_ASDU_destroy(asdu);
  3656. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  3657. TEST_ASSERT_EQUAL_INT(1, CS101_ASDU_getNumberOfElements(asdu2));
  3658. QueryLog queryLog_dec = (QueryLog) CS101_ASDU_getElement(asdu2, 0);
  3659. TEST_ASSERT_NOT_NULL(queryLog_dec);
  3660. TEST_ASSERT_EQUAL_INT(101, InformationObject_getObjectAddress((InformationObject )queryLog_dec));
  3661. TEST_ASSERT_EQUAL_UINT16(256, QueryLog_getNOF(queryLog_dec));
  3662. TEST_ASSERT_EQUAL_UINT64(startTime, CP56Time2a_toMsTimestamp(QueryLog_getRangeStartTime(queryLog_dec)));
  3663. TEST_ASSERT_EQUAL_UINT64(stopTime, CP56Time2a_toMsTimestamp(QueryLog_getRangeStopTime(queryLog_dec)));
  3664. QueryLog_destroy(queryLog_dec);
  3665. CS101_ASDU_destroy(asdu2);
  3666. }
  3667. void
  3668. test_BitString32xx_encodeDecode(void)
  3669. {
  3670. #ifndef _WIN32
  3671. uint8_t buffer[256];
  3672. struct sBufferFrame bf;
  3673. Frame f = BufferFrame_initialize(&bf, buffer, 0);
  3674. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  3675. BitString32 bs32_1 = BitString32_createEx(NULL, 101, (uint32_t) 0xaaaaaaaaaa, IEC60870_QUALITY_INVALID);
  3676. BitString32 bs32_2 = BitString32_create(NULL, 102, (uint32_t) 0x0000000000);
  3677. BitString32 bs32_3 = BitString32_create(NULL, 103, (uint32_t) 0xffffffffffUL);
  3678. CS101_ASDU_addInformationObject(asdu, (InformationObject) bs32_1);
  3679. CS101_ASDU_addInformationObject(asdu, (InformationObject) bs32_2);
  3680. CS101_ASDU_addInformationObject(asdu, (InformationObject) bs32_3);
  3681. CS101_ASDU_encode(asdu, f);
  3682. InformationObject_destroy((InformationObject) bs32_1);
  3683. InformationObject_destroy((InformationObject) bs32_2);
  3684. InformationObject_destroy((InformationObject) bs32_3);
  3685. CS101_ASDU_destroy(asdu);
  3686. CS101_ASDU asdu2 = CS101_ASDU_createFromBuffer(&defaultAppLayerParameters, buffer, Frame_getMsgSize(f));
  3687. BitString32 bs32_1_dec = (BitString32) CS101_ASDU_getElement(asdu2, 0);
  3688. BitString32 bs32_2_dec = (BitString32) CS101_ASDU_getElement(asdu2, 1);
  3689. BitString32 bs32_3_dec = (BitString32) CS101_ASDU_getElement(asdu2, 2);
  3690. TEST_ASSERT_EQUAL_UINT32(0xaaaaaaaaaaUL, BitString32_getValue(bs32_1_dec));
  3691. TEST_ASSERT_EQUAL_INT(IEC60870_QUALITY_INVALID, BitString32_getQuality(bs32_1_dec));
  3692. TEST_ASSERT_EQUAL_UINT32(0x0000000000UL, BitString32_getValue(bs32_2_dec));
  3693. TEST_ASSERT_EQUAL_INT(IEC60870_QUALITY_GOOD, BitString32_getQuality(bs32_2_dec));
  3694. TEST_ASSERT_EQUAL_UINT32(0xffffffffUL, BitString32_getValue(bs32_3_dec));
  3695. TEST_ASSERT_EQUAL_INT(IEC60870_QUALITY_GOOD, BitString32_getQuality(bs32_3_dec));
  3696. InformationObject_destroy((InformationObject)bs32_1_dec);
  3697. InformationObject_destroy((InformationObject)bs32_2_dec);
  3698. InformationObject_destroy((InformationObject)bs32_3_dec);
  3699. CS101_ASDU_destroy(asdu2);
  3700. #endif
  3701. }
  3702. void
  3703. test_version_number(void)
  3704. {
  3705. Lib60870VersionInfo version = Lib60870_getLibraryVersionInfo();
  3706. TEST_ASSERT_EQUAL_INT(2, version.major);
  3707. TEST_ASSERT_EQUAL_INT(3, version.minor);
  3708. TEST_ASSERT_EQUAL_INT(3, version.patch);
  3709. }
  3710. void
  3711. test_CS104_Slave_CreateDestroy(void)
  3712. {
  3713. CS104_Slave slave = CS104_Slave_create(100, 100);
  3714. TEST_ASSERT_NOT_NULL(slave);
  3715. CS104_Slave_destroy(slave);
  3716. }
  3717. void
  3718. test_CS104_Connection_CreateDestroy(void)
  3719. {
  3720. CS104_Connection con = CS104_Connection_create("127.0.0.1", 2404);
  3721. TEST_ASSERT_NOT_NULL(con);
  3722. CS104_Connection_destroy(con);
  3723. }
  3724. void
  3725. test_CS104_MasterSlave_CreateDestroy(void)
  3726. {
  3727. CS104_Slave slave = CS104_Slave_create(100, 100);
  3728. TEST_ASSERT_NOT_NULL(slave);
  3729. CS104_Slave_setLocalPort(slave, 20004);
  3730. CS104_Connection con = CS104_Connection_create("127.0.0.1", 20004);
  3731. TEST_ASSERT_NOT_NULL(con);
  3732. CS104_Connection_connect(con);
  3733. CS104_Slave_destroy(slave);
  3734. CS104_Connection_destroy(con);
  3735. }
  3736. void
  3737. test_CS104_MasterSlave_CreateDestroyLoop(void)
  3738. {
  3739. CS104_Slave slave = NULL;
  3740. CS104_Connection con = NULL;
  3741. for (int i = 0; i < 1000; i++) {
  3742. slave = CS104_Slave_create(100, 100);
  3743. TEST_ASSERT_NOT_NULL(slave);
  3744. CS104_Slave_setLocalPort(slave, 20004);
  3745. CS104_Slave_start(slave);
  3746. con = CS104_Connection_create("127.0.0.1", 20004);
  3747. TEST_ASSERT_NOT_NULL(con);
  3748. bool result = CS104_Connection_connect(con);
  3749. TEST_ASSERT_TRUE(result);
  3750. CS104_Slave_destroy(slave);
  3751. CS104_Connection_destroy(con);
  3752. }
  3753. }
  3754. void
  3755. test_CS104_Connection_ConnectTimeout(void)
  3756. {
  3757. CS104_Connection con = CS104_Connection_create("192.168.3.120", 2404);
  3758. TEST_ASSERT_NOT_NULL(con);
  3759. bool result = CS104_Connection_connect(con);
  3760. TEST_ASSERT_FALSE(result);
  3761. CS104_Connection_destroy(con);
  3762. }
  3763. void
  3764. test_CS104_Connection_UseAfterClose(void)
  3765. {
  3766. CS104_Slave slave = NULL;
  3767. CS104_Connection con = NULL;
  3768. slave = CS104_Slave_create(100, 100);
  3769. TEST_ASSERT_NOT_NULL(slave);
  3770. CS104_Slave_setLocalPort(slave, 20004);
  3771. CS104_Slave_start(slave);
  3772. con = CS104_Connection_create("127.0.0.1", 20004);
  3773. TEST_ASSERT_NOT_NULL(con);
  3774. bool result = CS104_Connection_connect(con);
  3775. TEST_ASSERT_TRUE(result);
  3776. CS104_Connection_close(con);
  3777. result = CS104_Connection_sendInterrogationCommand(con, CS101_COT_ACTIVATION, 1, IEC60870_QOI_STATION);
  3778. TEST_ASSERT_FALSE(result);
  3779. CS104_Slave_destroy(slave);
  3780. CS104_Connection_destroy(con);
  3781. }
  3782. void
  3783. test_CS104_Connection_UseAfterServerClosedConnection(void)
  3784. {
  3785. CS104_Slave slave = NULL;
  3786. CS104_Connection con = NULL;
  3787. slave = CS104_Slave_create(100, 100);
  3788. TEST_ASSERT_NOT_NULL(slave);
  3789. CS104_Slave_setLocalPort(slave, 20004);
  3790. CS104_Slave_start(slave);
  3791. con = CS104_Connection_create("127.0.0.1", 20004);
  3792. TEST_ASSERT_NOT_NULL(con);
  3793. bool result = CS104_Connection_connect(con);
  3794. TEST_ASSERT_TRUE(result);
  3795. CS104_Slave_destroy(slave);
  3796. /* wait to allow client side to detect connection loss */
  3797. Thread_sleep(500);
  3798. result = CS104_Connection_sendInterrogationCommand(con, CS101_COT_ACTIVATION, 1, IEC60870_QOI_STATION);
  3799. TEST_ASSERT_FALSE(result);
  3800. CS104_Connection_destroy(con);
  3801. }
  3802. static CS104_ConnectionEvent test_CS104_Connection_async_timeout_event;
  3803. static void
  3804. test_CS104_Connection_async_timeout_connectionHandler (void* parameter, CS104_Connection connection, CS104_ConnectionEvent event)
  3805. {
  3806. test_CS104_Connection_async_timeout_event = event;
  3807. }
  3808. void
  3809. test_CS104_Connection_async_success(void)
  3810. {
  3811. test_CS104_Connection_async_timeout_event = CS104_CONNECTION_CLOSED;
  3812. CS104_Slave slave = NULL;
  3813. CS104_Connection con = NULL;
  3814. slave = CS104_Slave_create(100, 100);
  3815. TEST_ASSERT_NOT_NULL(slave);
  3816. CS104_Slave_setLocalPort(slave, 20004);
  3817. CS104_Slave_start(slave);
  3818. con = CS104_Connection_create("127.0.0.1", 20004);
  3819. TEST_ASSERT_NOT_NULL(con);
  3820. CS104_APCIParameters apciParameters = CS104_Connection_getAPCIParameters(con);
  3821. apciParameters->t0 = 1;
  3822. CS104_Connection_setConnectionHandler(con, test_CS104_Connection_async_timeout_connectionHandler, NULL);
  3823. CS104_Connection_connectAsync(con);
  3824. Thread_sleep(500);
  3825. TEST_ASSERT_EQUAL_INT(CS104_CONNECTION_OPENED, test_CS104_Connection_async_timeout_event);
  3826. CS104_Connection_destroy(con);
  3827. CS104_Slave_destroy(slave);
  3828. }
  3829. void
  3830. test_CS104_Connection_async_timeout(void)
  3831. {
  3832. test_CS104_Connection_async_timeout_event = CS104_CONNECTION_CLOSED;
  3833. CS104_Connection con = CS104_Connection_create("192.168.3.120", 2404);
  3834. TEST_ASSERT_NOT_NULL(con);
  3835. CS104_APCIParameters apciParameters = CS104_Connection_getAPCIParameters(con);
  3836. apciParameters->t0 = 1;
  3837. CS104_Connection_setConnectionHandler(con, test_CS104_Connection_async_timeout_connectionHandler, NULL);
  3838. CS104_Connection_connectAsync(con);
  3839. Thread_sleep(2000);
  3840. TEST_ASSERT_EQUAL_INT(CS104_CONNECTION_FAILED, test_CS104_Connection_async_timeout_event);
  3841. CS104_Connection_destroy(con);
  3842. }
  3843. void
  3844. test_CS101_ASDU_addObjectOfWrongType(void)
  3845. {
  3846. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  3847. InformationObject io1 = (InformationObject) SinglePointInformation_create(NULL, 101, true, IEC60870_QUALITY_GOOD);
  3848. bool added = CS101_ASDU_addInformationObject(asdu, io1);
  3849. TEST_ASSERT_TRUE(added);
  3850. InformationObject_destroy(io1);
  3851. InformationObject io2 = (InformationObject) DoublePointInformation_create(NULL, 102, IEC60870_DOUBLE_POINT_OFF, IEC60870_QUALITY_GOOD);
  3852. added = CS101_ASDU_addInformationObject(asdu, io2);
  3853. TEST_ASSERT_FALSE(added);
  3854. InformationObject_destroy(io2);
  3855. CS101_ASDU_destroy(asdu);
  3856. }
  3857. void
  3858. test_CS101_ASDU_addUntilOverflow(void)
  3859. {
  3860. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  3861. int i = 0;
  3862. for (i = 0; i < 60; i++) {
  3863. InformationObject io = (InformationObject) SinglePointInformation_create(NULL, 100 + i, true, IEC60870_QUALITY_GOOD);
  3864. bool added = CS101_ASDU_addInformationObject(asdu, io);
  3865. TEST_ASSERT_TRUE(added);
  3866. InformationObject_destroy(io);
  3867. TEST_ASSERT_EQUAL_INT(i + 1, CS101_ASDU_getNumberOfElements(asdu));
  3868. }
  3869. InformationObject io = (InformationObject) SinglePointInformation_create(NULL, 100 + i, true, IEC60870_QUALITY_GOOD);
  3870. bool added = CS101_ASDU_addInformationObject(asdu, io);
  3871. TEST_ASSERT_FALSE(added);
  3872. InformationObject_destroy(io);
  3873. CS101_ASDU_destroy(asdu);
  3874. }
  3875. void
  3876. test_CS101_ASDU_clone(void)
  3877. {
  3878. CS101_ASDU asdu = CS101_ASDU_create(&defaultAppLayerParameters, false, CS101_COT_PERIODIC, 0, 1, false, false);
  3879. int i = 0;
  3880. for (i = 0; i < 60; i++) {
  3881. InformationObject io = (InformationObject) SinglePointInformation_create(NULL, 100 + i, true, IEC60870_QUALITY_GOOD);
  3882. bool added = CS101_ASDU_addInformationObject(asdu, io);
  3883. TEST_ASSERT_TRUE(added);
  3884. InformationObject_destroy(io);
  3885. TEST_ASSERT_EQUAL_INT(i + 1, CS101_ASDU_getNumberOfElements(asdu));
  3886. }
  3887. CS101_ASDU clonedAsdu = CS101_ASDU_clone(asdu, NULL);
  3888. TEST_ASSERT_NOT_NULL(clonedAsdu);
  3889. TEST_ASSERT_EQUAL_INT(CS101_ASDU_getCA(asdu), CS101_ASDU_getCA(clonedAsdu));
  3890. TEST_ASSERT_EQUAL_INT(CS101_ASDU_getOA(asdu), CS101_ASDU_getOA(clonedAsdu));
  3891. TEST_ASSERT_EQUAL_INT(CS101_ASDU_getCOT(asdu), CS101_ASDU_getCOT(clonedAsdu));
  3892. TEST_ASSERT_EQUAL_INT(CS101_ASDU_getTypeID(asdu), CS101_ASDU_getTypeID(clonedAsdu));
  3893. TEST_ASSERT_EQUAL_INT(CS101_ASDU_getNumberOfElements(asdu), CS101_ASDU_getNumberOfElements(clonedAsdu));
  3894. TEST_ASSERT_EQUAL_INT(CS101_ASDU_getPayloadSize(asdu), CS101_ASDU_getPayloadSize(clonedAsdu));
  3895. TEST_ASSERT_EQUAL_INT(0, memcmp(CS101_ASDU_getPayload(asdu), CS101_ASDU_getPayload(clonedAsdu), CS101_ASDU_getPayloadSize(clonedAsdu)));
  3896. CS101_ASDU_destroy(asdu);
  3897. CS101_ASDU_destroy(clonedAsdu);
  3898. }
  3899. #if (CONFIG_CS104_SUPPORT_TLS == 1)
  3900. struct secEventInfo {
  3901. int eventHandlerCalled;
  3902. int eventCodes[100];
  3903. };
  3904. static void
  3905. securityEventHandler(void* parameter, TLSEventLevel eventLevel, int eventCode, const char* msg, TLSConnection con)
  3906. {
  3907. struct secEventInfo* eventInfo = (struct secEventInfo*)parameter;
  3908. char peerAddrBuf[60];
  3909. char* peerAddr = NULL;
  3910. const char* tlsVersion = "unknown";
  3911. if (con) {
  3912. peerAddr = TLSConnection_getPeerAddress(con, peerAddrBuf);
  3913. tlsVersion = TLSConfigVersion_toString(TLSConnection_getTLSVersion(con));
  3914. }
  3915. printf("[SECURITY EVENT] %s (t: %i, c: %i, version: %s remote-ip: %s)\n", msg, eventLevel, eventCode, tlsVersion, peerAddr);
  3916. if (eventInfo) {
  3917. eventInfo->eventCodes[eventInfo->eventHandlerCalled] = eventCode;
  3918. eventInfo->eventHandlerCalled++;
  3919. }
  3920. }
  3921. void
  3922. test_CS104_MasterSlave_TLSConnectSuccess(void)
  3923. {
  3924. bool res = false;
  3925. TLSConfiguration tlsConfig1 = TLSConfiguration_create();
  3926. TLSConfiguration_setEventHandler(tlsConfig1, securityEventHandler, NULL);
  3927. TLSConfiguration_setChainValidation(tlsConfig1, true);
  3928. res = TLSConfiguration_setOwnKeyFromFile(tlsConfig1, "server_CA1_1.key", NULL);
  3929. TEST_ASSERT_TRUE(res);
  3930. res = TLSConfiguration_setOwnCertificateFromFile(tlsConfig1, "server_CA1_1.pem");
  3931. TEST_ASSERT_TRUE(res);
  3932. res = TLSConfiguration_addCACertificateFromFile(tlsConfig1, "root_CA1.pem");
  3933. TEST_ASSERT_TRUE(res);
  3934. TLSConfiguration tlsConfig2 = TLSConfiguration_create();
  3935. TLSConfiguration_setChainValidation(tlsConfig2, true);
  3936. TLSConfiguration_setAllowOnlyKnownCertificates(tlsConfig2, true);
  3937. /* use valid certificate */
  3938. res = TLSConfiguration_setOwnKeyFromFile(tlsConfig2, "client_CA1_3.key", NULL);
  3939. TEST_ASSERT_TRUE(res);
  3940. res = TLSConfiguration_setOwnCertificateFromFile(tlsConfig2, "client_CA1_3.pem");
  3941. TEST_ASSERT_TRUE(res);
  3942. res = TLSConfiguration_addCACertificateFromFile(tlsConfig2, "root_CA1.pem");
  3943. TEST_ASSERT_TRUE(res);
  3944. res = TLSConfiguration_addAllowedCertificateFromFile(tlsConfig2, "server_CA1_1.pem");
  3945. TEST_ASSERT_TRUE(res);
  3946. CS104_Slave slave = CS104_Slave_createSecure(100, 100, tlsConfig1);
  3947. TEST_ASSERT_NOT_NULL(slave);
  3948. CS104_Slave_setLocalPort(slave, 20004);
  3949. CS104_Slave_start(slave);
  3950. CS104_Connection con = CS104_Connection_createSecure("127.0.0.1", 20004, tlsConfig2);
  3951. TEST_ASSERT_NOT_NULL(con);
  3952. bool result = CS104_Connection_connect(con);
  3953. TEST_ASSERT_TRUE(result);
  3954. CS104_Slave_destroy(slave);
  3955. CS104_Connection_destroy(con);
  3956. TLSConfiguration_destroy(tlsConfig1);
  3957. TLSConfiguration_destroy(tlsConfig2);
  3958. }
  3959. void
  3960. test_CS104_MasterSlave_TLSConnectSuccessWithoutSeparateCACert(void)
  3961. {
  3962. bool res = false;
  3963. TLSConfiguration tlsConfig1 = TLSConfiguration_create();
  3964. TLSConfiguration_setEventHandler(tlsConfig1, securityEventHandler, NULL);
  3965. TLSConfiguration_setChainValidation(tlsConfig1, true);
  3966. res = TLSConfiguration_setOwnKeyFromFile(tlsConfig1, "server_CA1_1.key", NULL);
  3967. TEST_ASSERT_TRUE(res);
  3968. res = TLSConfiguration_setOwnCertificateFromFile(tlsConfig1, "server_CA1_1_chain.pem");
  3969. TEST_ASSERT_TRUE(res);
  3970. res = TLSConfiguration_addCACertificateFromFile(tlsConfig1, "server_CA1_1_chain.pem");
  3971. TEST_ASSERT_TRUE(res);
  3972. TLSConfiguration tlsConfig2 = TLSConfiguration_create();
  3973. TLSConfiguration_setChainValidation(tlsConfig2, true);
  3974. TLSConfiguration_setAllowOnlyKnownCertificates(tlsConfig2, true);
  3975. /* use expired certificate */
  3976. res = TLSConfiguration_setOwnKeyFromFile(tlsConfig2, "client_CA1_3.key", NULL);
  3977. TEST_ASSERT_TRUE(res);
  3978. res = TLSConfiguration_setOwnCertificateFromFile(tlsConfig2, "client_CA1_3.pem");
  3979. TEST_ASSERT_TRUE(res);
  3980. res = TLSConfiguration_addCACertificateFromFile(tlsConfig2, "root_CA1.pem");
  3981. TEST_ASSERT_TRUE(res);
  3982. res = TLSConfiguration_addAllowedCertificateFromFile(tlsConfig2, "server_CA1_1_chain.pem");
  3983. TEST_ASSERT_TRUE(res);
  3984. CS104_Slave slave = CS104_Slave_createSecure(100, 100, tlsConfig1);
  3985. TEST_ASSERT_NOT_NULL(slave);
  3986. CS104_Slave_setLocalPort(slave, 20004);
  3987. CS104_Slave_start(slave);
  3988. CS104_Connection con = CS104_Connection_createSecure("127.0.0.1", 20004, tlsConfig2);
  3989. TEST_ASSERT_NOT_NULL(con);
  3990. bool result = CS104_Connection_connect(con);
  3991. TEST_ASSERT_TRUE(result);
  3992. CS104_Slave_destroy(slave);
  3993. CS104_Connection_destroy(con);
  3994. TLSConfiguration_destroy(tlsConfig1);
  3995. TLSConfiguration_destroy(tlsConfig2);
  3996. }
  3997. void
  3998. test_CS104_MasterSlave_TLSConnectFails(void)
  3999. {
  4000. struct secEventInfo eventInfo;
  4001. memset(&eventInfo, 0, sizeof(struct secEventInfo));
  4002. bool res = false;
  4003. TLSConfiguration tlsConfig1 = TLSConfiguration_create();
  4004. TLSConfiguration_setEventHandler(tlsConfig1, securityEventHandler, &eventInfo);
  4005. TLSConfiguration_setChainValidation(tlsConfig1, true);
  4006. TLSConfiguration tlsConfig2 = TLSConfiguration_create();
  4007. TLSConfiguration_setChainValidation(tlsConfig2, true);
  4008. TLSConfiguration_setAllowOnlyKnownCertificates(tlsConfig2, true);
  4009. /* use valid certificate */
  4010. res = TLSConfiguration_setOwnKeyFromFile(tlsConfig2, "client_CA1_3.key", NULL);
  4011. TEST_ASSERT_TRUE(res);
  4012. res = TLSConfiguration_setOwnCertificateFromFile(tlsConfig2, "client_CA1_3.pem");
  4013. TEST_ASSERT_TRUE(res);
  4014. res = TLSConfiguration_addCACertificateFromFile(tlsConfig2, "root_CA1.pem");
  4015. TEST_ASSERT_TRUE(res);
  4016. res = TLSConfiguration_addAllowedCertificateFromFile(tlsConfig2, "server_CA1_1.pem");
  4017. TEST_ASSERT_TRUE(res);
  4018. CS104_Slave slave = CS104_Slave_createSecure(100, 100, tlsConfig1);
  4019. TEST_ASSERT_NOT_NULL(slave);
  4020. CS104_Slave_setLocalPort(slave, 20004);
  4021. CS104_Slave_start(slave);
  4022. CS104_Connection con = CS104_Connection_createSecure("127.0.0.1", 20004, tlsConfig2);
  4023. TEST_ASSERT_NOT_NULL(con);
  4024. bool result = CS104_Connection_connect(con);
  4025. TEST_ASSERT_FALSE(result);
  4026. CS104_Slave_destroy(slave);
  4027. CS104_Connection_destroy(con);
  4028. TLSConfiguration_destroy(tlsConfig1);
  4029. TLSConfiguration_destroy(tlsConfig2);
  4030. TEST_ASSERT_EQUAL_INT(1, eventInfo.eventHandlerCalled);
  4031. TEST_ASSERT_EQUAL_INT(TLS_EVENT_CODE_ALM_ALGO_NOT_SUPPORTED, eventInfo.eventCodes[0]);
  4032. }
  4033. void
  4034. test_CS104_MasterSlave_TLSVersionMismatch(void)
  4035. {
  4036. struct secEventInfo eventInfo;
  4037. memset(&eventInfo, 0, sizeof(struct secEventInfo));
  4038. bool res = false;
  4039. TLSConfiguration tlsConfig1 = TLSConfiguration_create();
  4040. TLSConfiguration_setMinTlsVersion(tlsConfig1, TLS_VERSION_TLS_1_2);
  4041. TLSConfiguration_setEventHandler(tlsConfig1, securityEventHandler, &eventInfo);
  4042. TLSConfiguration_setChainValidation(tlsConfig1, true);
  4043. res = TLSConfiguration_setOwnKeyFromFile(tlsConfig1, "server_CA1_1.key", NULL);
  4044. TEST_ASSERT_TRUE(res);
  4045. res = TLSConfiguration_setOwnCertificateFromFile(tlsConfig1, "server_CA1_1.pem");
  4046. TEST_ASSERT_TRUE(res);
  4047. res = TLSConfiguration_addCACertificateFromFile(tlsConfig1, "root_CA1.pem");
  4048. TEST_ASSERT_TRUE(res);
  4049. TLSConfiguration tlsConfig2 = TLSConfiguration_create();
  4050. TLSConfiguration_setChainValidation(tlsConfig2, true);
  4051. TLSConfiguration_setAllowOnlyKnownCertificates(tlsConfig2, true);
  4052. TLSConfiguration_setMinTlsVersion(tlsConfig2, TLS_VERSION_TLS_1_1);
  4053. TLSConfiguration_setMaxTlsVersion(tlsConfig2, TLS_VERSION_TLS_1_1);
  4054. /* use valid certificate */
  4055. res = TLSConfiguration_setOwnKeyFromFile(tlsConfig2, "client_CA1_3.key", NULL);
  4056. TEST_ASSERT_TRUE(res);
  4057. res = TLSConfiguration_setOwnCertificateFromFile(tlsConfig2, "client_CA1_3.pem");
  4058. TEST_ASSERT_TRUE(res);
  4059. res = TLSConfiguration_addCACertificateFromFile(tlsConfig2, "root_CA1.pem");
  4060. TEST_ASSERT_TRUE(res);
  4061. res = TLSConfiguration_addAllowedCertificateFromFile(tlsConfig2, "server_CA1_1.pem");
  4062. TEST_ASSERT_TRUE(res);
  4063. CS104_Slave slave = CS104_Slave_createSecure(100, 100, tlsConfig1);
  4064. TEST_ASSERT_NOT_NULL(slave);
  4065. CS104_Slave_setLocalPort(slave, 20004);
  4066. CS104_Slave_start(slave);
  4067. CS104_Connection con = CS104_Connection_createSecure("127.0.0.1", 20004, tlsConfig2);
  4068. TEST_ASSERT_NOT_NULL(con);
  4069. bool result = CS104_Connection_connect(con);
  4070. TEST_ASSERT_FALSE(result);
  4071. CS104_Slave_destroy(slave);
  4072. CS104_Connection_destroy(con);
  4073. TLSConfiguration_destroy(tlsConfig1);
  4074. TLSConfiguration_destroy(tlsConfig2);
  4075. TEST_ASSERT_EQUAL_INT(1, eventInfo.eventHandlerCalled);
  4076. TEST_ASSERT_EQUAL_INT(TLS_EVENT_CODE_ALM_UNSECURE_COMMUNICATION, eventInfo.eventCodes[0]);
  4077. }
  4078. void
  4079. test_CS104_MasterSlave_TLSCertificateExpired(void)
  4080. {
  4081. struct secEventInfo eventInfo;
  4082. memset(&eventInfo, 0, sizeof(struct secEventInfo));
  4083. TLSConfiguration tlsConfig1 = TLSConfiguration_create();
  4084. TLSConfiguration_setChainValidation(tlsConfig1, true);
  4085. TLSConfiguration_setEventHandler(tlsConfig1, securityEventHandler, &eventInfo);
  4086. TLSConfiguration_setOwnKeyFromFile(tlsConfig1, "server_CA1_1.key", NULL);
  4087. TLSConfiguration_setOwnCertificateFromFile(tlsConfig1, "server_CA1_1.pem");
  4088. TLSConfiguration_addCACertificateFromFile(tlsConfig1, "root_CA1.pem");
  4089. TLSConfiguration_setMinTlsVersion(tlsConfig1, TLS_VERSION_TLS_1_2);
  4090. TLSConfiguration tlsConfig2 = TLSConfiguration_create();
  4091. TLSConfiguration_setChainValidation(tlsConfig2, true);;
  4092. /* use expired certificate */
  4093. TLSConfiguration_setOwnKeyFromFile(tlsConfig2, "client_CA1_1.key", NULL);
  4094. TLSConfiguration_setOwnCertificateFromFile(tlsConfig2, "client_CA1_1.pem");
  4095. TLSConfiguration_addCACertificateFromFile(tlsConfig2, "root_CA1.pem");
  4096. TLSConfiguration_setMinTlsVersion(tlsConfig2, TLS_VERSION_TLS_1_2);
  4097. CS104_Slave slave = CS104_Slave_createSecure(100, 100, tlsConfig1);
  4098. TEST_ASSERT_NOT_NULL(slave);
  4099. CS104_Slave_setLocalPort(slave, 20004);
  4100. CS104_Slave_start(slave);
  4101. CS104_Connection con = CS104_Connection_createSecure("127.0.0.1", 20004, tlsConfig2);
  4102. TEST_ASSERT_NOT_NULL(con);
  4103. bool result = CS104_Connection_connect(con);
  4104. TEST_ASSERT_FALSE(result);
  4105. CS104_Slave_destroy(slave);
  4106. CS104_Connection_destroy(con);
  4107. TLSConfiguration_destroy(tlsConfig1);
  4108. TLSConfiguration_destroy(tlsConfig2);
  4109. TEST_ASSERT_EQUAL_INT(2, eventInfo.eventHandlerCalled);
  4110. TEST_ASSERT_EQUAL_INT(TLS_EVENT_CODE_ALM_CERT_EXPIRED, eventInfo.eventCodes[0]);
  4111. TEST_ASSERT_EQUAL_INT(TLS_EVENT_CODE_ALM_CERT_VALIDATION_FAILED, eventInfo.eventCodes[1]);
  4112. }
  4113. void
  4114. test_CS104_MasterSlave_TLSCertificateRevoked(void)
  4115. {
  4116. struct secEventInfo eventInfo;
  4117. memset(&eventInfo, 0, sizeof(struct secEventInfo));
  4118. bool res = false;
  4119. TLSConfiguration tlsConfig1 = TLSConfiguration_create();
  4120. TLSConfiguration_setChainValidation(tlsConfig1, true);
  4121. TLSConfiguration_setEventHandler(tlsConfig1, securityEventHandler, &eventInfo);
  4122. res = TLSConfiguration_setOwnKeyFromFile(tlsConfig1, "server_CA1_1.key", NULL);
  4123. TEST_ASSERT_TRUE(res);
  4124. res = TLSConfiguration_setOwnCertificateFromFile(tlsConfig1, "server_CA1_1.pem");
  4125. TEST_ASSERT_TRUE(res);
  4126. res = TLSConfiguration_addCACertificateFromFile(tlsConfig1, "root_CA1.pem");
  4127. TEST_ASSERT_TRUE(res);
  4128. res = TLSConfiguration_addCRLFromFile(tlsConfig1, "test.crl");
  4129. TEST_ASSERT_TRUE(res);
  4130. TLSConfiguration tlsConfig2 = TLSConfiguration_create();
  4131. TLSConfiguration_setChainValidation(tlsConfig2, true);;
  4132. /* use revoked certificate */
  4133. res = TLSConfiguration_setOwnKeyFromFile(tlsConfig2, "client_CA1_3.key", NULL);
  4134. TEST_ASSERT_TRUE(res);
  4135. res = TLSConfiguration_setOwnCertificateFromFile(tlsConfig2, "client_CA1_3.pem");
  4136. TEST_ASSERT_TRUE(res);
  4137. res = TLSConfiguration_addCACertificateFromFile(tlsConfig2, "root_CA1.pem");
  4138. TEST_ASSERT_TRUE(res);
  4139. CS104_Slave slave = CS104_Slave_createSecure(100, 100, tlsConfig1);
  4140. TEST_ASSERT_NOT_NULL(slave);
  4141. CS104_Slave_setLocalPort(slave, 20004);
  4142. CS104_Slave_start(slave);
  4143. CS104_Connection con = CS104_Connection_createSecure("127.0.0.1", 20004, tlsConfig2);
  4144. TEST_ASSERT_NOT_NULL(con);
  4145. bool result = CS104_Connection_connect(con);
  4146. TEST_ASSERT_FALSE(result);
  4147. CS104_Slave_destroy(slave);
  4148. CS104_Connection_destroy(con);
  4149. TLSConfiguration_destroy(tlsConfig1);
  4150. TLSConfiguration_destroy(tlsConfig2);
  4151. TEST_ASSERT_EQUAL_INT(2, eventInfo.eventHandlerCalled);
  4152. TEST_ASSERT_EQUAL_INT(TLS_EVENT_CODE_ALM_CERT_REVOKED, eventInfo.eventCodes[0]);
  4153. TEST_ASSERT_EQUAL_INT(TLS_EVENT_CODE_ALM_CERT_VALIDATION_FAILED, eventInfo.eventCodes[1]);
  4154. }
  4155. void
  4156. test_CS104_MasterSlave_TLSRenegotiateAfterCRLUpdate(void)
  4157. {
  4158. struct secEventInfo eventInfo;
  4159. memset(&eventInfo, 0, sizeof(struct secEventInfo));
  4160. bool res = false;
  4161. TLSConfiguration tlsConfig1 = TLSConfiguration_create();
  4162. TLSConfiguration_setChainValidation(tlsConfig1, true);
  4163. TLSConfiguration_setEventHandler(tlsConfig1, securityEventHandler, &eventInfo);
  4164. res = TLSConfiguration_setOwnKeyFromFile(tlsConfig1, "server_CA1_1.key", NULL);
  4165. TEST_ASSERT_TRUE(res);
  4166. res = TLSConfiguration_setOwnCertificateFromFile(tlsConfig1, "server_CA1_1.pem");
  4167. TEST_ASSERT_TRUE(res);
  4168. res = TLSConfiguration_addCACertificateFromFile(tlsConfig1, "root_CA1.pem");
  4169. TEST_ASSERT_TRUE(res);
  4170. // res = TLSConfiguration_addCRLFromFile(tlsConfig1, "test.crl");
  4171. // TEST_ASSERT_TRUE(res);
  4172. TLSConfiguration tlsConfig2 = TLSConfiguration_create();
  4173. TLSConfiguration_setChainValidation(tlsConfig2, true);;
  4174. /* use revoked certificate */
  4175. res = TLSConfiguration_setOwnKeyFromFile(tlsConfig2, "client_CA1_3.key", NULL);
  4176. TEST_ASSERT_TRUE(res);
  4177. res = TLSConfiguration_setOwnCertificateFromFile(tlsConfig2, "client_CA1_3.pem");
  4178. TEST_ASSERT_TRUE(res);
  4179. res = TLSConfiguration_addCACertificateFromFile(tlsConfig2, "root_CA1.pem");
  4180. TEST_ASSERT_TRUE(res);
  4181. TLSConfiguration_setRenegotiationTime(tlsConfig1, 10000);
  4182. CS104_Slave slave = CS104_Slave_createSecure(100, 100, tlsConfig1);
  4183. TEST_ASSERT_NOT_NULL(slave);
  4184. CS104_Slave_setLocalPort(slave, 20004);
  4185. CS104_Slave_start(slave);
  4186. CS104_Connection con = CS104_Connection_createSecure("127.0.0.1", 20004, tlsConfig2);
  4187. TEST_ASSERT_NOT_NULL(con);
  4188. bool result = CS104_Connection_connect(con);
  4189. TEST_ASSERT_TRUE(result);
  4190. CS104_Connection_sendStartDT(con);
  4191. res = TLSConfiguration_addCRLFromFile(tlsConfig1, "test.crl");
  4192. TEST_ASSERT_TRUE(res);
  4193. CS101_ASDU newAsdu = CS101_ASDU_create(CS104_Slave_getAppLayerParameters(slave), false, CS101_COT_SPONTANEOUS, 0, 1, false, false);
  4194. InformationObject io = (InformationObject) MeasuredValueScaled_create(NULL, 110, 1, IEC60870_QUALITY_GOOD);
  4195. CS101_ASDU_addInformationObject(newAsdu, io);
  4196. InformationObject_destroy(io);
  4197. CS104_Slave_enqueueASDU(slave, newAsdu);
  4198. CS101_ASDU_destroy(newAsdu);
  4199. Thread_sleep(1000);
  4200. TEST_ASSERT_EQUAL_INT(1, eventInfo.eventHandlerCalled);
  4201. TEST_ASSERT_EQUAL_INT(TLS_EVENT_CODE_INF_SESSION_RENEGOTIATION, eventInfo.eventCodes[0]);
  4202. CS104_Slave_destroy(slave);
  4203. CS104_Connection_destroy(con);
  4204. TLSConfiguration_destroy(tlsConfig1);
  4205. TLSConfiguration_destroy(tlsConfig2);
  4206. }
  4207. void
  4208. test_CS104_MasterSlave_TLSCertificateRevokedBeforeRenegotiation(void)
  4209. {
  4210. struct secEventInfo eventInfo;
  4211. memset(&eventInfo, 0, sizeof(struct secEventInfo));
  4212. bool res = false;
  4213. TLSConfiguration tlsConfig1 = TLSConfiguration_create();
  4214. TLSConfiguration_setChainValidation(tlsConfig1, true);
  4215. TLSConfiguration_setEventHandler(tlsConfig1, securityEventHandler, &eventInfo);
  4216. res = TLSConfiguration_setOwnKeyFromFile(tlsConfig1, "server_CA1_1.key", NULL);
  4217. TEST_ASSERT_TRUE(res);
  4218. res = TLSConfiguration_setOwnCertificateFromFile(tlsConfig1, "server_CA1_1.pem");
  4219. TEST_ASSERT_TRUE(res);
  4220. res = TLSConfiguration_addCACertificateFromFile(tlsConfig1, "root_CA1.pem");
  4221. TEST_ASSERT_TRUE(res);
  4222. TLSConfiguration_setRenegotiationTime(tlsConfig1, 1000);
  4223. TLSConfiguration tlsConfig2 = TLSConfiguration_create();
  4224. TLSConfiguration_setChainValidation(tlsConfig2, true);;
  4225. /* use revoked certificate */
  4226. res = TLSConfiguration_setOwnKeyFromFile(tlsConfig2, "client_CA1_3.key", NULL);
  4227. TEST_ASSERT_TRUE(res);
  4228. res = TLSConfiguration_setOwnCertificateFromFile(tlsConfig2, "client_CA1_3.pem");
  4229. TEST_ASSERT_TRUE(res);
  4230. res = TLSConfiguration_addCACertificateFromFile(tlsConfig2, "root_CA1.pem");
  4231. TEST_ASSERT_TRUE(res);
  4232. CS104_Slave slave = CS104_Slave_createSecure(100, 100, tlsConfig1);
  4233. TEST_ASSERT_NOT_NULL(slave);
  4234. CS104_Slave_setLocalPort(slave, 20004);
  4235. CS104_Slave_start(slave);
  4236. CS104_Connection con = CS104_Connection_createSecure("127.0.0.1", 20004, tlsConfig2);
  4237. TEST_ASSERT_NOT_NULL(con);
  4238. bool result = CS104_Connection_connect(con);
  4239. TEST_ASSERT_TRUE(result);
  4240. CS104_Connection_sendStartDT(con);
  4241. /* update CRL -> expect renegotiation to fail! */
  4242. res = TLSConfiguration_addCRLFromFile(tlsConfig1, "test.crl");
  4243. TEST_ASSERT_TRUE(res);
  4244. Thread_sleep(1500);
  4245. CS101_ASDU newAsdu = CS101_ASDU_create(CS104_Slave_getAppLayerParameters(slave), false, CS101_COT_SPONTANEOUS, 0, 1, false, false);
  4246. InformationObject io = (InformationObject) MeasuredValueScaled_create(NULL, 110, 1, IEC60870_QUALITY_GOOD);
  4247. CS101_ASDU_addInformationObject(newAsdu, io);
  4248. InformationObject_destroy(io);
  4249. CS104_Slave_enqueueASDU(slave, newAsdu);
  4250. CS101_ASDU_destroy(newAsdu);
  4251. Thread_sleep(1500);
  4252. CS104_Slave_destroy(slave);
  4253. CS104_Connection_destroy(con);
  4254. TLSConfiguration_destroy(tlsConfig1);
  4255. TLSConfiguration_destroy(tlsConfig2);
  4256. TEST_ASSERT_TRUE(eventInfo.eventHandlerCalled > 0);
  4257. TEST_ASSERT_EQUAL_INT(TLS_EVENT_CODE_INF_SESSION_RENEGOTIATION, eventInfo.eventCodes[0]);
  4258. }
  4259. void
  4260. test_CS104_MasterSlave_TLSCertificateRevokedBeforeReconnect(void)
  4261. {
  4262. bool res = false;
  4263. TLSConfiguration tlsConfig1 = TLSConfiguration_create();
  4264. TLSConfiguration_enableSessionResumption(tlsConfig1, false);
  4265. TLSConfiguration_setChainValidation(tlsConfig1, true);
  4266. TLSConfiguration_setEventHandler(tlsConfig1, securityEventHandler, NULL);
  4267. res = TLSConfiguration_setOwnKeyFromFile(tlsConfig1, "server_CA1_1.key", NULL);
  4268. TEST_ASSERT_TRUE(res);
  4269. res = TLSConfiguration_setOwnCertificateFromFile(tlsConfig1, "server_CA1_1.pem");
  4270. TEST_ASSERT_TRUE(res);
  4271. res = TLSConfiguration_addCACertificateFromFile(tlsConfig1, "root_CA1.pem");
  4272. TEST_ASSERT_TRUE(res);
  4273. TLSConfiguration_setRenegotiationTime(tlsConfig1, 1000);
  4274. TLSConfiguration tlsConfig2 = TLSConfiguration_create();
  4275. TLSConfiguration_setChainValidation(tlsConfig2, true);;
  4276. /* use revoked certificate */
  4277. res = TLSConfiguration_setOwnKeyFromFile(tlsConfig2, "client_CA1_3.key", NULL);
  4278. TEST_ASSERT_TRUE(res);
  4279. res = TLSConfiguration_setOwnCertificateFromFile(tlsConfig2, "client_CA1_3.pem");
  4280. TEST_ASSERT_TRUE(res);
  4281. res = TLSConfiguration_addCACertificateFromFile(tlsConfig2, "root_CA1.pem");
  4282. TEST_ASSERT_TRUE(res);
  4283. CS104_Slave slave = CS104_Slave_createSecure(100, 100, tlsConfig1);
  4284. TEST_ASSERT_NOT_NULL(slave);
  4285. CS104_Slave_setLocalPort(slave, 20004);
  4286. CS104_Slave_start(slave);
  4287. CS104_Connection con = CS104_Connection_createSecure("127.0.0.1", 20004, tlsConfig2);
  4288. TEST_ASSERT_NOT_NULL(con);
  4289. bool result = CS104_Connection_connect(con);
  4290. TEST_ASSERT_TRUE(result);
  4291. CS104_Connection_close(con);
  4292. /* update CRL -> expect renegotiation to fail! */
  4293. res = TLSConfiguration_addCRLFromFile(tlsConfig1, "test.crl");
  4294. TEST_ASSERT_TRUE(res);
  4295. result = CS104_Connection_connect(con);
  4296. TEST_ASSERT_FALSE(result);
  4297. CS104_Slave_destroy(slave);
  4298. CS104_Connection_destroy(con);
  4299. TLSConfiguration_destroy(tlsConfig1);
  4300. TLSConfiguration_destroy(tlsConfig2);
  4301. }
  4302. void
  4303. test_CS104_MasterSlave_TLSUnknownCertificate(void)
  4304. {
  4305. TLSConfiguration tlsConfig1 = TLSConfiguration_create();
  4306. TLSConfiguration_setChainValidation(tlsConfig1, true);
  4307. TLSConfiguration_setAllowOnlyKnownCertificates(tlsConfig1, true);
  4308. TLSConfiguration_setEventHandler(tlsConfig1, securityEventHandler, NULL);
  4309. TLSConfiguration_setOwnKeyFromFile(tlsConfig1, "server_CA1_1.key", NULL);
  4310. TLSConfiguration_setOwnCertificateFromFile(tlsConfig1, "server_CA1_1.pem");
  4311. TLSConfiguration_addCACertificateFromFile(tlsConfig1, "root_CA1.pem");
  4312. TLSConfiguration_addAllowedCertificateFromFile(tlsConfig1, "client_CA1_3.pem");
  4313. TLSConfiguration_setMinTlsVersion(tlsConfig1, TLS_VERSION_TLS_1_2);
  4314. TLSConfiguration tlsConfig2 = TLSConfiguration_create();
  4315. TLSConfiguration_setChainValidation(tlsConfig2, true);;
  4316. /* use expired certificate */
  4317. TLSConfiguration_setOwnKeyFromFile(tlsConfig2, "client_CA1_4.key", NULL);
  4318. TLSConfiguration_setOwnCertificateFromFile(tlsConfig2, "client_CA1_4.pem");
  4319. TLSConfiguration_addCACertificateFromFile(tlsConfig2, "root_CA1.pem");
  4320. TLSConfiguration_setMinTlsVersion(tlsConfig2, TLS_VERSION_TLS_1_2);
  4321. CS104_Slave slave = CS104_Slave_createSecure(100, 100, tlsConfig1);
  4322. TEST_ASSERT_NOT_NULL(slave);
  4323. CS104_Slave_setLocalPort(slave, 20004);
  4324. CS104_Slave_start(slave);
  4325. CS104_Connection con = CS104_Connection_createSecure("127.0.0.1", 20004, tlsConfig2);
  4326. TEST_ASSERT_NOT_NULL(con);
  4327. bool result = CS104_Connection_connect(con);
  4328. TEST_ASSERT_FALSE(result);
  4329. CS104_Slave_destroy(slave);
  4330. CS104_Connection_destroy(con);
  4331. TLSConfiguration_destroy(tlsConfig1);
  4332. TLSConfiguration_destroy(tlsConfig2);
  4333. }
  4334. void
  4335. test_CS104_MasterSlave_TLSUseSessionResumption(void)
  4336. {
  4337. TLSConfiguration tlsConfig1 = TLSConfiguration_create();
  4338. TLSConfiguration_enableSessionResumption(tlsConfig1, true);
  4339. TLSConfiguration_setChainValidation(tlsConfig1, true);
  4340. TLSConfiguration_setOwnKeyFromFile(tlsConfig1, "server_CA1_1.key", NULL);
  4341. TLSConfiguration_setOwnCertificateFromFile(tlsConfig1, "server_CA1_1.pem");
  4342. TLSConfiguration_addCACertificateFromFile(tlsConfig1, "root_CA1.pem");
  4343. TLSConfiguration tlsConfig2 = TLSConfiguration_create();
  4344. TLSConfiguration_enableSessionResumption(tlsConfig2, true);
  4345. TLSConfiguration_setChainValidation(tlsConfig2, true);
  4346. TLSConfiguration_setAllowOnlyKnownCertificates(tlsConfig2, true);
  4347. /* use valid certificate */
  4348. TLSConfiguration_setOwnKeyFromFile(tlsConfig2, "client_CA1_3.key", NULL);
  4349. TLSConfiguration_setOwnCertificateFromFile(tlsConfig2, "client_CA1_3.pem");
  4350. TLSConfiguration_addCACertificateFromFile(tlsConfig2, "root_CA1.pem");
  4351. TLSConfiguration_addAllowedCertificateFromFile(tlsConfig2, "server_CA1_1.pem");
  4352. CS104_Slave slave = CS104_Slave_createSecure(100, 100, tlsConfig1);
  4353. TEST_ASSERT_NOT_NULL(slave);
  4354. CS104_Slave_setLocalPort(slave, 20004);
  4355. CS104_Slave_start(slave);
  4356. CS104_Connection con = CS104_Connection_createSecure("127.0.0.1", 20004, tlsConfig2);
  4357. TEST_ASSERT_NOT_NULL(con);
  4358. bool result = CS104_Connection_connect(con);
  4359. TEST_ASSERT_TRUE(result);
  4360. CS104_Connection_destroy(con);
  4361. printf("New connection should use the old TLS session\n");
  4362. con = CS104_Connection_createSecure("127.0.0.1", 20004, tlsConfig2);
  4363. TEST_ASSERT_NOT_NULL(con);
  4364. result = CS104_Connection_connect(con);
  4365. TEST_ASSERT_TRUE(result);
  4366. CS104_Slave_destroy(slave);
  4367. CS104_Connection_destroy(con);
  4368. TLSConfiguration_destroy(tlsConfig1);
  4369. TLSConfiguration_destroy(tlsConfig2);
  4370. }
  4371. void
  4372. test_CS104_MasterSlave_TLSCertificateSessionResumptionExpiredAtClient(void)
  4373. {
  4374. bool res = false;
  4375. TLSConfiguration tlsConfig1 = TLSConfiguration_create();
  4376. TLSConfiguration_setChainValidation(tlsConfig1, true);
  4377. TLSConfiguration_setEventHandler(tlsConfig1, securityEventHandler, NULL);
  4378. res = TLSConfiguration_setOwnKeyFromFile(tlsConfig1, "server_CA1_1.key", NULL);
  4379. TEST_ASSERT_TRUE(res);
  4380. res = TLSConfiguration_setOwnCertificateFromFile(tlsConfig1, "server_CA1_1.pem");
  4381. TEST_ASSERT_TRUE(res);
  4382. res = TLSConfiguration_addCACertificateFromFile(tlsConfig1, "root_CA1.pem");
  4383. TEST_ASSERT_TRUE(res);
  4384. TLSConfiguration_setRenegotiationTime(tlsConfig1, 1000);
  4385. TLSConfiguration tlsConfig2 = TLSConfiguration_create();
  4386. TLSConfiguration_enableSessionResumption(tlsConfig2, true);
  4387. TLSConfiguration_setSessionResumptionInterval(tlsConfig2, 1);
  4388. TLSConfiguration_setChainValidation(tlsConfig2, true);
  4389. /* use revoked certificate */
  4390. res = TLSConfiguration_setOwnKeyFromFile(tlsConfig2, "client_CA1_3.key", NULL);
  4391. TEST_ASSERT_TRUE(res);
  4392. res = TLSConfiguration_setOwnCertificateFromFile(tlsConfig2, "client_CA1_3.pem");
  4393. TEST_ASSERT_TRUE(res);
  4394. res = TLSConfiguration_addCACertificateFromFile(tlsConfig2, "root_CA1.pem");
  4395. TEST_ASSERT_TRUE(res);
  4396. CS104_Slave slave = CS104_Slave_createSecure(100, 100, tlsConfig1);
  4397. TEST_ASSERT_NOT_NULL(slave);
  4398. CS104_Slave_setLocalPort(slave, 20004);
  4399. CS104_Slave_start(slave);
  4400. CS104_Connection con = CS104_Connection_createSecure("127.0.0.1", 20004, tlsConfig2);
  4401. TEST_ASSERT_NOT_NULL(con);
  4402. bool result = CS104_Connection_connect(con);
  4403. TEST_ASSERT_TRUE(result);
  4404. CS104_Connection_close(con);
  4405. Thread_sleep(1500);
  4406. /* update CRL -> expect renegotiation to fail! */
  4407. res = TLSConfiguration_addCRLFromFile(tlsConfig1, "test.crl");
  4408. TEST_ASSERT_TRUE(res);
  4409. result = CS104_Connection_connect(con);
  4410. TEST_ASSERT_FALSE(result);
  4411. CS104_Slave_destroy(slave);
  4412. CS104_Connection_destroy(con);
  4413. TLSConfiguration_destroy(tlsConfig1);
  4414. TLSConfiguration_destroy(tlsConfig2);
  4415. }
  4416. void
  4417. test_CS104_MasterSlave_TLSCertificateSessionResumptionExpiredAtServer(void)
  4418. {
  4419. bool res = false;
  4420. TLSConfiguration tlsConfig1 = TLSConfiguration_create();
  4421. TLSConfiguration_enableSessionResumption(tlsConfig1, true);
  4422. TLSConfiguration_setSessionResumptionInterval(tlsConfig1, 1);
  4423. TLSConfiguration_setChainValidation(tlsConfig1, true);
  4424. TLSConfiguration_setEventHandler(tlsConfig1, securityEventHandler, NULL);
  4425. res = TLSConfiguration_setOwnKeyFromFile(tlsConfig1, "server_CA1_1.key", NULL);
  4426. TEST_ASSERT_TRUE(res);
  4427. res = TLSConfiguration_setOwnCertificateFromFile(tlsConfig1, "server_CA1_1.pem");
  4428. TEST_ASSERT_TRUE(res);
  4429. res = TLSConfiguration_addCACertificateFromFile(tlsConfig1, "root_CA1.pem");
  4430. TEST_ASSERT_TRUE(res);
  4431. TLSConfiguration_setRenegotiationTime(tlsConfig1, 1000);
  4432. TLSConfiguration tlsConfig2 = TLSConfiguration_create();
  4433. TLSConfiguration_enableSessionResumption(tlsConfig2, true);
  4434. TLSConfiguration_setChainValidation(tlsConfig2, true);
  4435. /* use revoked certificate */
  4436. res = TLSConfiguration_setOwnKeyFromFile(tlsConfig2, "client_CA1_3.key", NULL);
  4437. TEST_ASSERT_TRUE(res);
  4438. res = TLSConfiguration_setOwnCertificateFromFile(tlsConfig2, "client_CA1_3.pem");
  4439. TEST_ASSERT_TRUE(res);
  4440. res = TLSConfiguration_addCACertificateFromFile(tlsConfig2, "root_CA1.pem");
  4441. TEST_ASSERT_TRUE(res);
  4442. CS104_Slave slave = CS104_Slave_createSecure(100, 100, tlsConfig1);
  4443. TEST_ASSERT_NOT_NULL(slave);
  4444. CS104_Slave_setLocalPort(slave, 20004);
  4445. CS104_Slave_start(slave);
  4446. CS104_Connection con = CS104_Connection_createSecure("127.0.0.1", 20004, tlsConfig2);
  4447. TEST_ASSERT_NOT_NULL(con);
  4448. bool result = CS104_Connection_connect(con);
  4449. TEST_ASSERT_TRUE(result);
  4450. CS104_Connection_close(con);
  4451. Thread_sleep(2000);
  4452. /* update CRL -> expect renegotiation to fail! */
  4453. res = TLSConfiguration_addCRLFromFile(tlsConfig1, "test.crl");
  4454. TEST_ASSERT_TRUE(res);
  4455. result = CS104_Connection_connect(con);
  4456. TEST_ASSERT_FALSE(result);
  4457. CS104_Slave_destroy(slave);
  4458. CS104_Connection_destroy(con);
  4459. TLSConfiguration_destroy(tlsConfig1);
  4460. TLSConfiguration_destroy(tlsConfig2);
  4461. }
  4462. void
  4463. test_CS104_MasterSlave_TLSReuseConfigurationWithSessionResumption(void)
  4464. {
  4465. TLSConfiguration tlsConfig1 = TLSConfiguration_create();
  4466. TLSConfiguration_enableSessionResumption(tlsConfig1, true);
  4467. TLSConfiguration_setChainValidation(tlsConfig1, true);
  4468. TLSConfiguration_setOwnKeyFromFile(tlsConfig1, "server_CA1_1.key", NULL);
  4469. TLSConfiguration_setOwnCertificateFromFile(tlsConfig1, "server_CA1_1.pem");
  4470. TLSConfiguration_addCACertificateFromFile(tlsConfig1, "root_CA1.pem");
  4471. TLSConfiguration tlsConfig2 = TLSConfiguration_create();
  4472. TLSConfiguration_enableSessionResumption(tlsConfig2, true);
  4473. TLSConfiguration_setChainValidation(tlsConfig2, true);
  4474. TLSConfiguration_setAllowOnlyKnownCertificates(tlsConfig2, true);
  4475. /* use valid certificate */
  4476. TLSConfiguration_setOwnKeyFromFile(tlsConfig2, "client_CA1_3.key", NULL);
  4477. TLSConfiguration_setOwnCertificateFromFile(tlsConfig2, "client_CA1_3.pem");
  4478. TLSConfiguration_addCACertificateFromFile(tlsConfig2, "root_CA1.pem");
  4479. TLSConfiguration_addAllowedCertificateFromFile(tlsConfig2, "server_CA1_1.pem");
  4480. CS104_Slave slave = CS104_Slave_createSecure(100, 100, tlsConfig1);
  4481. TEST_ASSERT_NOT_NULL(slave);
  4482. CS104_Slave_setLocalPort(slave, 20004);
  4483. CS104_Slave_start(slave);
  4484. CS104_Connection con = CS104_Connection_createSecure("127.0.0.1", 20004, tlsConfig2);
  4485. TEST_ASSERT_NOT_NULL(con);
  4486. bool result = CS104_Connection_connect(con);
  4487. TEST_ASSERT_TRUE(result);
  4488. CS104_Connection_destroy(con);
  4489. con = CS104_Connection_createSecure("127.0.0.1", 20004, tlsConfig2);
  4490. TEST_ASSERT_NOT_NULL(con);
  4491. result = CS104_Connection_connect(con);
  4492. TEST_ASSERT_TRUE(result);
  4493. CS104_Slave_destroy(slave);
  4494. CS104_Connection_destroy(con);
  4495. slave = CS104_Slave_createSecure(100, 100, tlsConfig1);
  4496. TEST_ASSERT_NOT_NULL(slave);
  4497. CS104_Slave_setLocalPort(slave, 20004);
  4498. CS104_Slave_start(slave);
  4499. con = CS104_Connection_createSecure("127.0.0.1", 20004, tlsConfig2);
  4500. TEST_ASSERT_NOT_NULL(con);
  4501. result = CS104_Connection_connect(con);
  4502. TEST_ASSERT_TRUE(result);
  4503. Thread_sleep(500);
  4504. CS104_Slave_destroy(slave);
  4505. CS104_Connection_destroy(con);
  4506. TLSConfiguration_destroy(tlsConfig1);
  4507. TLSConfiguration_destroy(tlsConfig2);
  4508. }
  4509. #endif /* #if (CONFIG_CS104_SUPPORT_TLS == 1) */
  4510. void
  4511. test_ASDUsetGetNumberOfElements(void)
  4512. {
  4513. struct sCS101_AppLayerParameters salParameters;
  4514. salParameters.maxSizeOfASDU = 100;
  4515. salParameters.originatorAddress = 0;
  4516. salParameters.sizeOfCA = 2;
  4517. salParameters.sizeOfCOT = 2;
  4518. salParameters.sizeOfIOA = 3;
  4519. salParameters.sizeOfTypeId = 1;
  4520. salParameters.sizeOfVSQ = 1;
  4521. CS101_ASDU asdu = CS101_ASDU_create(&salParameters, false, CS101_COT_SPONTANEOUS, 0, 1, false, false);
  4522. TEST_ASSERT_FALSE(CS101_ASDU_isSequence(asdu));
  4523. CS101_ASDU_setNumberOfElements(asdu, 127);
  4524. TEST_ASSERT_EQUAL_INT(127, CS101_ASDU_getNumberOfElements(asdu));
  4525. CS101_ASDU_setNumberOfElements(asdu, 5);
  4526. TEST_ASSERT_EQUAL_INT(5, CS101_ASDU_getNumberOfElements(asdu));
  4527. TEST_ASSERT_FALSE(CS101_ASDU_isSequence(asdu));
  4528. CS101_ASDU_setSequence(asdu, true);
  4529. CS101_ASDU_setNumberOfElements(asdu, 127);
  4530. TEST_ASSERT_EQUAL_INT(127, CS101_ASDU_getNumberOfElements(asdu));
  4531. CS101_ASDU_setNumberOfElements(asdu, 5);
  4532. TEST_ASSERT_EQUAL_INT(5, CS101_ASDU_getNumberOfElements(asdu));
  4533. TEST_ASSERT_TRUE(CS101_ASDU_isSequence(asdu));
  4534. CS101_ASDU_destroy(asdu);
  4535. }
  4536. static uint8_t STARTDT_ACT_MSG[] = { 0x68, 0x04, 0x07, 0x00, 0x00, 0x00 };
  4537. static uint8_t STOPDT_ACT_MSG[] = { 0x68, 0x04, 0x13, 0x00, 0x00, 0x00 };
  4538. void
  4539. test_CS104SlaveUnconfirmedStoppedMode()
  4540. {
  4541. CS104_Slave slave = CS104_Slave_create(10, 10);
  4542. CS104_Slave_setServerMode(slave, CS104_MODE_SINGLE_REDUNDANCY_GROUP);
  4543. CS104_Slave_setLocalPort(slave, 20004);
  4544. CS104_Slave_start(slave);
  4545. CS101_AppLayerParameters alParams = CS104_Slave_getAppLayerParameters(slave);
  4546. struct stest_CS104SlaveEventQueue1 info;
  4547. info.asduHandlerCalled = 0;
  4548. info.spontCount = 0;
  4549. info.lastScaledValue = 0;
  4550. int16_t scaledValue = 0;
  4551. for (int i = 0; i < 15; i++) {
  4552. CS101_ASDU newAsdu = CS101_ASDU_create(alParams, false, CS101_COT_SPONTANEOUS, 0, 1, false, false);
  4553. InformationObject io = (InformationObject) MeasuredValueScaled_create(NULL, 110, scaledValue, IEC60870_QUALITY_GOOD);
  4554. scaledValue++;
  4555. CS101_ASDU_addInformationObject(newAsdu, io);
  4556. InformationObject_destroy(io);
  4557. CS104_Slave_enqueueASDU(slave, newAsdu);
  4558. CS101_ASDU_destroy(newAsdu);
  4559. }
  4560. CS104_Connection con = CS104_Connection_create("127.0.0.1", 20004);
  4561. CS104_Connection_setASDUReceivedHandler(con, test_CS104SlaveEventQueue1_asduReceivedHandler, &info);
  4562. bool result = CS104_Connection_connect(con);
  4563. TEST_ASSERT_TRUE(result);
  4564. CS104_Connection_sendStartDT(con);
  4565. Thread_sleep(500);
  4566. CS104_Connection_sendStopDT(con);
  4567. CS104_Connection_close(con);
  4568. TEST_ASSERT_EQUAL_INT(14, info.lastScaledValue);
  4569. info.asduHandlerCalled = 0;
  4570. info.spontCount = 0;
  4571. result = CS104_Connection_connect(con);
  4572. TEST_ASSERT_TRUE(result);
  4573. CS104_Connection_sendStartDT(con);
  4574. for (int i = 0; i < 6; i++)
  4575. {
  4576. Thread_sleep(10);
  4577. CS101_ASDU newAsdu = CS101_ASDU_create(alParams, false, CS101_COT_SPONTANEOUS, 0, 1, false, false);
  4578. InformationObject io = (InformationObject) MeasuredValueScaled_create(NULL, 110, scaledValue, IEC60870_QUALITY_GOOD);
  4579. scaledValue++;
  4580. CS101_ASDU_addInformationObject(newAsdu, io);
  4581. InformationObject_destroy(io);
  4582. CS104_Slave_enqueueASDU(slave, newAsdu);
  4583. CS101_ASDU_destroy(newAsdu);
  4584. }
  4585. Thread_sleep(500);
  4586. TEST_ASSERT_EQUAL_INT(6, CS104_Connection_sendMessage(con, STOPDT_ACT_MSG, sizeof(STOPDT_ACT_MSG)));
  4587. Thread_sleep(5000);
  4588. CS104_Connection_close(con);
  4589. TEST_ASSERT_EQUAL_INT(6, info.asduHandlerCalled);
  4590. TEST_ASSERT_EQUAL_INT(6, info.spontCount);
  4591. TEST_ASSERT_EQUAL_INT(20, info.lastScaledValue);
  4592. CS104_Connection_destroy(con);
  4593. CS104_Slave_destroy(slave);
  4594. }
  4595. int
  4596. main(int argc, char** argv)
  4597. {
  4598. UNITY_BEGIN();
  4599. RUN_TEST(test_version_number);
  4600. RUN_TEST(test_CS104_Slave_CreateDestroy);
  4601. RUN_TEST(test_CS104_MasterSlave_CreateDestroyLoop);
  4602. RUN_TEST(test_CS104_Connection_CreateDestroy);
  4603. RUN_TEST(test_CS104_MasterSlave_CreateDestroy);
  4604. RUN_TEST(test_CP56Time2a);
  4605. RUN_TEST(test_CP56Time2aToMsTimestamp);
  4606. RUN_TEST(test_CP56Time2aConversionFunctions);
  4607. RUN_TEST(test_StepPositionInformation);
  4608. RUN_TEST(test_addMaxNumberOfIOsToASDU);
  4609. RUN_TEST(test_SingleEventType);
  4610. RUN_TEST(test_SinglePointInformation);
  4611. RUN_TEST(test_SinglePointWithCP24Time2a);
  4612. RUN_TEST(test_SinglePointWithCP56Time2a);
  4613. RUN_TEST(test_DoublePointInformation);
  4614. RUN_TEST(test_DoublePointWithCP24Time2a);
  4615. RUN_TEST(test_DoublePointWithCP56Time2a);
  4616. RUN_TEST(test_NormalizeMeasureValueWithoutQuality);
  4617. RUN_TEST(test_NormalizeMeasureValue);
  4618. RUN_TEST(test_MeasuredValueNormalizedWithCP24Time2a);
  4619. RUN_TEST(test_MeasuredValueNormalizedWithCP56Time2a);
  4620. RUN_TEST(test_MeasuredValueScaled);
  4621. RUN_TEST(test_MeasuredValueScaledWithCP24Time2a);
  4622. RUN_TEST(test_MeasuredValueScaledWithCP56Time2a);
  4623. RUN_TEST(test_MeasuredValueShort);
  4624. RUN_TEST(test_MeasuredValueShortWithCP24Time2a);
  4625. RUN_TEST(test_MeasuredValueShortWithCP56Time2a);
  4626. RUN_TEST(test_StepPositionInformation);
  4627. RUN_TEST(test_StepPositionWithCP24Time2a);
  4628. RUN_TEST(test_StepPositionWithCP56Time2a);
  4629. RUN_TEST(test_IntegratedTotals);
  4630. RUN_TEST(test_IntegratedTotalsWithCP24Time2a);
  4631. RUN_TEST(test_IntegratedTotalsWithCP56Time2a);
  4632. RUN_TEST(test_SingleCommand);
  4633. RUN_TEST(test_SingleCommandWithCP56Time2a);
  4634. RUN_TEST(test_DoubleCommand);
  4635. RUN_TEST(test_DoubleCommandWithCP56Time2a);
  4636. RUN_TEST(test_StepCommandValue);
  4637. RUN_TEST(test_StepCommandWithCP56Time2a);
  4638. RUN_TEST(test_SetpointCommandNormalized);
  4639. RUN_TEST(test_SetpointCommandNormalizedWithCP56Time2a);
  4640. RUN_TEST(test_SetpointCommandScaled);
  4641. RUN_TEST(test_SetpointCommandScaledWithCP56Time2a);
  4642. RUN_TEST(test_SetpointCommandShort);
  4643. RUN_TEST(test_SetpointCommandShortWithCP56Time2a);
  4644. RUN_TEST(test_InterrogationCommand);
  4645. RUN_TEST(test_CounterInterrogationCommand);
  4646. RUN_TEST(test_ReadCommand);
  4647. RUN_TEST(test_ClockSynchronizationCommand);
  4648. RUN_TEST(test_ResetProcessCommand);
  4649. RUN_TEST(test_DelayAcquisitionCommand);
  4650. RUN_TEST(test_BitString32);
  4651. RUN_TEST(test_Bitstring32CommandWithCP56Time2a);
  4652. RUN_TEST(test_QueryLog);
  4653. RUN_TEST(test_BitString32xx_encodeDecode);
  4654. RUN_TEST(test_EventOfProtectionEquipmentWithTime);
  4655. RUN_TEST(test_IpAddressHandling);
  4656. RUN_TEST(test_CS104SlaveConnectionIsRedundancyGroup);
  4657. RUN_TEST(test_CS104SlaveSingleRedundancyGroup);
  4658. RUN_TEST(test_CS104SlaveSingleRedundancyGroupMultipleConnections);
  4659. RUN_TEST(test_CS104SlaveEventQueue1);
  4660. RUN_TEST(test_CS104SlaveEventQueueOverflow);
  4661. RUN_TEST(test_CS104SlaveEventQueueOverflow2);
  4662. RUN_TEST(test_CS104SlaveEventQueueCheckCapacity);
  4663. RUN_TEST(test_CS104SlaveEventQueueOverflow3);
  4664. RUN_TEST(test_CS104_Connection_ConnectTimeout);
  4665. RUN_TEST(test_CS104_Connection_UseAfterClose);
  4666. RUN_TEST(test_CS104_Connection_UseAfterServerClosedConnection);
  4667. RUN_TEST(test_CS104_Connection_async_success);
  4668. RUN_TEST(test_CS104_Connection_async_timeout);
  4669. RUN_TEST(test_CS101_ASDU_addObjectOfWrongType);
  4670. RUN_TEST(test_CS101_ASDU_addUntilOverflow);
  4671. #if (CONFIG_CS104_SUPPORT_TLS == 1)
  4672. RUN_TEST(test_CS104_MasterSlave_TLSConnectSuccess);
  4673. RUN_TEST(test_CS104_MasterSlave_TLSConnectSuccessWithoutSeparateCACert);
  4674. RUN_TEST(test_CS104_MasterSlave_TLSConnectFails);
  4675. RUN_TEST(test_CS104_MasterSlave_TLSVersionMismatch);
  4676. RUN_TEST(test_CS104_MasterSlave_TLSCertificateExpired);
  4677. RUN_TEST(test_CS104_MasterSlave_TLSCertificateRevoked);
  4678. RUN_TEST(test_CS104_MasterSlave_TLSRenegotiateAfterCRLUpdate);
  4679. RUN_TEST(test_CS104_MasterSlave_TLSCertificateRevokedBeforeRenegotiation);
  4680. RUN_TEST(test_CS104_MasterSlave_TLSCertificateRevokedBeforeReconnect);
  4681. RUN_TEST(test_CS104_MasterSlave_TLSUnknownCertificate);
  4682. RUN_TEST(test_CS104_MasterSlave_TLSUseSessionResumption);
  4683. RUN_TEST(test_CS104_MasterSlave_TLSCertificateSessionResumptionExpiredAtClient);
  4684. RUN_TEST(test_CS104_MasterSlave_TLSCertificateSessionResumptionExpiredAtServer);
  4685. RUN_TEST(test_CS104_MasterSlave_TLSReuseConfigurationWithSessionResumption);
  4686. #endif /* #if (CONFIG_CS104_SUPPORT_TLS == 1) */
  4687. RUN_TEST(test_ASDUsetGetNumberOfElements);
  4688. RUN_TEST(test_CS101_ASDU_clone);
  4689. RUN_TEST(test_CS104SlaveUnconfirmedStoppedMode);
  4690. return UNITY_END();
  4691. }