Avoid double call to write/send in test
[metaproxy-moved-to-github.git] / src / test_pipe.cpp
index e4f09c8..9ff7664 100644 (file)
@@ -1,12 +1,24 @@
-/* $Id: test_pipe.cpp,v 1.1 2005-11-07 12:32:01 adam Exp $
-   Copyright (c) 2005, Index Data.
+/* $Id: test_pipe.cpp,v 1.10 2007-02-21 14:01:27 adam Exp $
+   Copyright (c) 2005-2007, Index Data.
 
-%LICENSE%
+   See the LICENSE file for details
  */
 
 #include "config.hpp"
+#include <errno.h>
+#include <yazpp/socket-manager.h>
 
-#include <yaz++/socket-manager.h>
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#ifdef WIN32
+#include <winsock.h>
+#endif
+
+#if HAVE_SYS_SOCKET_H
+#include <sys/socket.h>
+#endif
 
 #include <iostream>
 #include <stdexcept>
 #include <boost/test/auto_unit_test.hpp>
 
 using namespace boost::unit_test;
+namespace mp = metaproxy_1;
 
-class My_Timer_Thread : public yazpp_1::ISocketObserver {
+class Timer : public yazpp_1::ISocketObserver {
 private:
     yazpp_1::ISocketObservable *m_obs;
-    yp2::Pipe m_pipe;
+    mp::Pipe m_pipe;
+    bool m_data;
     bool m_timeout;
 public:
-    My_Timer_Thread(yazpp_1::ISocketObservable *obs, int duration);
+    Timer(yazpp_1::ISocketObservable *obs, int duration);
     void socketNotify(int event);
     bool timeout() { return m_timeout; };
+    bool data() { return m_data; };
 };
 
 
-My_Timer_Thread::My_Timer_Thread(yazpp_1::ISocketObservable *obs,
+Timer::Timer(yazpp_1::ISocketObservable *obs,
                                 int duration) : 
-    m_obs(obs), m_pipe(0), m_timeout(false)
+    m_obs(obs), m_pipe(9122), m_data(false), m_timeout(false)
 {
     obs->addObserver(m_pipe.read_fd(), this);
     obs->maskObserver(this, yazpp_1::SOCKET_OBSERVE_READ);
     obs->timeoutObserver(this, duration);
+#ifdef WIN32
+    int r = send(m_pipe.write_fd(), "", 1, 0);
+#else
+    int r = write(m_pipe.write_fd(), "", 1);
+#endif
+    if (r == -1)
+    {
+        std::cout << "Error write: "<< strerror(errno) << std::endl;
+    }
+    BOOST_CHECK_EQUAL(r, 1);
 }
 
-void My_Timer_Thread::socketNotify(int event)
+void Timer::socketNotify(int event)
 {
-    m_timeout = true;
-    m_obs->deleteObserver(this);
+    if (event & yazpp_1::SOCKET_OBSERVE_READ)
+    {
+        m_data = true;
+        char buf[3];
+#ifdef WIN32
+        int r = recv(m_pipe.read_fd(), buf, 1, 0);
+#else
+        int r = read(m_pipe.read_fd(), buf, 1);
+#endif
+        if (r == -1)
+        {
+            std::cout << "Error read: "<< strerror(errno) << std::endl;
+        }
+    }
+    else if (event && yazpp_1::SOCKET_OBSERVE_TIMEOUT)
+    {
+        m_timeout = true;
+        m_obs->deleteObserver(this);
+    }
 }
 
-BOOST_AUTO_TEST_CASE( test_pipe_1 )
+BOOST_AUTO_UNIT_TEST( test_pipe_1 )
 {
     yazpp_1::SocketManager mySocketManager;
     
-    yp2::Pipe pipe(0);
-
-    My_Timer_Thread t(&mySocketManager, 0);
+    Timer t(&mySocketManager, 1);
 
     while (mySocketManager.processEvent() > 0)
         if (t.timeout())
             break;
-    BOOST_CHECK (t.timeout());
+    BOOST_CHECK(t.timeout());
+    BOOST_CHECK(t.data());
 }
 
 /*