* assert on empty busname (routinginterface)
[profile/ivi/genivi/genivi-audio-manager.git] / AudioManagerDaemon / test / sockethandler / sockethandlerTest.cpp
1 /*
2  * sockethandlerTest.cpp
3  *
4  *  Created on: Dec 19, 2011
5  *      Author: christian
6  */
7
8 #include "sockethandlerTest.h"
9 #include <stdio.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>
13 #include <string.h>
14 #include <netdb.h>
15 #include <fcntl.h>
16 #include <sys/un.h>
17
18 #define SOCK_PATH "/tmp/mysock"
19
20 using namespace testing;
21 using namespace am;
22
23 sockethandlerTest::sockethandlerTest()
24 {
25 }
26
27 sockethandlerTest::~sockethandlerTest()
28 {
29 }
30
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)
37
38 {
39 }
40
41
42
43 am::timerCallBack::~timerCallBack()
44 {
45 }
46
47
48
49 void am::timerCallBack::timer1Callback(sh_timerHandle_t handle, void* userData)
50 {
51         std::cout<<"callback1 called"<<std::endl;
52         timespec timeout;
53         timeout.tv_nsec=0;
54         timeout.tv_sec=1;
55         shTimerCallBack *buf=&pTimer1Callback;
56         sh_timerHandle_t handle_;
57         mSocketHandler->addTimer(timeout,buf,handle_,NULL);
58 }
59
60
61
62 void am::timerCallBack::timer2Callback(sh_timerHandle_t handle, void* userData)
63 {
64         std::cout<<"callback2 called"<<std::endl;
65         timespec timeout;
66         timeout.tv_nsec=0;
67         timeout.tv_sec=1;
68         shTimerCallBack *buf=&pTimer2Callback;
69         sh_timerHandle_t handle_;
70         mSocketHandler->addTimer(timeout,buf,handle_,NULL);
71 }
72
73 void am::timerCallBack::timer3Callback(sh_timerHandle_t, void* userData)
74 {
75         std::cout<<"callback3 called"<<std::endl;
76 }
77
78 void am::timerCallBack::timer4Callback(sh_timerHandle_t, void* userData)
79 {
80         std::cout<<"callback4 called"<<std::endl;
81         mSocketHandler->stop_listening();
82 }
83
84 void* playWithSocketServer(void* data)
85 {
86         SocketHandler myHandler;
87         SamplePlugin::sockType_e type=SamplePlugin::INET;
88         SamplePlugin myplugin(&myHandler,type);
89         myHandler.start_listenting();
90 }
91
92 void* playWithUnixSocketServer(void* data)
93 {
94         SocketHandler myHandler;
95         SamplePlugin::sockType_e type=SamplePlugin::UNIX;
96         SamplePlugin myplugin(&myHandler,type);
97         myHandler.start_listenting();
98 }
99
100 TEST(sockethandlerTest,playWithUNIXSockets)
101 {
102         pthread_t serverThread;
103         char buffer[3000];
104         struct sockaddr_un servAddr;
105         int socket_;
106
107         //creates a thread that handles the serverpart
108         pthread_create(&serverThread,NULL,playWithUnixSocketServer,NULL);
109
110         sleep(1); //we need that here because the port needs to be opened
111     if ((socket_ = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
112     {
113         std::cout<<"socket problem"<<std::endl;
114
115     }
116
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)
121     {
122         std::cout<<"ERROR: connect() failed\n"<<std::endl;
123     }
124
125         for (int i=0;i<=1000;i++)
126         {
127                 std::string string("Got It?");
128                 send(socket_,string.c_str(),string.size(),0);
129         }
130         std::string string("finish!");
131         send(socket_,string.c_str(),string.size(),0);
132
133         pthread_join(serverThread,NULL);
134 }
135
136 TEST(sockethandlerTest,playWithSockets)
137 {
138         pthread_t serverThread;
139         char buffer[3000];
140         struct sockaddr_in servAddr;
141         unsigned short servPort = 6060;
142         struct hostent *host;
143         int socket_;
144
145         //creates a thread that handles the serverpart
146         pthread_create(&serverThread,NULL,playWithSocketServer,NULL);
147
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)
150     {
151         std::cout<<"socket problem"<<std::endl;
152
153     }
154
155     if ((host = (struct hostent*) gethostbyname("localhost")) == 0)
156     {
157         std::cout<<"ERROR: gethostbyname() failed\n"<<std::endl;
158
159     }
160
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);
165
166     if (connect(socket_, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0)
167     {
168         std::cout<<"ERROR: connect() failed\n"<<std::endl;
169     }
170
171         for (int i=0;i<=1000;i++)
172         {
173                 std::string string("Got It?");
174                 send(socket_,string.c_str(),string.size(),0);
175         }
176         std::string string("finish!");
177         send(socket_,string.c_str(),string.size(),0);
178
179         pthread_join(serverThread,NULL);
180 }
181
182 TEST(sockethandlerTest,playWithTimers)
183 {
184         SocketHandler myHandler;
185         timerCallBack testCallback(&myHandler);
186         timespec timeoutTime, timeout2, timeout3, timeout4;
187         timeoutTime.tv_sec=3;
188         timeoutTime.tv_nsec=0;
189         timeout2.tv_nsec=0;
190         timeout2.tv_sec=1;
191         timeout3.tv_nsec=000000000;
192         timeout3.tv_sec=2;
193         timeout4.tv_nsec=0;
194         timeout4.tv_sec=13;
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();
205
206 }
207
208 void sockethandlerTest::SetUp()
209 {
210 }
211
212 void sockethandlerTest::TearDown()
213 {
214 }
215
216 int main(int argc, char **argv)
217 {
218         ::testing::InitGoogleTest(&argc, argv);
219         return RUN_ALL_TESTS();
220 }
221
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),
228          mConnecthandle(),
229          mReceiveHandle(),
230          msgList()
231 {
232         int ret;
233         int yes = 1;
234
235         int socketHandle;
236         struct sockaddr_in servAddr;
237         struct sockaddr_un unixAddr;
238         unsigned int servPort = 6060;
239
240         switch (socketType)
241         {
242         case UNIX:
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));
248                 break;
249         case INET:
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));
257             break;
258         default:
259                 break;
260         }
261
262     if (listen(socketHandle, 3) < 0)
263     {
264         std::cout<<"listen ok"<<std::endl;
265     } /* if */
266
267     int a=1;
268     ioctl (socketHandle, FIONBIO, (char *) &a);
269     setsockopt (socketHandle, SOL_SOCKET, SO_KEEPALIVE, (char *) &a, sizeof (a));
270
271         short events=0;
272         events |= POLLIN;
273         mySocketHandler->addFDPoll(socketHandle,events,NULL,&connectFiredCB,NULL,NULL,NULL,mConnecthandle);
274         std::cout<<"setup server - listening"<<std::endl;
275 }
276
277
278
279 void am::SamplePlugin::connectSocket(const pollfd pollfd1, const sh_pollHandle_t handle, void *userData)
280 {
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);
286
287         //set the correct event:
288         short event = 0;
289         event |=POLLIN;
290
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);
293
294 }
295
296
297
298 void am::SamplePlugin::receiveData(const pollfd pollfd, const sh_pollHandle_t handle, void *userData)
299 {
300         //initialize buffer
301         char buffer[10];
302         //read until buffer is full or no more data is there
303         int read=recv(pollfd.fd,buffer,7,NULL);
304         if (read>1)
305         {
306                 //read the message and store it in a queue
307                 std::string msg=std::string(buffer,read);
308                 msgList.push(msg);
309                 std::cout<<"Got a message !"<<std::endl;
310         }
311 }
312
313
314
315 bool am::SamplePlugin::dispatchData(const sh_pollHandle_t handle, void *userData)
316 {
317         //read data from the queue
318         std::cout<<"Data:"<<msgList.front()<<std::endl;
319
320         //if the message was our finish message, we quit the poll loop
321         if (msgList.front().compare("finish!")==0)
322         {
323                 mSocketHandler->stop_listening();
324         }
325         //remove the message from the queue and return false if there is no more message to read.
326         msgList.pop();
327         if (msgList.size()!=0) return true;
328         return false;
329 }
330
331 bool am::SamplePlugin::check(const sh_pollHandle_t handle, void *userData)
332 {
333         //checks if there is data to dispatch
334         std::cout<<"check!:"<<std::endl;
335         if (msgList.size()!=0) return true;
336         return false;
337 }
338
339
340
341
342
343
344
345