From 92f0f25b855264557b484003036285f8ed5ad0d0 Mon Sep 17 00:00:00 2001 From: Christian Kern Date: Tue, 26 May 2015 09:02:47 +0200 Subject: [PATCH] Added tests for ID Pool. Also added check for memleaks, which was missing. --- mtapi_c/test/embb_mtapi_test_id_pool.cc | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mtapi_c/test/embb_mtapi_test_id_pool.h | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mtapi_c/test/main.cc | 6 ++++++ 3 files changed, 186 insertions(+) create mode 100644 mtapi_c/test/embb_mtapi_test_id_pool.cc create mode 100644 mtapi_c/test/embb_mtapi_test_id_pool.h diff --git a/mtapi_c/test/embb_mtapi_test_id_pool.cc b/mtapi_c/test/embb_mtapi_test_id_pool.cc new file mode 100644 index 0000000..8d5b52c --- /dev/null +++ b/mtapi_c/test/embb_mtapi_test_id_pool.cc @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2014-2015, Siemens AG. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +IdPoolTest::IdPoolTest() { + CreateUnit("mtapi id pool test single threaded"). + Add(&IdPoolTest::TestBasic, this, 1, 1000). + Pre(&IdPoolTest::TestBasicPre, this). + Post(&IdPoolTest::TestBasicPost, this); + + CreateUnit("mtapi id pool test concurrent"). + Add(&IdPoolTest::TestParallel, this, CONCURRENT_ACCESSORS_ID_POOL_2 + , 20). + Post(&IdPoolTest::TestParallelPost, this). + Pre(&IdPoolTest::TestParallelPre, this); +} + +void IdPoolTest::TestParallel() { + // allocate ID_ELEMENTS_PER_ACCESSOR elements. Each test thread is + // guaranteed to be able to allocate this amount of elements. + TestAllocateDeallocateNElementsFromPool(id_pool_parallel, + ID_ELEMENTS_PER_ACCESSOR); +} + +void IdPoolTest::TestParallelPre() { + // create second id pool with CONCURRENT_ACCESSORS_ID_POOL_2* + // ID_ELEMENTS_PER_ACCESSOR elements + embb_mtapi_id_pool_initialize(&id_pool_parallel, + CONCURRENT_ACCESSORS_ID_POOL_2*ID_ELEMENTS_PER_ACCESSOR); +} + +void IdPoolTest::TestParallelPost() { + // after the parallel tests, try to again allocate and deallocate all + // elements sequentially. + TestAllocateDeallocateNElementsFromPool(id_pool_parallel, + CONCURRENT_ACCESSORS_ID_POOL_2*ID_ELEMENTS_PER_ACCESSOR, true); + + // finalize pool + embb_mtapi_id_pool_finalize(&id_pool_parallel); +} + +void IdPoolTest::TestBasic() { + TestAllocateDeallocateNElementsFromPool(id_pool, ID_POOL_SIZE_1, true); +} + +void IdPoolTest::TestBasicPre() { + // create id pool with ID_POOL_SIZE_1 elements + embb_mtapi_id_pool_initialize(&id_pool, ID_POOL_SIZE_1); +} + +void IdPoolTest::TestBasicPost() { + // finalize pool + embb_mtapi_id_pool_finalize(&id_pool); +} + +void IdPoolTest::TestAllocateDeallocateNElementsFromPool( + embb_mtapi_id_pool_t &pool, + int count_elements, + bool empty_check) { + std::vector allocated; + + for (int i = 0; i != count_elements; ++i) { + allocated.push_back(embb_mtapi_id_pool_allocate(&pool)); + } + + // the allocated elements should be disjunctive, and never invalid element + for (int x = 0; x != allocated.size(); ++x) { + PT_ASSERT(allocated[x] != EMBB_MTAPI_IDPOOL_INVALID_ID); + for (int y = 0; y != allocated.size(); ++y) { + if (x == y) { + continue; + } + PT_ASSERT(allocated[x] != allocated[y]); + } + } + + // now the id pool should be empty... try ten times to get an id, + // we should always get the invalid element + if (empty_check) { + for (int i = 0; i != 10; ++i) { + PT_ASSERT_EQ(embb_mtapi_id_pool_allocate(&pool), + EMBB_MTAPI_IDPOOL_INVALID_ID + ) + } + } + + // now return allocated elements in a shuffled manner. + ::std::random_shuffle(allocated.begin(), allocated.end()); + + for (int i = 0; i != count_elements; ++i) { + embb_mtapi_id_pool_deallocate(&pool, allocated[i]); + } +} + diff --git a/mtapi_c/test/embb_mtapi_test_id_pool.h b/mtapi_c/test/embb_mtapi_test_id_pool.h new file mode 100644 index 0000000..e8c3eb5 --- /dev/null +++ b/mtapi_c/test/embb_mtapi_test_id_pool.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2014-2015, Siemens AG. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef MTAPI_C_TEST_EMBB_MTAPI_TEST_ID_POOL_H_ +#define MTAPI_C_TEST_EMBB_MTAPI_TEST_ID_POOL_H_ + +#include +#include + +// for shuffling a vector +#include + +#define ID_POOL_SIZE_1 100 +#define CONCURRENT_ACCESSORS_ID_POOL_2 10 +#define ID_ELEMENTS_PER_ACCESSOR 10 + +class IdPoolTest : public partest::TestCase { +public: + embb_mtapi_id_pool_t id_pool; + embb_mtapi_id_pool_t id_pool_parallel; + + IdPoolTest(); + +private: + void TestParallel(); + void TestParallelPre(); + void TestParallelPost(); + + void TestBasic(); + void TestBasicPre(); + void TestBasicPost(); + + static void TestAllocateDeallocateNElementsFromPool( + embb_mtapi_id_pool_t &pool, + int count_elements, + bool empty_check = false); +}; + +#endif // MTAPI_C_TEST_EMBB_MTAPI_TEST_ID_POOL_H_ diff --git a/mtapi_c/test/main.cc b/mtapi_c/test/main.cc index a92b25d..3511f7e 100644 --- a/mtapi_c/test/main.cc +++ b/mtapi_c/test/main.cc @@ -37,6 +37,9 @@ #include #include #include +#include + +#include PT_MAIN("MTAPI C") { embb_log_set_log_level(EMBB_LOG_LEVEL_NONE); @@ -48,4 +51,7 @@ PT_MAIN("MTAPI C") { PT_RUN(InitFinalizeTest); PT_RUN(GroupTest); PT_RUN(QueueTest); + PT_RUN(IdPoolTest); + + PT_EXPECT(embb_get_bytes_allocated() == 0); } -- libgit2 0.26.0