TestFramework: Automaticke spustanie hraca a servera
Z RoboCupTP wiki
Za účelom vykonávania testov na vzdialených počítačoch je nutné aby si testovací framework vedel sám riadiť chod agenta a robocup servera. Umožní to skutočné automatické testovanie na viacerých počítačoch bez nutnosti manuálneho spúšťania alebo vypínania iných programov/procesov.
Konfigurácia
Pri spúštaní nového agenta alebo robocup servera testovací framework vykonáva príkaz určený konfiguračnou premennou robocup.player.command a robocup.server.command. Túto premennú je možné určiť v konfiguračnom súbore ako aj vstupných argumentoch hlavnej metódy spustenia testovacieho frameworku.
Pri vypínaní procesu umožňuje platforma Java a trieda java.util.Process len posielanie signálu SIGTERM, pričom signál je doručený len procesu priamo spusteného triedou Process (podprocesy signál nedostanú). Je teda potrebné aby spúšťaný proces správne reagoval na tento signál a prípadne aj ukončil svoje podprocesy.
V prípade robocup servera je spúšťanie problematické, keďže nereaguje na signál SIGTERM. Riešenie predstavuje vytvorenie pomocného programu na spustenie servera, pričom tento pomocný program správne spracováva daný signál a ukončí beh spusteného robocup servera. Implementácia takéhoto pomocného programu je závislá od použitého operačného systému. Príklad takéhoto programu v skriptovacom jazyku Bash je následovný.
#!/bin/bash rcssserver3d $@ & trap "kill -sigint $!;exit" TERM SIGTERM wait
Spúštanie agenta Jim
Pre správne spútanie hráča je potrebné aby hráč vedel spracovávať rôzne argumenty na jeho konfiguráciu. Implementované teda bolo parsovanie vstupných argument v hlavnej spúštacej metóde. Konkrétne sú povolené následné argumenty pri spúštaní agenta:
jim [options] [-testframework host port] [-uniform number] [-team team_name] [-tftp [port]] Vysvetlenie: - testframework host port - test [port] - uniform number - team team_name - zapnutie odosielania spatnej vazby na adresu - zapnutie lokalneho tftp servera - mozne dodatocne urcenie portu (default 3070) - nastavenie atributov agenta na pripojenie k serveru - nastavenie atributov agenta na pripojenie k serveru
Hráč je následne spúšťaný pomocou triedy java.util.Process. Štandardný výstup agenta je čítaný vo zvlášť vytvorenom vlákne avšak nieje nijak ďalej spracovávaný. Dôvod tohto čítania je obmedzenosť veľkosti vyrovnávacej pamäti prislúchajúcej na výstup procesu. Pri zaplnení tejto pamäte by bol proces pozastavený.
Celkovú réžiu spúšťania a znovu použitia už pripojených agentov má na starosti vytvorená trieda AgentManager. Pomocou jej metód je možné jednoduché vyžiadanie agenta so zvolenými atribútmi. Trieda sama spustí novú inštanciu agenta alebo použije už pripojeného staršieho agenta. Nasleduje príklad vyžiadania agenta s číslom 1 a tímom „ANDROIDS“. Posledná premenná funkcie robí volanie blokujúce, teda dané vlákno čaká na pridelenie agenta, keďže prípadné spustenie novej inštancie agenta nieje okamžité.
agent = AgentManager.getManager().getAgent(5, “ANDROIDS“, true);
Spúštanie RobocupServer (simspark)
Spúšťanie procesu robocup servera je implementované podobne ako spúštanie novej inštancie agenta, teda triedou java.util.Process a je vykonávané triedou LocalImplementation. Táto trieda si pred spustením procesu overí či server už nieje spustený vytvorením TCP spojenia na jeden z portov servera. Pri neúspešnosti je daný proces spustený a následný skúšaním vytvorenia TCP spojenia na jeden z portov servera je overovaná úspešnosť tejto operácie. Operácia spustenia novej inštancie servera sa považuje za neúspešnú po nemožnom vytvorení TCP spojenia na jeden z portov servera ani po piatich sekundách od spustenia procesu.