tests/test_basic_mempool.cpp

Fri, 05 May 2023 19:07:56 +0200

author
Mike Becker <universe@uap-core.de>
date
Fri, 05 May 2023 19:07:56 +0200
changeset 702
3390b58ad15a
parent 653
e081643aae2a
permissions
-rw-r--r--

fix cx_linked_list_sort() not working for empty lists

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