X-Git-Url: http://g0dil.de/git?a=blobdiff_plain;f=Utils%2Fintrusive_refcount.test.cc;h=a947f1d31cd9c4d92f4b9076d63140789b5910e0;hb=b8ca4a544cce3e6023bb56b712a03d6362f2bb79;hp=8ed8772090bbd9a2b7942096706bfaaf69cf1e8f;hpb=ac6a813d9d99f7add4e13aff7a4bcd314d5604a6;p=senf.git diff --git a/Utils/intrusive_refcount.test.cc b/Utils/intrusive_refcount.test.cc index 8ed8772..a947f1d 100644 --- a/Utils/intrusive_refcount.test.cc +++ b/Utils/intrusive_refcount.test.cc @@ -1,9 +1,9 @@ // $Id$ // -// Copyright (C) 2006 -// Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS) -// Kompetenzzentrum fuer Satelitenkommunikation (SatCom) -// Stefan Bund +// Copyright (C) 2006 +// Fraunhofer Institute for Open Communication Systems (FOKUS) +// Competence Center NETwork research (NET), St. Augustin, GERMANY +// Stefan Bund // // 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 @@ -20,7 +20,8 @@ // Free Software Foundation, Inc., // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -// Unit tests +/** \file + \brief intrusive_refcount unit tests */ //#include "intrusive_refcount.test.hh" //#include "intrusive_refcount.test.ih" @@ -29,14 +30,14 @@ #include "intrusive_refcount.hh" #include -#include +#include "../Utils/auto_unit_test.hh" #include #define prefix_ ///////////////////////////////cc.p//////////////////////////////////////// namespace { - struct Tester + struct Tester : public senf::intrusive_refcount { typedef boost::intrusive_ptr ptr; @@ -48,6 +49,25 @@ namespace { }; unsigned Tester::counter = 0; + + struct TesterCustom + : public senf::intrusive_refcount_t + { + typedef boost::intrusive_ptr ptr; + typedef senf::intrusive_refcount_t super; + + TesterCustom() { ++counter; } + ~TesterCustom() { --counter; } + + void add_ref() { super::add_ref(); ++refs; } + bool release() { --refs; super::release(); return false; } + + static unsigned counter; + static unsigned refs; + }; + + unsigned TesterCustom::counter = 0; + unsigned TesterCustom::refs = 0; } BOOST_AUTO_UNIT_TEST(intrusive_refcount) @@ -65,7 +85,7 @@ BOOST_AUTO_UNIT_TEST(intrusive_refcount) BOOST_CHECK_EQUAL(p->refcount(),2u); BOOST_CHECK_EQUAL(p->is_shared(),true); } - + BOOST_CHECK_EQUAL(Tester::counter,1u); BOOST_CHECK_EQUAL(p->refcount(),1u); BOOST_CHECK_EQUAL(p->is_shared(),false); @@ -74,11 +94,52 @@ BOOST_AUTO_UNIT_TEST(intrusive_refcount) BOOST_CHECK_EQUAL(Tester::counter,0u); } +BOOST_AUTO_UNIT_TEST(intrusive_refcount_t) +{ + BOOST_CHECK_EQUAL(TesterCustom::counter,0u); + BOOST_CHECK_EQUAL(TesterCustom::refs,0u); + + TesterCustom::ptr p (new TesterCustom); + BOOST_CHECK_EQUAL(TesterCustom::counter,1u); + BOOST_CHECK_EQUAL(p->refcount(),1u); + BOOST_CHECK_EQUAL(p->is_shared(),false); + BOOST_CHECK_EQUAL(TesterCustom::refs,1u); + + + { + TesterCustom::ptr pp (p); + BOOST_CHECK_EQUAL(TesterCustom::counter,1u); + BOOST_CHECK_EQUAL(p->refcount(),2u); + BOOST_CHECK_EQUAL(p->is_shared(),true); + BOOST_CHECK_EQUAL(TesterCustom::refs,2u); + } + + BOOST_CHECK_EQUAL(TesterCustom::counter,1u); + BOOST_CHECK_EQUAL(p->refcount(),1u); + BOOST_CHECK_EQUAL(p->is_shared(),false); + BOOST_CHECK_EQUAL(TesterCustom::refs,1u); + + { + TesterCustom * pp (p.get()); + p = 0; + BOOST_CHECK_EQUAL(TesterCustom::counter,1u); + BOOST_CHECK_EQUAL(TesterCustom::refs,0u); + // The TesterCustom leaks ... + delete pp; + BOOST_CHECK_EQUAL(TesterCustom::counter,0u); + } +} + ///////////////////////////////cc.e//////////////////////////////////////// #undef prefix_ // Local Variables: // mode: c++ +// fill-column: 100 // c-file-style: "senf" +// indent-tabs-mode: nil +// ispell-local-dictionary: "american" +// compile-command: "scons -u test" +// comment-column: 40 // End: