A TTCN-3 programozási nyelv

Üzenetkezelés

Az aszinkron üzenetek egyszerű kiküldésén és fogadása egy komplex testcase megalkotásakor általában nem elégséges. Nagyon sokszor áll fenn az a helyzet, hogy több típusú üzenet is helyes működést jelenti, vagy éppen megadott számú és típusú üzeneteket kell fogadni azonban ezek sorrendjére nincs megkötés, illetve amennyiben például nem érkezik üzenet akkor is a teszt megfelelő befejezését szeretnénk garantálni. Ezekre az összetett esetekre a TTCN-3 nyelvi elemeket bocsát a rendelkezésünkre.

Az alt konstrukció használata azt fejezi ki, hogy a felsorolt blokkoló utasítások közül legalább egy be fog következni az elkövetkezendőkben, tehát alternatív végrehajtást fejez ki. Az alt definíciója:

alt { [<feltétel>]<blokkoló utasítás>{<utasítások>} [[<feltétel>]<blokkoló utasítás>{<utasítások>}] }

Amennyiben csak egyetlen utasítás szerepel benne, úgy az alt elhagyható. Több utasítás esetén az alt kifejezés kiértékelése úgynevezett snapshot szemantikával dolgozik, azaz a feltételek egy kiértékelő ciklus alatt csak annak legelején lesznek kiértékelve, ami után felülről sorban haladva megvizsgál minden blokkoló utasítást. Ha valamelyiket sikerül alkalmazni akkor a hozzá tartozó utasítások kerülnek végrehajtásra, amennyiben nem úgy egy újabb feltételkiértékelés következik. Az alt kiértékelése dynamic testcase error-hoz vezet amennyiben minden benne szereplő őrfeltétel értéke hamis.

Az interleave konstrukció azokban az esetekben hasznos, amikor nincs pontosan definiálva véges darabszámú üzenetek érkezési sorrendje, de tudjuk, hogy mindegyik meg kell érkezzen. Tekinthetünk rá úgy, mint az alt egy speciális változatára, hiszen nem használhatóak benne őrfeltételek, belsejében szintén nem használhatóak kommunikációs eljárások, vagy ezeket tartalmazó függvényhívások, altstepek és defaultok hívása, valamint ciklusok, goto, repeat és return kulcsszavak használata is tilos.

interleave { []<blokkoló utasítás>{<utasítások>} [[]<blokkoló utasítás>{<utasítások>}] }

interleave{ [] PCO1.receive(5); [] PCO1.receive(3); [] PCO1.receive(4); }

Az altstepek eljárásokhoz hasonlóan hívhatók, ekkor altként viselkednek. Fontosabb viszont, hogy lehetőség van altstepeket úgynevezett default-ként aktiválni/deaktiválni. Ez annyit tesz, hogy az aktiválás pillanatától minden önmagában vagy altstepben álló blokkoló utasítás mögé az aktivált altstep ágai is bekerülnek. Mivel egyszerre több altstep is aktiválható default-ként és az altokban szereplő ágak sorrendje ezek aktiválásától/deaktiválásától függ, a defaultok gyakran átláthatatlanná teszik a teszt viselkedését.

altstep [(<formális paraméterlista>)] [runs on <komponens típus>] { [<lokális definíciók>] [<feltétel>]<blokkoló utasítás>{<utasítások>} [[<feltétel>]<blokkoló utasítás>{<utasítások>}] }

altstep myAltStep(integer par) runs on MyCompType { [par > 3] PCO1.receive(par){/**/} [] PCO1.receive{ setverdict(fail); } } myAltstep(5); alt{ [] myAltstep(5); } activate(myAltstep(5)); myTimer.timeout; deactivate(myAltstep(5));