From ce56ae25b57ea5fe23da4c145a4dcbe592c53f1c Mon Sep 17 00:00:00 2001 From: haller Date: Tue, 27 Dec 2005 18:34:03 +0000 Subject: * Mise en place du test de Aiguillage * Correction de Aiguillage * Correction de GSMessage::delBeforeIt --- i/simulotron/src/aiguillage/aiguillage.cc | 16 ++- i/simulotron/src/aiguillage/aiguillage.hh | 4 +- i/simulotron/src/aiguillage/test_aiguillage.cc | 190 ++++++++++++++++++++++++- i/simulotron/src/gs/gs_message.cc | 2 +- 4 files changed, 206 insertions(+), 6 deletions(-) (limited to 'i/simulotron') diff --git a/i/simulotron/src/aiguillage/aiguillage.cc b/i/simulotron/src/aiguillage/aiguillage.cc index 95bbad1..6292ce7 100644 --- a/i/simulotron/src/aiguillage/aiguillage.cc +++ b/i/simulotron/src/aiguillage/aiguillage.cc @@ -28,13 +28,20 @@ #include -/// Constructeur +/// Constructeur client Aiguillage::Aiguillage(const std::string & address, int port, const std::string & name) :gst_(address, port) { setName(name); } +/// Constructeur serveur +Aiguillage::Aiguillage(SocketServer & socket, const std::string & name) + :gst_(socket) +{ + setName(name); +} + /// Envoie un paquet en rajoutant les infos de sources et de provenance void Aiguillage::send(const GSMessage & gsm, const std::string & source, @@ -55,10 +62,13 @@ Aiguillage::send(const GSMessage & gsm, const std::string & source, int Aiguillage::receive(GSMessage & gsm, std::string & source, std::string & dest) { + std::string tmp; if(gst_.getGS(gsm) != 0) return -1; - gsm.getString(source, 8); - gsm.getString(dest, 8); + gsm.getString(tmp, 8); + source = tmp.c_str(); + gsm.getString(tmp, 8); + dest = tmp.c_str(); gsm.delBeforeIt(); return 0; } diff --git a/i/simulotron/src/aiguillage/aiguillage.hh b/i/simulotron/src/aiguillage/aiguillage.hh index 3ec2bae..bdfc8a0 100644 --- a/i/simulotron/src/aiguillage/aiguillage.hh +++ b/i/simulotron/src/aiguillage/aiguillage.hh @@ -35,8 +35,10 @@ class Aiguillage GSTransmitter gst_; std::string name_; public: - /// Constructeur + /// Constructeur client Aiguillage(const std::string & address, int port, const std::string & name); + /// Constructeur serveur + Aiguillage(SocketServer & socket, const std::string & name); /// Envoie un paquet en rajoutant les infos de sources et de provenance void send(const GSMessage & gsm, const std::string & source, const std::string & dest); /// Reçoie un paquet du réseau et supprime les infos src et dest du GSM diff --git a/i/simulotron/src/aiguillage/test_aiguillage.cc b/i/simulotron/src/aiguillage/test_aiguillage.cc index 82be6e4..36285f8 100644 --- a/i/simulotron/src/aiguillage/test_aiguillage.cc +++ b/i/simulotron/src/aiguillage/test_aiguillage.cc @@ -1,4 +1,192 @@ -int main (void) +/* test_aiguillage.cc - Programme de test d'aiguillage. */ +/* Simulotron - Programme de simulation de robot {{{ + * + * Copyright (C) 2005 Nicolas Haller + * + * Robot APB Team/Efrei 2005. + * Web: http://assos.efrei.fr/robot/ + * Email: robot AT efrei DOT fr + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * }}} */ + +#include "socket/socket_server.hh" +#include "aiguillage/aiguillage.hh" +#include "gs/gs_message.hh" + +#include +#include + +//Chaine et char de test +int i1 = 1; +int i2; +std::string name1 = "nono"; +std::string name2 = "robert"; +std::string name3 = "marvin"; + +int testGSServer(SocketServer & sockServ); +void testGSClient(int pauseMode); + +int main(void) { + //pauseMode pour debbuger le fork + int pauseMode = 0; + int pid; + //retour des test + int resultClient, resultServer; + // Création de la socket serveur; + SocketServer sockServ(std::string(),4242); + // Mise en écoute du socket serveur + sockServ.listen(12); + // On crée le fork du client + pid = fork(); + if (pid == 0) // processus fils + testGSClient(pauseMode); + else //processus père + resultServer = testGSServer(sockServ); + + // On analyse les résultats + wait(&resultClient); + if (!(WIFEXITED(resultClient) && WEXITSTATUS(resultClient) == 0)) + { + std::cerr << "ECHEC: Problème coté client" << std::endl; + exit (-1); + } + if (resultServer != 0) + { + std::cerr << "ECHEC: Problème coté serveur" << std::endl; + exit (-1); + } + return 0; } + +int testGSServer(SocketServer & sockServ) +{ + // Création de l'aiguillage + Aiguillage aiSNCF(sockServ,name2); + std::string source, dest; + // Reception des messages + GSMessage gsm; + // Message 1 + while (aiSNCF.receive(gsm, source, dest) != 0); + gsm.readGS(&i2, sizeof(int)); + if (i1 != i2) + { + std::cout << "CHIER int altéré\n" + << "Message d'origine: " << i1 << "\n" + << "Message d'arrivé: " << i2 + << std::endl; + return 1; + } + if (source != name3) + { + std::cout << "CHIER source altéré\n" + << "Source attendu: " << name3 << "\n" + << "Source reçu: " << source + << std::endl; + return 1; + } + if (dest != name1) + { + std::cout << "Chier dest attendu\n" + << "Dest attendu: " << name1 << "\n" + << "Dest recu: " << dest << "\n" + << std::endl; + return 1; + } + gsm.clear(); + // Message 2 + while (aiSNCF.receive(gsm, source, dest) != 0); + gsm.readGS(&i2, sizeof(int)); + if (i1 != i2) + { + std::cout << "CHIER int altéré\n" + << "Message d'origine: " << i1 << "\n" + << "Message d'arrivé: " << i2 + << std::endl; + return 1; + } + if (source != name2) + { + std::cout << "CHIER source altéré\n" + << "Source attendu: " << name2 << "\n" + << "Source reçu: " << source + << std::endl; + return 1; + } + if (dest != name3) + { + std::cout << "Chier dest attendu\n" + << "Dest attendu: " << name3 << "\n" + << "Dest recu: " << dest << "\n" + << std::endl; + return 1; + } + gsm.clear(); + // Message 3 + while (aiSNCF.receive(gsm, source, dest) != 0); + gsm.readGS(&i2, sizeof(int)); + if (i1 != i2) + { + std::cout << "CHIER int altéré\n" + << "Message d'origine: " << i1 << "\n" + << "Message d'arrivé: " << i2 + << std::endl; + return 1; + } + if (source != name1) + { + std::cout << "CHIER source altéré\n" + << "Source attendu: " << name1 << "\n" + << "Source reçu: " << source + << std::endl; + return 1; + } + if (dest != name2) + { + std::cout << "Chier dest attendu\n" + << "Dest attendu: " << name2 << "\n" + << "Dest recu: " << dest << "\n" + << std::endl; + return 1; + } + gsm.clear(); + return 0; +} + +void testGSClient(int pauseMode) +{ + while(pauseMode) + sleep (10); + try + { + // Création de l'aiguillage + Aiguillage aiSNCF(std::string("127.0.0.1"), 4242,name3); + GSMessage g1; + g1.appendGS(&i1, sizeof(int)); + aiSNCF.send(g1, name3, name1); + aiSNCF.send(g1, name2, name3); + aiSNCF.send(g1, name1, name2); + } + catch(std::exception & chier) + { + std::cout << "CHIER !! Une exception a été lancé coté client!!" << std::endl; + std::cout << chier.what() << std::endl; + exit (1); + } + exit (0); +} diff --git a/i/simulotron/src/gs/gs_message.cc b/i/simulotron/src/gs/gs_message.cc index c0e099a..541c14c 100644 --- a/i/simulotron/src/gs/gs_message.cc +++ b/i/simulotron/src/gs/gs_message.cc @@ -92,6 +92,6 @@ GSMessage::clear(void) void GSMessage::delBeforeIt(void) { - gs_.erase(gs_.begin(), igs_ - 1); + gs_.erase(gs_.begin(), igs_); setIteratorBegin(); } -- cgit v1.2.3