test/test_allocator.cpp

Tue, 04 Oct 2022 19:25:07 +0200

author
Mike Becker <universe@uap-core.de>
date
Tue, 04 Oct 2022 19:25:07 +0200
changeset 591
7df0bcaecffa
parent 522
b91c50d023f4
permissions
-rw-r--r--

fix over-optimization of strstr

1. it's actually less performant to frequently read bytes
from an array instead of using the native word length
2. the SBO buffer should be local and not static to allow
multi-threading usage

391
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 *
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 * Copyright 2021 Mike Becker, Olaf Wintermann All rights reserved.
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 *
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 *
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 *
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 *
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 * POSSIBILITY OF SUCH DAMAGE.
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27 */
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
29 #include "cx/allocator.h"
511
a32e6a6b1ca7 migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents: 443
diff changeset
30 #include <gtest/gtest.h>
a32e6a6b1ca7 migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents: 443
diff changeset
31
513
b66532b5d8db do not use macro for suite name
Mike Becker <universe@uap-core.de>
parents: 511
diff changeset
32 TEST(Allocator, DefaultAllocator) {
397
cfc1193b1e65 removes unnecessary cx_allocator typedef
Mike Becker <universe@uap-core.de>
parents: 396
diff changeset
33 cx_allocator_class *clazz = cxDefaultAllocator->cl;
511
a32e6a6b1ca7 migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents: 443
diff changeset
34 ASSERT_NE(clazz, nullptr);
391
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
35 }
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
36
513
b66532b5d8db do not use macro for suite name
Mike Becker <universe@uap-core.de>
parents: 511
diff changeset
37 TEST(Allocator, DefaultMalloc) {
397
cfc1193b1e65 removes unnecessary cx_allocator typedef
Mike Becker <universe@uap-core.de>
parents: 396
diff changeset
38 void *test = cxMalloc(cxDefaultAllocator, 16);
511
a32e6a6b1ca7 migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents: 443
diff changeset
39 ASSERT_NE(test, nullptr);
391
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
40 free(test);
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
41 }
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
42
513
b66532b5d8db do not use macro for suite name
Mike Becker <universe@uap-core.de>
parents: 511
diff changeset
43 TEST(Allocator, DefaultRealloc) {
397
cfc1193b1e65 removes unnecessary cx_allocator typedef
Mike Becker <universe@uap-core.de>
parents: 396
diff changeset
44 void *test = calloc(8, 1);
421
aa465fac4ef6 fix reallocate_null test not used and wrong
Mike Becker <universe@uap-core.de>
parents: 419
diff changeset
45 memcpy(test, "Test", 5);
391
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
46 test = cxRealloc(cxDefaultAllocator, test, 16);
511
a32e6a6b1ca7 migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents: 443
diff changeset
47 ASSERT_NE(test, nullptr);
a32e6a6b1ca7 migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents: 443
diff changeset
48 EXPECT_STREQ(reinterpret_cast<char *>(test), "Test");
414
81a4c3a63e65 adds cxReallocate()
Mike Becker <universe@uap-core.de>
parents: 410
diff changeset
49 free(test);
81a4c3a63e65 adds cxReallocate()
Mike Becker <universe@uap-core.de>
parents: 410
diff changeset
50 }
81a4c3a63e65 adds cxReallocate()
Mike Becker <universe@uap-core.de>
parents: 410
diff changeset
51
513
b66532b5d8db do not use macro for suite name
Mike Becker <universe@uap-core.de>
parents: 511
diff changeset
52 TEST(Allocator, Reallocate) {
511
a32e6a6b1ca7 migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents: 443
diff changeset
53 void *test = calloc(8, 1);
a32e6a6b1ca7 migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents: 443
diff changeset
54 memcpy(test, "Test", 5);
a32e6a6b1ca7 migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents: 443
diff changeset
55 int ret = cxReallocate(cxDefaultAllocator, &test, 16);
a32e6a6b1ca7 migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents: 443
diff changeset
56 EXPECT_EQ(ret, 0);
a32e6a6b1ca7 migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents: 443
diff changeset
57 ASSERT_NE(test, nullptr);
a32e6a6b1ca7 migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents: 443
diff changeset
58 EXPECT_STREQ(reinterpret_cast<char *>(test), "Test");
391
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
59 free(test);
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
60 }
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
61
513
b66532b5d8db do not use macro for suite name
Mike Becker <universe@uap-core.de>
parents: 511
diff changeset
62 TEST(Allocator, DefaultCalloc) {
511
a32e6a6b1ca7 migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents: 443
diff changeset
63 char *test = reinterpret_cast<char *>(cxCalloc(cxDefaultAllocator, 8, 2));
a32e6a6b1ca7 migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents: 443
diff changeset
64 ASSERT_NE(test, nullptr);
a32e6a6b1ca7 migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents: 443
diff changeset
65 for (int i = 0; i < 16; i++) ASSERT_EQ(test[i], 0);
a32e6a6b1ca7 migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents: 443
diff changeset
66 free(test);
391
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
67 }
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
68
513
b66532b5d8db do not use macro for suite name
Mike Becker <universe@uap-core.de>
parents: 511
diff changeset
69 TEST(Allocator, DefaultFree) {
511
a32e6a6b1ca7 migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents: 443
diff changeset
70 void *test = malloc(16);
a32e6a6b1ca7 migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents: 443
diff changeset
71 EXPECT_NO_FATAL_FAILURE(
a32e6a6b1ca7 migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents: 443
diff changeset
72 cxFree(cxDefaultAllocator, test);
a32e6a6b1ca7 migrate allocator tests to gtest
Mike Becker <universe@uap-core.de>
parents: 443
diff changeset
73 );
391
f094a53c1178 adds allocator interface and default implementation
Mike Becker <universe@uap-core.de>
parents:
diff changeset
74 }
514
6f9d97a53d67 test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents: 513
diff changeset
75
6f9d97a53d67 test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents: 513
diff changeset
76 TEST(Allocator, FailingReallocate) {
6f9d97a53d67 test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents: 513
diff changeset
77 // Mock an allocator that always returns nullptr on realloc
6f9d97a53d67 test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents: 513
diff changeset
78 cx_allocator_class mock_cl;
522
b91c50d023f4 add [[maybe_unused]] attributed to params of mocked function
Mike Becker <universe@uap-core.de>
parents: 514
diff changeset
79 mock_cl.realloc = [](
b91c50d023f4 add [[maybe_unused]] attributed to params of mocked function
Mike Becker <universe@uap-core.de>
parents: 514
diff changeset
80 [[maybe_unused]]void *p,
b91c50d023f4 add [[maybe_unused]] attributed to params of mocked function
Mike Becker <universe@uap-core.de>
parents: 514
diff changeset
81 [[maybe_unused]]void *d,
b91c50d023f4 add [[maybe_unused]] attributed to params of mocked function
Mike Becker <universe@uap-core.de>
parents: 514
diff changeset
82 [[maybe_unused]]size_t n
b91c50d023f4 add [[maybe_unused]] attributed to params of mocked function
Mike Becker <universe@uap-core.de>
parents: 514
diff changeset
83 ) -> void * { return nullptr; };
514
6f9d97a53d67 test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents: 513
diff changeset
84 cx_allocator_s mock{&mock_cl, nullptr};
6f9d97a53d67 test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents: 513
diff changeset
85
6f9d97a53d67 test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents: 513
diff changeset
86 void *test = calloc(8, 1);
6f9d97a53d67 test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents: 513
diff changeset
87 memcpy(test, "Test", 5);
6f9d97a53d67 test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents: 513
diff changeset
88 void *original = test;
6f9d97a53d67 test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents: 513
diff changeset
89 int ret = cxReallocate(&mock, &test, 16);
6f9d97a53d67 test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents: 513
diff changeset
90 // non-zero return code because of the failure
6f9d97a53d67 test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents: 513
diff changeset
91 EXPECT_NE(ret, 0);
6f9d97a53d67 test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents: 513
diff changeset
92 // the test pointer was not changed and still points to the same memory
6f9d97a53d67 test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents: 513
diff changeset
93 EXPECT_EQ(test, original);
6f9d97a53d67 test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents: 513
diff changeset
94 EXPECT_STREQ(reinterpret_cast<char *>(test), "Test");
6f9d97a53d67 test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents: 513
diff changeset
95 free(test);
6f9d97a53d67 test uncovered branch in cxReallocate()
Mike Becker <universe@uap-core.de>
parents: 513
diff changeset
96 }

mercurial