* formatting all the source code with eclipse source code style
[profile/ivi/genivi/genivi-audio-manager.git] / AudioManagerDaemon / test / sockethandler / sockethandlerTest.cpp
index 2cab649..5c23789 100644 (file)
 #include <sys/ioctl.h>
 #include <string.h>
 #include <netdb.h>
+#include <fcntl.h>
+#include <sys/un.h>
+#include <dlt/dlt.h>
 
+#define SOCK_PATH "/tmp/mysock"
 
 using namespace testing;
 using namespace am;
 
+DLT_DECLARE_CONTEXT(AudioManager)
+
+static volatile sig_atomic_t gDispatch = 1; //this global is used to stop the mainloop
+
 sockethandlerTest::sockethandlerTest()
 {
 }
@@ -25,220 +33,300 @@ sockethandlerTest::~sockethandlerTest()
 {
 }
 
-void fdCallBack::connectSocket(int fd, const short  events)
-{
-       std::cout<<"Socket connection received and open"<<std::endl;
-
-       //accept the connection
-       mSocketConnection = accept(fd, NULL, NULL);
-       short event = 0;
-       event |=POLLIN;
+timerCallBack::timerCallBack(SocketHandler *myHandler) :
+        pTimer1Callback(this, &timerCallBack::timer1Callback), //
+        pTimer2Callback(this, &timerCallBack::timer2Callback), //
+        pTimer3Callback(this, &timerCallBack::timer3Callback), //
+        pTimer4Callback(this, &timerCallBack::timer4Callback), //
+        mSocketHandler(myHandler)
 
-       TBasicPollCallback* buf=&pSocketDataCallback;
-       //add new socketConnection to the handler
-       mSocketHandler->addFDPoll(mSocketConnection,event,buf);
+{
 }
 
-
-
-
-fdCallBack::fdCallBack(SocketHandler *SocketHandler)
-:mSocketConnection(0),
- mSocketHandler(SocketHandler),
- pSocketDataCallback(this, &fdCallBack::handleSocketData),
- pSocketConnectionCallback(this, &fdCallBack::connectSocket)
+am::timerCallBack::~timerCallBack()
 {
 }
 
-
-
-void am::fdCallBack::handleSocketData(int fd, const short  events)
+void am::timerCallBack::timer1Callback(sh_timerHandle_t handle, void* userData)
 {
-       char buffer[3000];
-       std::string msg;
-
-       //there is something for us, read it
-       int read=recv(mSocketConnection,buffer,sizeof(buffer),NULL);
-       msg=std::string(buffer,read);
-       if (msg.compare("stopit")==0)
-       {
-               mSocketHandler->stop_listening();
-       }
-       else if (msg.compare("answer")==0)
-       {
-               std::string answer="myAnswer";
-               send(mSocketConnection,answer.c_str(),answer.size(),NULL);
-       }
+    std::cout << "callback1 called" << std::endl;
+    timespec timeout;
+    timeout.tv_nsec = 0;
+    timeout.tv_sec = 1;
+    shTimerCallBack *buf = &pTimer1Callback;
+    sh_timerHandle_t handle_;
+    mSocketHandler->addTimer(timeout, buf, handle_, NULL);
 }
 
-fdCallBack::~fdCallBack()
+void am::timerCallBack::timer2Callback(sh_timerHandle_t handle, void* userData)
 {
+    std::cout << "callback2 called" << std::endl;
+    timespec timeout;
+    timeout.tv_nsec = 0;
+    timeout.tv_sec = 1;
+    shTimerCallBack *buf = &pTimer2Callback;
+    sh_timerHandle_t handle_;
+    mSocketHandler->addTimer(timeout, buf, handle_, NULL);
 }
 
-am::timerCallBack::timerCallBack(SocketHandler *myHandler)
- :pTimer1Callback(this, &timerCallBack::timer1Callback),
-  pTimer2Callback(this, &timerCallBack::timer2Callback),
-  pTimer3Callback(this, &timerCallBack::timer3Callback),
-  pTimer4Callback(this, &timerCallBack::timer4Callback),
-  mSocketHandler(myHandler)
-
+void am::timerCallBack::timer3Callback(sh_timerHandle_t, void* userData)
 {
+    std::cout << "callback3 called" << std::endl;
 }
 
-
-
-am::timerCallBack::~timerCallBack()
+void am::timerCallBack::timer4Callback(sh_timerHandle_t, void* userData)
 {
+    std::cout << "callback4 called" << std::endl;
+    mSocketHandler->stop_listening();
 }
 
-
-
-void am::timerCallBack::timer1Callback(SocketHandler::timerHandle_t handle)
+void* playWithSocketServer(void* data)
 {
-       std::cout<<"callback1 called"<<std::endl;
-       timespec timeout;
-       timeout.tv_nsec=0;
-       timeout.tv_sec=1;
-       TBasicTimerCallback *buf=&pTimer1Callback;
-       SocketHandler::timerHandle_t handle_;
-       mSocketHandler->addTimer(timeout,buf,handle_);
+    SocketHandler myHandler;
+    SamplePlugin::sockType_e type = SamplePlugin::INET;
+    SamplePlugin myplugin(&myHandler, type);
+    myHandler.start_listenting();
 }
 
-
-
-void am::timerCallBack::timer2Callback(SocketHandler::timerHandle_t handle)
+void* playWithUnixSocketServer(void* data)
 {
-       std::cout<<"callback2 called"<<std::endl;
-       timespec timeout;
-       timeout.tv_nsec=0;
-       timeout.tv_sec=1;
-       TBasicTimerCallback *buf=&pTimer2Callback;
-       SocketHandler::timerHandle_t handle_;
-       mSocketHandler->addTimer(timeout,buf,handle_);
+    SocketHandler myHandler;
+    SamplePlugin::sockType_e type = SamplePlugin::UNIX;
+    SamplePlugin myplugin(&myHandler, type);
+    myHandler.start_listenting();
 }
 
-void am::timerCallBack::timer3Callback(SocketHandler::timerHandle_t handle)
+TEST(sockethandlerTest,playWithUNIXSockets)
 {
-       std::cout<<"callback3 called"<<std::endl;
+    pthread_t serverThread;
+    char buffer[3000];
+    struct sockaddr_un servAddr;
+    int socket_;
+
+    //creates a thread that handles the serverpart
+    pthread_create(&serverThread, NULL, playWithUnixSocketServer, NULL);
+
+    sleep(1); //we need that here because the port needs to be opened
+    if ((socket_ = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
+    {
+        std::cout << "socket problem" << std::endl;
+
+    }
+
+    memset(&servAddr, 0, sizeof(servAddr));
+    strcpy(servAddr.sun_path, SOCK_PATH);
+    servAddr.sun_family = AF_UNIX;
+    if (connect(socket_, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0)
+    {
+        std::cout << "ERROR: connect() failed\n" << std::endl;
+    }
+
+    for (int i = 0; i <= 1000; i++)
+    {
+        std::string string("Got It?");
+        send(socket_, string.c_str(), string.size(), 0);
+    }
+    std::string string("finish!");
+    send(socket_, string.c_str(), string.size(), 0);
+
+    pthread_join(serverThread, NULL);
 }
 
-void am::timerCallBack::timer4Callback(SocketHandler::timerHandle_t handle)
+TEST(sockethandlerTest,playWithSockets)
 {
-       std::cout<<"callback4 called"<<std::endl;
+    pthread_t serverThread;
+    char buffer[3000];
+    struct sockaddr_in servAddr;
+    unsigned short servPort = 6060;
+    struct hostent *host;
+    int socket_;
+
+    //creates a thread that handles the serverpart
+    pthread_create(&serverThread, NULL, playWithSocketServer, NULL);
+
+    sleep(1); //we need that here because the port needs to be opened
+    if ((socket_ = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)
+    {
+        std::cout << "socket problem" << std::endl;
+
+    }
+
+    if ((host = (struct hostent*) gethostbyname("localhost")) == 0)
+    {
+        std::cout << "ERROR: gethostbyname() failed\n" << std::endl;
+
+    }
+
+    memset(&servAddr, 0, sizeof(servAddr));
+    servAddr.sin_family = AF_INET;
+    servAddr.sin_addr.s_addr = inet_addr(inet_ntoa(*(struct in_addr*) (host->h_addr_list[0])));
+    servAddr.sin_port = htons(servPort);
+
+    if (connect(socket_, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0)
+    {
+        std::cout << "ERROR: connect() failed\n" << std::endl;
+    }
+
+    for (int i = 0; i <= 1000; i++)
+    {
+        std::string string("Got It?");
+        send(socket_, string.c_str(), string.size(), 0);
+    }
+    std::string string("finish!");
+    send(socket_, string.c_str(), string.size(), 0);
+
+    pthread_join(serverThread, NULL);
 }
 
-void* playWithSocketServer(void* data)
+TEST(sockethandlerTest,playWithTimers)
 {
-       int yes = 1;
-
-       //get a SocketHandler
-       SocketHandler myHandler;
-
-       //get a class that handles the callbacks from the handler
-       fdCallBack testCallback(&myHandler);
-
-       //prepare the socket, bind etc...
-       struct sockaddr_in servAddr;
-       int socketHandle = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
-       setsockopt(socketHandle, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
-       servAddr.sin_family      = AF_INET;
-       servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
-       servAddr.sin_port = htons(6060);
-       bind(socketHandle, (struct sockaddr*)(&servAddr), sizeof (servAddr));
-       listen(socketHandle, 3);
+    gDispatchDone = 0;
+    SocketHandler myHandler;
+    timerCallBack testCallback(&myHandler);
+    timespec timeoutTime, timeout2, timeout3, timeout4;
+    timeoutTime.tv_sec = 3;
+    timeoutTime.tv_nsec = 0;
+    timeout2.tv_nsec = 0;
+    timeout2.tv_sec = 1;
+    timeout3.tv_nsec = 000000000;
+    timeout3.tv_sec = 2;
+    timeout4.tv_nsec = 0;
+    timeout4.tv_sec = 13;
+    shTimerCallBack* buf = &testCallback.pTimer1Callback;
+    shTimerCallBack* buf2 = &testCallback.pTimer2Callback;
+    shTimerCallBack* buf3 = &testCallback.pTimer3Callback;
+    shTimerCallBack* buf4 = &testCallback.pTimer4Callback;
+    sh_timerHandle_t handle;
+    myHandler.addTimer(timeoutTime, buf, handle, NULL);
+    myHandler.addTimer(timeout2, buf2, handle, NULL);
+    myHandler.addTimer(timeout3, buf3, handle, NULL);
+    myHandler.addTimer(timeout4, buf4, handle, NULL);
+    myHandler.start_listenting();
 
-       //prepare the event (we want POLLIN because we need to listen)
-       short event = 0;
-       event |=POLLIN;
-
-       TBasicPollCallback* buf=&testCallback.pSocketConnectionCallback;
-       //add the callback to the Sockethandler
-       myHandler.addFDPoll(socketHandle, event, buf);
-
-       //start the mainloop
-       myHandler.start_listenting();
-       close(socketHandle);
 }
 
-
-
-TEST(sockethandlerTest,playWithSockets)
+void sockethandlerTest::SetUp()
 {
-       pthread_t serverThread;
-       char buffer[3000];
-
-       //creates a thread that handles the serverpart
-       pthread_create(&serverThread,NULL,playWithSocketServer,NULL);
-
-       sleep(1); //give a little time to settle everything
-       //make everything ready to send data
-       struct sockaddr_in servAddr;
-       int socketHandle = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
-       struct hostent *host;
-       host = (struct hostent*) gethostbyname("localhost");
-
-       memset(&servAddr, 0, sizeof(servAddr));
-       memcpy(&servAddr.sin_addr, host->h_addr_list[0], host->h_length);
-       servAddr.sin_family      = AF_INET;
-       servAddr.sin_port = htons(6060);
-
-       //connect to the socket
-       int k =connect(socketHandle,(struct sockaddr *) &servAddr, sizeof(servAddr));
+}
 
-       std::string msg="answer";
+void sockethandlerTest::TearDown()
+{
+}
 
-       //send first the answer message and wait for the reply
-       int p=send(socketHandle,msg.c_str(),msg.size(),NULL);
-       int read=recv(socketHandle,buffer,sizeof(buffer),NULL);
-       msg=std::string(buffer,read);
-       ASSERT_TRUE(msg.compare("myAnswer")==0);
+int main(int argc, char **argv)
+{
+    ::testing::InitGoogleTest(&argc, argv);
+    return RUN_ALL_TESTS();
+}
 
-       msg="stopit";
-       //now send a message causing the handler to stop and end the loop
-       p=send(socketHandle,msg.c_str(),msg.size(),NULL);
-       pthread_join(serverThread,NULL);
+am::SamplePlugin::SamplePlugin(SocketHandler *mySocketHandler, sockType_e socketType) :
+        connectFiredCB(this, &SamplePlugin::connectSocket), //
+        receiveFiredCB(this, &SamplePlugin::receiveData), //
+        sampleDispatchCB(this, &SamplePlugin::dispatchData), //
+        sampleCheckCB(this, &SamplePlugin::check), //
+        mSocketHandler(mySocketHandler), //
+        mConnecthandle(), //
+        mReceiveHandle(), //
+        msgList()
+{
+    int ret;
+    int yes = 1;
+
+    int socketHandle;
+    struct sockaddr_in servAddr;
+    struct sockaddr_un unixAddr;
+    unsigned int servPort = 6060;
+
+    switch (socketType)
+    {
+    case UNIX:
+        socketHandle = socket(AF_UNIX, SOCK_STREAM, 0);
+        unixAddr.sun_family = AF_UNIX;
+        strcpy(unixAddr.sun_path, SOCK_PATH);
+        unlink(unixAddr.sun_path);
+        bind(socketHandle, (struct sockaddr *) &unixAddr, strlen(unixAddr.sun_path) + sizeof(unixAddr.sun_family));
+        break;
+    case INET:
+        socketHandle = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
+        setsockopt(socketHandle, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));
+        memset(&servAddr, 0, sizeof(servAddr));
+        servAddr.sin_family = AF_INET;
+        servAddr.sin_addr.s_addr = INADDR_ANY;
+        servAddr.sin_port = htons(servPort);
+        bind(socketHandle, (struct sockaddr *) &servAddr, sizeof(servAddr));
+        break;
+    default:
+        break;
+    }
+
+    if (listen(socketHandle, 3) < 0)
+    {
+        std::cout << "listen ok" << std::endl;
+    } /* if */
+
+    int a = 1;
+    ioctl(socketHandle, FIONBIO, (char *) &a);
+    setsockopt(socketHandle, SOL_SOCKET, SO_KEEPALIVE, (char *) &a, sizeof(a));
+
+    short events = 0;
+    events |= POLLIN;
+    mySocketHandler->addFDPoll(socketHandle, events, NULL, &connectFiredCB, NULL, NULL, NULL, mConnecthandle);
+    std::cout << "setup server - listening" << std::endl;
 }
 
-TEST(sockethandlerTest,playWithTimers)
+void am::SamplePlugin::connectSocket(const pollfd pollfd1, const sh_pollHandle_t handle, void *userData)
 {
-       SocketHandler myHandler;
-       timerCallBack testCallback(&myHandler);
-       timespec timeoutTime, timeout2, timeout3, timeout4;
-       timeoutTime.tv_sec=3;
-       timeoutTime.tv_nsec=0;
-       timeout2.tv_nsec=0;
-       timeout2.tv_sec=1;
-       timeout3.tv_nsec=000000000;
-       timeout3.tv_sec=2;
-       timeout4.tv_nsec=0;
-       timeout4.tv_sec=30;
-       TBasicTimerCallback* buf=&testCallback.pTimer1Callback;
-       TBasicTimerCallback* buf2=&testCallback.pTimer2Callback;
-       TBasicTimerCallback* buf3=&testCallback.pTimer3Callback;
-       TBasicTimerCallback* buf4=&testCallback.pTimer4Callback;
-       SocketHandler::timerHandle_t handle;
-       myHandler.addTimer(timeoutTime,buf,handle);
-       myHandler.addTimer(timeout2,buf2,handle);
-       myHandler.addTimer(timeout3,buf3,handle);
-       myHandler.addTimer(timeout4,buf4,handle);
-       myHandler.start_listenting();
+    //first, accept the connection, create a new filedescriptor
+    std::cout << "Got a connection request !" << std::endl;
+    struct sockaddr answer;
+    socklen_t len = sizeof(answer);
+    int receiveFD = accept(pollfd1.fd, (struct sockaddr*) &answer, &len);
+
+    //set the correct event:
+    short event = 0;
+    event |= POLLIN;
+
+    //aded the filedescriptor to the sockethandler and register the callbacks for receiving the data
+    mSocketHandler->addFDPoll(receiveFD, event, NULL, &receiveFiredCB, &sampleCheckCB, &sampleDispatchCB, NULL, mReceiveHandle);
 
 }
 
-void sockethandlerTest::SetUp()
+void am::SamplePlugin::receiveData(const pollfd pollfd, const sh_pollHandle_t handle, void *userData)
 {
+    //initialize buffer
+    char buffer[10];
+    //read until buffer is full or no more data is there
+    int read = recv(pollfd.fd, buffer, 7, NULL);
+    if (read > 1)
+    {
+        //read the message and store it in a queue
+        std::string msg = std::string(buffer, read);
+        msgList.push(msg);
+        std::cout << "Got a message !" << std::endl;
+    }
 }
 
-void sockethandlerTest::TearDown()
+bool am::SamplePlugin::dispatchData(const sh_pollHandle_t handle, void *userData)
 {
+    //read data from the queue
+    std::cout << "Data:" << msgList.front() << std::endl;
+
+    //if the message was our finish message, we quit the poll loop
+    if (msgList.front().compare("finish!") == 0)
+    {
+        mSocketHandler->stop_listening();
+    }
+    //remove the message from the queue and return false if there is no more message to read.
+    msgList.pop();
+    if (msgList.size() != 0) return true;
+    return false;
 }
 
-int main(int argc, char **argv)
+bool am::SamplePlugin::check(const sh_pollHandle_t handle, void *userData)
 {
-       ::testing::InitGoogleTest(&argc, argv);
-       return RUN_ALL_TESTS();
+    //checks if there is data to dispatch
+    std::cout << "check!:" << std::endl;
+    if (msgList.size() != 0) return true;
+    return false;
 }
 
-
-
-