Socket: BUGFIX: Move incorrect v-function call out of FileBody destructor
[senf.git] / Socket / SocketHandle.test.cc
index f8494a3..709fb9f 100644 (file)
@@ -1,8 +1,8 @@
 // $Id$
 //
 // Copyright (C) 2006
-// Fraunhofer Institute for Open Communication Systems (FOKUS) 
-// Competence Center NETwork research (NET), St. Augustin, GERMANY 
+// 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
 ///////////////////////////////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////////////////////////////////////////