Socket: BUGFIX: Move incorrect v-function call out of FileBody destructor
[senf.git] / Socket / SocketHandle.test.cc
index 4ab96dd..709fb9f 100644 (file)
@@ -1,9 +1,9 @@
 // $Id$
 //
 // Copyright (C) 2006
-// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
-// Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
-//     Stefan Bund <stefan.bund@fokus.fraunhofer.de>
+// Fraunhofer Institute for Open Communication Systems (FOKUS)
+// Competence Center NETwork research (NET), St. Augustin, GERMANY
+//     Stefan Bund <g0dil@berlios.de>
 //
 // This program is free software; you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
 #include "SocketProtocol.test.hh"
 #include "AddressingPolicy.hh"
 
-#include <boost/test/auto_unit_test.hpp>
+#include "../Utils/auto_unit_test.hh"
 #include <boost/test/test_tools.hpp>
 
 #define prefix_
 ///////////////////////////////cc.p////////////////////////////////////////
 
 namespace {
-    namespace sl = senf;
 
     class MySocketHandle
-        : public sl::SocketHandle<sl::test::SomeProtocol::Policy>
+        : public senf::SocketHandle<senf::test::SomeProtocol::Policy>
     {
     public:
         MySocketHandle()
-            : sl::SocketHandle<sl::test::SomeProtocol::Policy>(
-                std::auto_ptr<sl::SocketProtocol>(new sl::test::SomeProtocol()),false)
+            : senf::SocketHandle<senf::test::SomeProtocol::Policy>(
+                std::auto_ptr<senf::SocketBody>(
+                    new senf::ProtocolSocketBody<senf::test::SomeProtocol>(false, 0)))
             {}
     };
 
@@ -53,47 +53,51 @@ namespace {
         : public senf::FileHandle
     {
     public:
-        FDHandle()
-            : senf::FileHandle(std::auto_ptr<senf::FileBody>(
-                                          new senf::FileBody())) {}
+        FDHandle() : senf::FileHandle(std::auto_ptr<senf::FileBody>(new senf::FileBody())) {}
     };
+
 }
 
 BOOST_AUTO_UNIT_TEST(socketHandle)
 {
-    typedef sl::MakeSocketPolicy<
-        sl::test::SomeCommunicationPolicy,
-        sl::test::SomeReadPolicy
+    typedef senf::MakeSocketPolicy<
+        senf::test::SomeCommunicationPolicy,
+        senf::test::SomeReadPolicy
         >::policy OtherSocketPolicy;
-    typedef sl::SocketHandle<OtherSocketPolicy> OtherSocketHandle;
-
-    MySocketHandle myh;
-    OtherSocketHandle osh (myh);
-    osh = myh;
-
-    typedef sl::SocketHandle<sl::test::SomeProtocol::Policy> SomeSocketHandle;
-    SomeSocketHandle ssh = senf::static_socket_cast<SomeSocketHandle>(osh);
-
-    BOOST_CHECK_NO_THROW( senf::dynamic_socket_cast<SomeSocketHandle>(osh) );
-
-    typedef sl::SocketHandle< sl::MakeSocketPolicy<
-        OtherSocketPolicy,
-        senf::NoAddressingPolicy
-        >::policy> SomeOtherSocketHandle;
-
-    BOOST_CHECK_THROW( senf::dynamic_socket_cast<SomeOtherSocketHandle>(osh),
-                       std::bad_cast );
-    BOOST_CHECK_THROW( senf::dynamic_socket_cast<SomeSocketHandle>(
-                           senf::FileHandle(FDHandle())),
-                       std::bad_cast );
-
-    BOOST_CHECK_EQUAL( myh.dumpState(),
-                       "file.handle: -1\n"
-                       "file.refcount: 3\n"
-                       "handle: senf::SocketHandle<senf::SocketPolicy<senf::test::SomeAddressingPolicy, senf::test::SomeFramingPolicy, senf::test::SomeCommunicationPolicy, senf::test::SomeReadPolicy, senf::test::SomeWritePolicy, senf::test::SomeBufferingPolicy> >\n"
-                       "socket.policy: senf::SocketPolicy<senf::test::SomeAddressingPolicy, senf::test::SomeFramingPolicy, senf::test::SomeCommunicationPolicy, senf::test::SomeReadPolicy, senf::test::SomeWritePolicy, senf::test::SomeBufferingPolicy>\n"
-                       "socket.protocol: senf::test::SomeProtocol\n"
-                       "socket.server: false\n" );
+    typedef senf::SocketHandle<OtherSocketPolicy> OtherSocketHandle;
+
+    {
+        MySocketHandle myh;
+        OtherSocketHandle osh (myh);
+        osh = myh;
+
+        typedef senf::SocketHandle<senf::test::SomeProtocol::Policy> SomeSocketHandle;
+        SomeSocketHandle ssh = senf::static_socket_cast<SomeSocketHandle>(osh);
+
+        BOOST_CHECK_NO_THROW( senf::dynamic_socket_cast<SomeSocketHandle>(osh) );
+
+        typedef senf::SocketHandle< senf::MakeSocketPolicy<
+            OtherSocketPolicy,
+            senf::NoAddressingPolicy
+            >::policy> SomeOtherSocketHandle;
+
+        BOOST_CHECK_THROW( senf::dynamic_socket_cast<SomeOtherSocketHandle>(osh),
+                           std::bad_cast );
+        BOOST_CHECK_THROW( senf::dynamic_socket_cast<SomeSocketHandle>(
+                               senf::FileHandle(FDHandle())),
+                           std::bad_cast );
+
+        BOOST_CHECK_EQUAL( myh.dumpState(),
+                           "file.handle: 0\n"
+                           "file.refcount: 3\n"
+                           "handle: senf::SocketHandle<senf::SocketPolicy<senf::test::SomeAddressingPolicy, senf::test::SomeFramingPolicy, senf::test::SomeCommunicationPolicy, senf::test::SomeReadPolicy, senf::test::SomeWritePolicy> >\n"
+                           "socket.protocol: senf::test::SomeProtocol\n"
+                           "socket.protocol.policy: senf::SocketPolicy<senf::test::SomeAddressingPolicy, senf::test::SomeFramingPolicy, senf::test::SomeCommunicationPolicy, senf::test::SomeReadPolicy, senf::test::SomeWritePolicy>\n"
+                           "socket.server: false\n" );
+    }
+    
+    // Ensure, the destructor is called and calls the correct close() implementation
+    BOOST_CHECK_EQUAL( senf::test::SomeProtocol::closeCount(), 1u );
 }
 
 ///////////////////////////////cc.e////////////////////////////////////////
@@ -106,4 +110,6 @@ BOOST_AUTO_UNIT_TEST(socketHandle)
 // c-file-style: "senf"
 // indent-tabs-mode: nil
 // ispell-local-dictionary: "american"
+// compile-command: "scons -u test"
+// comment-column: 40
 // End: