test/test_basic_mempool.cpp

Mon, 08 Aug 2022 17:12:00 +0200

author
Mike Becker <universe@uap-core.de>
date
Mon, 08 Aug 2022 17:12:00 +0200
changeset 572
f0f99dd06d9f
parent 571
f83583a0bbac
permissions
-rw-r--r--

#201 - remove dangerous allocator config

There is no plausible use case, except using the testing
allocator in the test case, and having the possibility to
specify any allocator (including another mempool) causes
more harm than good.

universe@571 1 /*
universe@571 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
universe@571 3 *
universe@571 4 * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
universe@571 5 *
universe@571 6 * Redistribution and use in source and binary forms, with or without
universe@571 7 * modification, are permitted provided that the following conditions are met:
universe@571 8 *
universe@571 9 * 1. Redistributions of source code must retain the above copyright
universe@571 10 * notice, this list of conditions and the following disclaimer.
universe@571 11 *
universe@571 12 * 2. Redistributions in binary form must reproduce the above copyright
universe@571 13 * notice, this list of conditions and the following disclaimer in the
universe@571 14 * documentation and/or other materials provided with the distribution.
universe@571 15 *
universe@571 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
universe@571 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
universe@571 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
universe@571 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
universe@571 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
universe@571 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
universe@571 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
universe@571 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
universe@571 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
universe@571 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
universe@571 26 * POSSIBILITY OF SUCH DAMAGE.
universe@571 27 */
universe@571 28
universe@571 29 #include "cx/basic_mempool.h"
universe@571 30 #include "util_allocator.h"
universe@571 31 #include <gtest/gtest.h>
universe@571 32
universe@571 33 class CxBasicMempool : public ::testing::Test {
universe@571 34 protected:
universe@571 35 CxMempool *pool = nullptr;
universe@571 36
universe@571 37 void TearDown() override {
universe@571 38 if (pool != nullptr) {
universe@571 39 cxMempoolDestroy(pool);
universe@571 40 }
universe@571 41 }
universe@571 42 };
universe@571 43
universe@571 44 TEST_F(CxBasicMempool, Create) {
universe@572 45 pool = cxBasicMempoolCreate(16);
universe@571 46 ASSERT_NE(pool->allocator, nullptr);
universe@571 47 ASSERT_NE(pool->cl, nullptr);
universe@571 48 EXPECT_NE(pool->cl->destroy, nullptr);
universe@571 49 ASSERT_NE(pool->allocator->cl, nullptr);
universe@571 50 EXPECT_EQ(pool->allocator->data, pool);
universe@571 51 EXPECT_NE(pool->allocator->cl->malloc, nullptr);
universe@571 52 EXPECT_NE(pool->allocator->cl->calloc, nullptr);
universe@571 53 EXPECT_NE(pool->allocator->cl->realloc, nullptr);
universe@571 54 EXPECT_NE(pool->allocator->cl->free, nullptr);
universe@571 55
universe@571 56 auto basic_pool = reinterpret_cast<cx_basic_mempool_s *>(pool);
universe@571 57 EXPECT_EQ(basic_pool->size, 16);
universe@571 58 EXPECT_EQ(basic_pool->ndata, 0);
universe@571 59 EXPECT_NE(basic_pool->data, nullptr);
universe@571 60 }
universe@571 61
universe@571 62 TEST_F(CxBasicMempool, malloc) {
universe@572 63 pool = cxBasicMempoolCreate(4);
universe@571 64 auto basic_pool = reinterpret_cast<cx_basic_mempool_s *>(pool);
universe@571 65 EXPECT_NE(cxMalloc(pool->allocator, sizeof(int)), nullptr);
universe@571 66 EXPECT_NE(cxMalloc(pool->allocator, sizeof(int)), nullptr);
universe@571 67 EXPECT_EQ(basic_pool->ndata, 2);
universe@571 68 EXPECT_EQ(basic_pool->size, 4);
universe@571 69 EXPECT_NE(cxMalloc(pool->allocator, sizeof(int)), nullptr);
universe@571 70 EXPECT_NE(cxMalloc(pool->allocator, sizeof(int)), nullptr);
universe@571 71 EXPECT_EQ(basic_pool->ndata, 4);
universe@571 72 EXPECT_EQ(basic_pool->size, 4);
universe@571 73 EXPECT_NE(cxMalloc(pool->allocator, sizeof(int)), nullptr);
universe@571 74 EXPECT_NE(cxMalloc(pool->allocator, sizeof(int)), nullptr);
universe@571 75 EXPECT_EQ(basic_pool->ndata, 6);
universe@571 76 EXPECT_GE(basic_pool->size, 6);
universe@571 77 }
universe@571 78
universe@571 79 TEST_F(CxBasicMempool, calloc) {
universe@572 80 pool = cxBasicMempoolCreate(4);
universe@571 81
universe@571 82 auto test = (int *) cxCalloc(pool->allocator, 2, sizeof(int));
universe@571 83 ASSERT_NE(test, nullptr);
universe@571 84 EXPECT_EQ(test[0], 0);
universe@571 85 EXPECT_EQ(test[1], 0);
universe@571 86 }
universe@571 87
universe@571 88 static unsigned test_destructor_called = 0;
universe@571 89
universe@571 90 static void test_destructor([[maybe_unused]] void *mem) {
universe@571 91 test_destructor_called++;
universe@571 92 }
universe@571 93
universe@571 94 TEST_F(CxBasicMempool, destructor) {
universe@572 95 pool = cxBasicMempoolCreate(4);
universe@571 96 auto data = cxMalloc(pool->allocator, sizeof(int));
universe@571 97 *((int *) data) = 13;
universe@571 98 cxMempoolSetDestructor(pool, data, test_destructor);
universe@571 99 EXPECT_EQ(*((int *) data), 13);
universe@571 100 test_destructor_called = 0;
universe@571 101 cxFree(pool->allocator, data);
universe@571 102 EXPECT_EQ(test_destructor_called, 1);
universe@571 103 data = cxMalloc(pool->allocator, sizeof(int));
universe@571 104 cxMempoolSetDestructor(pool, data, test_destructor);
universe@571 105 cxMempoolDestroy(pool);
universe@571 106 pool = nullptr;
universe@571 107 EXPECT_EQ(test_destructor_called, 2);
universe@571 108 }
universe@571 109
universe@571 110 TEST_F(CxBasicMempool, realloc) {
universe@572 111 pool = cxBasicMempoolCreate(4);
universe@571 112 auto data = cxMalloc(pool->allocator, sizeof(int));
universe@571 113 *((int *) data) = 13;
universe@571 114 cxMempoolSetDestructor(pool, data, test_destructor);
universe@571 115
universe@571 116 void *rdata = data;
universe@571 117 unsigned n = 1;
universe@571 118 while (rdata == data) {
universe@571 119 n <<= 1;
universe@571 120 ASSERT_LT(n, 65536); // eventually the memory should be moved elsewhere
universe@571 121 rdata = cxRealloc(pool->allocator, data, n * sizeof(intptr_t));
universe@571 122 }
universe@571 123
universe@571 124 EXPECT_EQ(*((int *) rdata), 13);
universe@571 125 // test if destructor is still intact
universe@571 126 test_destructor_called = 0;
universe@571 127 cxFree(pool->allocator, rdata);
universe@571 128 EXPECT_EQ(test_destructor_called, 1);
universe@571 129 }
universe@571 130
universe@571 131
universe@571 132 TEST_F(CxBasicMempool, free) {
universe@572 133 pool = cxBasicMempoolCreate(4);
universe@571 134 auto basic_pool = reinterpret_cast<cx_basic_mempool_s *>(pool);
universe@571 135
universe@571 136 void *mem1;
universe@571 137 void *mem2;
universe@571 138
universe@571 139 mem1 = cxMalloc(pool->allocator, 16);
universe@571 140 cxFree(pool->allocator, mem1);
universe@571 141 EXPECT_EQ(basic_pool->ndata, 0);
universe@571 142
universe@571 143 cxMalloc(pool->allocator, 16);
universe@571 144 cxMalloc(pool->allocator, 16);
universe@571 145 mem1 = cxMalloc(pool->allocator, 16);
universe@571 146 cxMalloc(pool->allocator, 16);
universe@571 147 mem2 = cxMalloc(pool->allocator, 16);
universe@571 148
universe@571 149 EXPECT_EQ(basic_pool->ndata, 5);
universe@571 150 cxFree(pool->allocator, mem1);
universe@571 151 EXPECT_EQ(basic_pool->ndata, 4);
universe@571 152 cxFree(pool->allocator, mem2);
universe@571 153 EXPECT_EQ(basic_pool->ndata, 3);
universe@571 154 }

mercurial