libt2n-git Archives

Subject: C++ inter-process communication library branch, master, updated. v0.6-19-g1fdd03d

From: libt2n-git@xxxxxxxxxxxxxxxxxxxxxxx
To: libt2n-git@xxxxxxxxxxxxxxxxxxxxxxx
Date: Wed, 10 Jul 2013 11:33:29 +0200 (CEST)
The branch, master has been updated
       via  1fdd03d219ebc40bf0ec17fdfea4bf1a20666e3a (commit)
      from  673142e5d06e88b5fe4c9f6d839fa1658c850a07 (commit)


- Log -----------------------------------------------------------------
commit 1fdd03d219ebc40bf0ec17fdfea4bf1a20666e3a
Author: Camilo Roca <camilo.roca@xxxxxxxxxxxxx>
Date:   Wed Jul 10 10:52:56 2013 +0200

    get_sockets_set added for external select() calls. Boost test case added to 
check proper behavior.

-----------------------------------------------------------------------

Summary of changes:
 src/socket_handler.hxx |    3 +
 src/socket_server.cpp  |    3 +
 src/socket_server.hxx  |    4 +
 test/CMakeLists.txt    |    1 +
 test/getsocket.cpp     |  190 ++++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 201 insertions(+), 0 deletions(-)
 create mode 100644 test/getsocket.cpp

diff --git a/src/socket_handler.hxx b/src/socket_handler.hxx
index c3522d8..b6776ec 100644
--- a/src/socket_handler.hxx
+++ b/src/socket_handler.hxx
@@ -70,6 +70,9 @@ class socket_handler
         socket_type_value get_type()
             { return socket_type; }
 
+        int get_socket()
+            { return sock; }
+
         bool is_closed();
 
         void set_recv_buffer_size(unsigned int new_recv_buffer_size);
diff --git a/src/socket_server.cpp b/src/socket_server.cpp
index 18bb722..1d18fd2 100644
--- a/src/socket_server.cpp
+++ b/src/socket_server.cpp
@@ -165,6 +165,7 @@ void socket_server::start_listening()
     /* clear & insert server sock into the fd_tab to prepare select */
     FD_ZERO(&connection_set);
     FD_SET (sock, &connection_set);
+    sockets_set.insert(sock);
 }
 
 /// handle a new connection from a client
@@ -190,6 +191,7 @@ void socket_server::new_connection()
     }
 
     FD_SET (newsock, &connection_set);
+    sockets_set.insert(newsock);
 
     socket_server_connection *nc=new socket_server_connection(newsock, 
get_type(), get_default_timeout());
     nc->set_socket_options(newsock);
