diff options
| author | Alan Conway <aconway@apache.org> | 2007-11-01 05:58:50 +0000 |
|---|---|---|
| committer | Alan Conway <aconway@apache.org> | 2007-11-01 05:58:50 +0000 |
| commit | 1907c3872b4ff22b93224f230244f2807d619b77 (patch) | |
| tree | 7f1cc740b7f11b4f96eb9b3c7e43ba7c61e03677 /qpid/cpp/src/tests | |
| parent | e125dd5cf0417fb09c2d44a690bc977ceea8f001 (diff) | |
| download | qpid-python-1907c3872b4ff22b93224f230244f2807d619b77.tar.gz | |
Added qpid::sys::RefCountedMap: thread safe refcounted map of refcounted entries.
- Entries are atomically erased when released.
- Map is released when all entries are erased.
git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@590907 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/src/tests')
| -rw-r--r-- | qpid/cpp/src/tests/Makefile.am | 8 | ||||
| -rw-r--r-- | qpid/cpp/src/tests/RefCountedMap.cpp | 107 |
2 files changed, 112 insertions, 3 deletions
diff --git a/qpid/cpp/src/tests/Makefile.am b/qpid/cpp/src/tests/Makefile.am index e6626eb1e8..37d59aa9e2 100644 --- a/qpid/cpp/src/tests/Makefile.am +++ b/qpid/cpp/src/tests/Makefile.am @@ -21,14 +21,16 @@ CLEANFILES= # # Unit tests are built as a single program to reduce valgrind overhead # when running the tests. If you want to build a subset of the tests do -# rm unit_test; make unit_test unit_test_SOURCES="SelectedTest.cpp" +# rm -f unit_test; make unit_test unit_test_OBJECTS="unit_test.o SelectedTest.o" # TESTS+=unit_test check_PROGRAMS+=unit_test unit_test_LDADD=-lboost_unit_test_framework -lboost_regex $(lib_common) unit_test_SOURCES= unit_test.cpp \ - RefCounted.cpp SessionState.cpp Blob.cpp logging.cpp Url.cpp Uuid.cpp \ + RefCounted.cpp RefCountedMap.cpp \ + SessionState.cpp Blob.cpp logging.cpp \ + Url.cpp Uuid.cpp \ Shlib.cpp FieldValue.cpp FieldTable.cpp check_LTLIBRARIES += libshlibtest.la @@ -96,7 +98,7 @@ testprogs= \ check_PROGRAMS += $(testprogs) interop_runner -TESTS_ENVIRONMENT = VALGRIND=$(VALGRIND) srcdir=$(srcdir) BOOST_TEST_SHOW_PROGRESS=yes $(srcdir)/run_test +TESTS_ENVIRONMENT = VALGRIND=$(VALGRIND) srcdir=$(srcdir) $(srcdir)/run_test system_tests = client_test exception_test quick_perftest quick_topictest TESTS += run-unit-tests start_broker $(system_tests) python_tests stop_broker diff --git a/qpid/cpp/src/tests/RefCountedMap.cpp b/qpid/cpp/src/tests/RefCountedMap.cpp new file mode 100644 index 0000000000..7b0b55db3c --- /dev/null +++ b/qpid/cpp/src/tests/RefCountedMap.cpp @@ -0,0 +1,107 @@ +/* + * + * Copyright (c) 2006 The Apache Software Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#include "qpid/sys/RefCountedMap.h" + +#include <boost/test/auto_unit_test.hpp> +BOOST_AUTO_TEST_SUITE(RefCountedMap); + +using namespace std; +using namespace qpid; +using namespace qpid::sys; + +struct TestMap : public RefCountedMap<int,int> { + static int instances; + TestMap() { ++instances; } + ~TestMap() { --instances; } +}; + +int TestMap::instances=0; + +BOOST_AUTO_TEST_CASE(testRefCountedMap) { + BOOST_CHECK_EQUAL(0, TestMap::instances); + intrusive_ptr<TestMap> map=new TestMap(); + BOOST_CHECK_EQUAL(1, TestMap::instances); + + // Empty map + BOOST_CHECK(map->empty()); + BOOST_CHECK_EQUAL(map->size(), 0u); + BOOST_CHECK(map->begin()==map->end()); + BOOST_CHECK(!map->begin()); + BOOST_CHECK(!map->end()); + BOOST_CHECK(map->find(1)==map->end()); + BOOST_CHECK(!map->find(1)); + + { + // Add and modify an entry + pair<TestMap::iterator, bool> ib=map->insert(TestMap::value_type(1,11)); + BOOST_CHECK(ib.second); + TestMap::iterator p = ib.first; + ib.first.reset(); + BOOST_CHECK(p); + BOOST_CHECK_EQUAL(p->second, 11); + p->second=22; + BOOST_CHECK_EQUAL(22, map->find(1)->second); + BOOST_CHECK(!map->empty()); + BOOST_CHECK_EQUAL(map->size(), 1u); + + // Find an entry + TestMap::iterator q=map->find(1); + BOOST_CHECK(q==p); + BOOST_CHECK_EQUAL(q->first, 1); + } + + BOOST_CHECK(map->empty()); + BOOST_CHECK_EQUAL(1, TestMap::instances); + + { + // Hold the map via a reference to an entry. + TestMap::iterator p=map->insert(TestMap::value_type(2,22)).first; + map=0; // Release the map-> + BOOST_CHECK_EQUAL(1, TestMap::instances); // Held by entry. + BOOST_CHECK_EQUAL(p->second, 22); + } + + BOOST_CHECK_EQUAL(0, TestMap::instances); +} + + +BOOST_AUTO_TEST_CASE(testRefCountedMapIterator) { + BOOST_CHECK_EQUAL(TestMap::instances, 0); + { + intrusive_ptr<TestMap> map=new TestMap(); + TestMap::iterator iter[4], p, q; + for (int i = 0; i < 4; ++i) + iter[i] = map->insert(make_pair(i, 10+i)).first; + int j=0; + for (p = map->begin(); p != map->end(); ++p, ++j) { + BOOST_CHECK_EQUAL(p->first, j); + BOOST_CHECK_EQUAL(p->second, 10+j); + } + BOOST_CHECK_EQUAL(4, j); + + // Release two entries. + iter[0]=iter[2]=TestMap::iterator(); + + p=map->begin(); + BOOST_CHECK_EQUAL(p->second, 11); + ++p; + BOOST_CHECK_EQUAL(p->second, 13); + } + BOOST_CHECK_EQUAL(TestMap::instances, 0); +} |
