summaryrefslogtreecommitdiff
path: root/i/marvin/src/socket/test_socket_databuffer.cc
blob: fb220a8c242da0ec533b7d70e550fe2f4234aca3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/* test_socket.cc - Programme de test des sockets. */
/* 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_server.hh"
#include "socket_databuffer.hh"
#include "data/data_buffer.hh"
#include "utils/errno_exception.hh"

#include <iostream>
#include <sys/wait.h>

//Chaine et char de test
const std::string strDepart = "J'aime la prog syst�me.";
const char a = 'f';
DataBuffer db1, db2;

int testSockServ(SocketServer & sockServ);
int testSockClient(int pauseMode);

int main(void)
{
    pid_t pid;
    int resultServer = 0, resultClient;
    // Pause mode pour d�bugger le fork
    int pauseMode = 0;

    // Cr�ation de la socket serveur;
    SocketServer sockServ("",4242);
    // Mise en �coute du socket serveur
    sockServ.listen(12);

    // on fork pour traiter le client et le serveur
    pid = fork();
    if(pid == 0) //Processus fils
	testSockClient(pauseMode);
    else //Processus parent
	resultServer = testSockServ(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 testSockServ(SocketServer & sockServ)
{
    try
      {
	// On cr�e le DataBuffer
	db1.write(reinterpret_cast<const uint8_t *>(strDepart.c_str()),
		  strDepart.size());
	db1.write(reinterpret_cast<const uint8_t *>(&a), sizeof(const char));
	// Acceptation d'une connection
	SocketDataBuffer sockFork(sockServ);
	// On �crit la DataBuffer dans la socket
	sockFork.write(db1);
      }
    catch(errno_exception & chier)
      {
	std::cout << "CHIER !! Une exception a �t� lanc� cot� serveur!!" << std::endl;
	std::cout << chier.what() << std::endl;
	return  1;
      }
    return  0;
}

int testSockClient(int pauseMode)
{
    // Chance pour debbuger le fork
    while(pauseMode)
	sleep(10);
    try
      {
	// Cr�ation de la socket client
	SocketDataBuffer sockDataBuffer;
	// Demande de connection
	sockDataBuffer.connect(std::string("127.0.0.1"), 4242);
	// Reception du message serveur
	sockDataBuffer.read(db2, true);
	// Paye ta comparaison de DataBuffer
	if(db1.size() != db2.size())
	  {
	    std::cout << "CHIER!! Les DB ne font pas la m�me size" << std::endl;
	    exit (1);
	  }
      }
    catch(errno_exception & chier)
      {
	std::cout << "CHIER !! Une exception a �t� lanc� cot� client!!" << std::endl;
	std::cout << chier.what() << std::endl;
	exit (1);
      }
    exit (0);
}