2 * sockethandlerTest.cpp
4 * Created on: Dec 19, 2011
8 #include "sockethandlerTest.h"
10 #include <sys/socket.h> /* for socket(), connect(), (), and recv() */
11 #include <arpa/inet.h> /* for sockaddr_in and inet_addr() */
12 #include <sys/ioctl.h>
18 #define SOCK_PATH "/tmp/mysock"
20 using namespace testing;
23 sockethandlerTest::sockethandlerTest()
27 sockethandlerTest::~sockethandlerTest()
31 am::timerCallBack::timerCallBack(SocketHandler *myHandler)
32 :pTimer1Callback(this, &timerCallBack::timer1Callback),
33 pTimer2Callback(this, &timerCallBack::timer2Callback),
34 pTimer3Callback(this, &timerCallBack::timer3Callback),
35 pTimer4Callback(this, &timerCallBack::timer4Callback),
36 mSocketHandler(myHandler)
43 am::timerCallBack::~timerCallBack()
49 void am::timerCallBack::timer1Callback(sh_timerHandle_t handle, void* userData)
51 std::cout<<"callback1 called"<<std::endl;
55 shTimerCallBack *buf=&pTimer1Callback;
56 sh_timerHandle_t handle_;
57 mSocketHandler->addTimer(timeout,buf,handle_,NULL);
62 void am::timerCallBack::timer2Callback(sh_timerHandle_t handle, void* userData)
64 std::cout<<"callback2 called"<<std::endl;
68 shTimerCallBack *buf=&pTimer2Callback;
69 sh_timerHandle_t handle_;
70 mSocketHandler->addTimer(timeout,buf,handle_,NULL);
73 void am::timerCallBack::timer3Callback(sh_timerHandle_t, void* userData)
75 std::cout<<"callback3 called"<<std::endl;
78 void am::timerCallBack::timer4Callback(sh_timerHandle_t, void* userData)
80 std::cout<<"callback4 called"<<std::endl;
81 mSocketHandler->stop_listening();
84 void* playWithSocketServer(void* data)
86 SocketHandler myHandler;
87 SamplePlugin::sockType_e type=SamplePlugin::INET;
88 SamplePlugin myplugin(&myHandler,type);
89 myHandler.start_listenting();
92 void* playWithUnixSocketServer(void* data)
94 SocketHandler myHandler;
95 SamplePlugin::sockType_e type=SamplePlugin::UNIX;
96 SamplePlugin myplugin(&myHandler,type);
97 myHandler.start_listenting();
100 TEST(sockethandlerTest,playWithUNIXSockets)
102 pthread_t serverThread;
104 struct sockaddr_un servAddr;
107 //creates a thread that handles the serverpart
108 pthread_create(&serverThread,NULL,playWithUnixSocketServer,NULL);
110 sleep(1); //we need that here because the port needs to be opened
111 if ((socket_ = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
113 std::cout<<"socket problem"<<std::endl;
117 memset(&servAddr, 0, sizeof(servAddr));
118 strcpy(servAddr.sun_path, SOCK_PATH);
119 servAddr.sun_family = AF_UNIX;
120 if (connect(socket_, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0)
122 std::cout<<"ERROR: connect() failed\n"<<std::endl;
125 for (int i=0;i<=1000;i++)
127 std::string string("Got It?");
128 send(socket_,string.c_str(),string.size(),0);
130 std::string string("finish!");
131 send(socket_,string.c_str(),string.size(),0);
133 pthread_join(serverThread,NULL);
136 TEST(sockethandlerTest,playWithSockets)
138 pthread_t serverThread;
140 struct sockaddr_in servAddr;
141 unsigned short servPort = 6060;
142 struct hostent *host;
145 //creates a thread that handles the serverpart
146 pthread_create(&serverThread,NULL,playWithSocketServer,NULL);
148 sleep(1); //we need that here because the port needs to be opened
149 if ((socket_ = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
151 std::cout<<"socket problem"<<std::endl;
155 if ((host = (struct hostent*) gethostbyname("localhost")) == 0)
157 std::cout<<"ERROR: gethostbyname() failed\n"<<std::endl;
161 memset(&servAddr, 0, sizeof(servAddr));
162 servAddr.sin_family = AF_INET;
163 servAddr.sin_addr.s_addr = inet_addr(inet_ntoa(*( struct in_addr*)( host -> h_addr_list[0])));
164 servAddr.sin_port = htons(servPort);
166 if (connect(socket_, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0)
168 std::cout<<"ERROR: connect() failed\n"<<std::endl;
171 for (int i=0;i<=1000;i++)
173 std::string string("Got It?");
174 send(socket_,string.c_str(),string.size(),0);
176 std::string string("finish!");
177 send(socket_,string.c_str(),string.size(),0);
179 pthread_join(serverThread,NULL);
182 TEST(sockethandlerTest,playWithTimers)
184 SocketHandler myHandler;
185 timerCallBack testCallback(&myHandler);
186 timespec timeoutTime, timeout2, timeout3, timeout4;
187 timeoutTime.tv_sec=3;
188 timeoutTime.tv_nsec=0;
191 timeout3.tv_nsec=000000000;
195 shTimerCallBack* buf=&testCallback.pTimer1Callback;
196 shTimerCallBack* buf2=&testCallback.pTimer2Callback;
197 shTimerCallBack* buf3=&testCallback.pTimer3Callback;
198 shTimerCallBack* buf4=&testCallback.pTimer4Callback;
199 sh_timerHandle_t handle;
200 myHandler.addTimer(timeoutTime,buf,handle,NULL);
201 myHandler.addTimer(timeout2,buf2,handle,NULL);
202 myHandler.addTimer(timeout3,buf3,handle,NULL);
203 myHandler.addTimer(timeout4,buf4,handle,NULL);
204 myHandler.start_listenting();
208 void sockethandlerTest::SetUp()
212 void sockethandlerTest::TearDown()
216 int main(int argc, char **argv)
218 ::testing::InitGoogleTest(&argc, argv);
219 return RUN_ALL_TESTS();
222 am::SamplePlugin::SamplePlugin(SocketHandler *mySocketHandler, sockType_e socketType)
223 :connectFiredCB(this,&SamplePlugin::connectSocket),
224 receiveFiredCB(this,&SamplePlugin::receiveData),
225 sampleDispatchCB(this,&SamplePlugin::dispatchData),
226 sampleCheckCB(this,&SamplePlugin::check),
227 mSocketHandler(mySocketHandler),
236 struct sockaddr_in servAddr;
237 struct sockaddr_un unixAddr;
238 unsigned int servPort = 6060;
243 socketHandle = socket(AF_UNIX, SOCK_STREAM, 0);
244 unixAddr.sun_family = AF_UNIX;
245 strcpy(unixAddr.sun_path,SOCK_PATH);
246 unlink(unixAddr.sun_path);
247 bind(socketHandle, (struct sockaddr *)&unixAddr, strlen(unixAddr.sun_path) + sizeof(unixAddr.sun_family));
250 socketHandle = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
251 setsockopt(socketHandle, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
252 memset(&servAddr, 0, sizeof(servAddr));
253 servAddr.sin_family = AF_INET;
254 servAddr.sin_addr.s_addr = INADDR_ANY;
255 servAddr.sin_port = htons(servPort);
256 bind(socketHandle, (struct sockaddr *) &servAddr, sizeof(servAddr));
262 if (listen(socketHandle, 3) < 0)
264 std::cout<<"listen ok"<<std::endl;
268 ioctl (socketHandle, FIONBIO, (char *) &a);
269 setsockopt (socketHandle, SOL_SOCKET, SO_KEEPALIVE, (char *) &a, sizeof (a));
273 mySocketHandler->addFDPoll(socketHandle,events,NULL,&connectFiredCB,NULL,NULL,NULL,mConnecthandle);
274 std::cout<<"setup server - listening"<<std::endl;
279 void am::SamplePlugin::connectSocket(const pollfd pollfd1, const sh_pollHandle_t handle, void *userData)
281 //first, accept the connection, create a new filedescriptor
282 std::cout<<"Got a connection request !"<<std::endl;
283 struct sockaddr answer;
284 socklen_t len=sizeof(answer);
285 int receiveFD = accept(pollfd1.fd, (struct sockaddr*)&answer, &len);
287 //set the correct event:
291 //aded the filedescriptor to the sockethandler and register the callbacks for receiving the data
292 mSocketHandler->addFDPoll(receiveFD,event,NULL,&receiveFiredCB,&sampleCheckCB,&sampleDispatchCB,NULL,mReceiveHandle);
298 void am::SamplePlugin::receiveData(const pollfd pollfd, const sh_pollHandle_t handle, void *userData)
302 //read until buffer is full or no more data is there
303 int read=recv(pollfd.fd,buffer,7,NULL);
306 //read the message and store it in a queue
307 std::string msg=std::string(buffer,read);
309 std::cout<<"Got a message !"<<std::endl;
315 bool am::SamplePlugin::dispatchData(const sh_pollHandle_t handle, void *userData)
317 //read data from the queue
318 std::cout<<"Data:"<<msgList.front()<<std::endl;
320 //if the message was our finish message, we quit the poll loop
321 if (msgList.front().compare("finish!")==0)
323 mSocketHandler->stop_listening();
325 //remove the message from the queue and return false if there is no more message to read.
327 if (msgList.size()!=0) return true;
331 bool am::SamplePlugin::check(const sh_pollHandle_t handle, void *userData)
333 //checks if there is data to dispatch
334 std::cout<<"check!:"<<std::endl;
335 if (msgList.size()!=0) return true;