@@ -287,6 +289,7 @@ bool socket_server::fill_connection_buffers()
 void socket_server::remove_connection_socket(int sock)
 {
     FD_CLR(sock, &connection_set);
+    sockets_set.erase(sock);
 }
 
 /**
diff --git a/src/socket_server.hxx b/src/socket_server.hxx
index ae30833..74d8e07 100644
--- a/src/socket_server.hxx
+++ b/src/socket_server.hxx
@@ -24,6 +24,7 @@ on this file might be covered by the GNU General Public 
License.
 
 #include <sys/types.h>
 #include <string>
+#include <set>
 
 #include "server.hxx"
 #include "socket_handler.hxx"
@@ -48,6 +49,7 @@ class socket_server : public socket_handler, public server
     private:
         fd_set connection_set;
         std::string unix_path;
+        std::set<int> sockets_set;
 
         void start_listening();
 
@@ -67,6 +69,8 @@ class socket_server : public socket_handler, public server
         ~socket_server();
 
         bool fill_buffer(long long usec_timeout=-1,long long* 
usec_timeout_remaining=NULL);
+        std::set<int> get_sockets_set()
+            { return sockets_set; };
 };
 
 /** @brief Socket based connection
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 66f7e7a..8037493 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -11,6 +11,7 @@ set(test_SOURCES
     simplecmd.cpp
     timeout.cpp
     wrapper.cpp
+    getsocket.cpp
     test_fixtures.hxx
 )
 include_directories(BEFORE
diff --git a/test/getsocket.cpp b/test/getsocket.cpp
new file mode 100644
index 0000000..96964cb
--- /dev/null
+++ b/test/getsocket.cpp
@@ -0,0 +1,190 @@
+/*
+Copyright (C) 2004 by Intra2net AG
+
+The software in this package is distributed under the GNU General
+Public License version 2 (with a special exception described below).
+
+A copy of GNU General Public License (GPL) is included in this distribution,
+in the file COPYING.GPL.
+
+As a special exception, if other files instantiate templates or use macros
+or inline functions from this file, or you compile this file and link it
+with other works to produce a work based on this file, this file
+does not by itself cause the resulting work to be covered
+by the GNU General Public License.
+
+However the source code for this file must still be made available
+in accordance with section (3) of the GNU General Public License.
+
+This exception does not invalidate any other reasons why a work based
+on this file might be covered by the GNU General Public License.
+*/
+#include <sys/types.h>
+#include <unistd.h>
+#include <errno.h>
+#include <signal.h>
+#include <stdio.h>
+
+#include <iostream>
+#include <string>
+#include <sstream>
+#include <stdexcept>
+#include <set>
+
+#define BOOST_TEST_DYN_LINK
+#include <boost/test/unit_test.hpp>
+
+#include <boost/archive/binary_oarchive.hpp>
+#include <boost/archive/binary_iarchive.hpp>
+#include <boost/archive/xml_oarchive.hpp>
+#include <boost/archive/xml_iarchive.hpp>
+#include <boost/serialization/serialization.hpp>
+
+#include <container.hxx>
+#include <socket_client.hxx>
+#include <socket_server.hxx>
+#include <command_client.hxx>
+#include <command_server.hxx>
+
+#include "test_fixtures.hxx"
+
+using namespace std;
+
+set<int> SocketSet;
+
+bool check_sockets(const int& test_socket)
+{
+    bool ret = false;
+    set<int>::iterator it;
+    for (it = SocketSet.begin(); it != SocketSet.end(); it++)
+    {
+        if (test_socket == *it)
+        {
+            ret = true;
+            break;
+        }
+    }
+    return ret;
+}
+
+class checkfunc_res : public libt2n::result
+{
+    private:
+        bool res;
+
+        friend class boost::serialization::access;
+        template<class Archive>
+        void serialize(Archive & ar, const unsigned int version)
+        {
+            ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(libt2n::result);
+            ar & BOOST_SERIALIZATION_NVP(res);
+        }
+
+    public:
+        checkfunc_res()
+            { }
+
+        checkfunc_res(const bool& value)
+        {
+            res=value;
+        }
+
+        bool get_data()
+        {
+            return res;
+        }
+};
+
+
+class checkfunc_cmd : public libt2n::command
+{
+    private:
+        int param;
+
+        friend class boost::serialization::access;
+        template<class Archive>
+        void serialize(Archive & ar, const unsigned int version)
+        {
+            ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(libt2n::command);
+            ar & BOOST_SERIALIZATION_NVP(param);
+        }
+
+    public:
+        checkfunc_cmd()
+            {}
+
+        checkfunc_cmd(const int& value)
+        {
+            param=value;
+        }
+
+        libt2n::result* operator()()
+        {
+            return new checkfunc_res(check_sockets(param));
+        }
+};
+
+#include <boost/serialization/export.hpp>
+
+BOOST_CLASS_EXPORT(checkfunc_cmd)
+BOOST_CLASS_EXPORT(checkfunc_res)
+
+using namespace libt2n;
+
+BOOST_FIXTURE_TEST_SUITE(test_getsocket, KillChildOnShutdownFixture)
+
+BOOST_AUTO_TEST_CASE(SocketCheck)
+{
+    switch(child_pid=fork())
+    {
+        case -1:
+        {
+            BOOST_FAIL("fork error");
+            break;
+        }
+        case 0:
+        // child
+        {
+            try
+            {
+                socket_server ss("./socket");
+                command_server cs(ss);
+
+                // max 10 sec
+                for (int i=0; i < 10; i++)
+                {
+                    SocketSet = ss.get_sockets_set();
+                    cs.handle(1000000);
+                }
+            } catch(...)
+            {
+                std::cerr << "exception in child. ignoring\n";
+            }
+
+            // don't call atexit and stuff
+            _exit(0);
+        }
+
+        default:
+        // parent
+        {
+            // wait till server is up
+            sleep(1);
+            socket_client_connection sc("./socket");
+            sc.set_logging(&cerr,debug);
+            command_client cc(&sc);
+
+            result_container rc;
+            int socket_fd = sc.get_socket();
+            // Next line causes problem
+            cc.send_command(new checkfunc_cmd(socket_fd),rc);
+
+            bool ret=dynamic_cast<checkfunc_res*>(rc.get_result())->get_data();
+
+            BOOST_CHECK(ret);
+        }
+    }
+}
+
+
+BOOST_AUTO_TEST_SUITE_END()


hooks/post-receive
-- 
C++ inter-process communication library

--
libt2n-git - see http://www.intra2net.com/en/developer/libt2n for details.
To unsubscribe send a mail to libt2n-git+unsubscribe@xxxxxxxxxxxxxxxxxxxxxxx   

Current Thread
  • C++ inter-process communication library branch, master, updated. v0.6-19-g1fdd03d, libt2n-git <=