cOMS/tests/memory/ChunkMemoryTest.cpp
Dennis Eichhorn 39fbcf4300
Some checks are pending
CodeQL / Analyze (${{ matrix.language }}) (autobuild, c-cpp) (push) Waiting to run
Microsoft C++ Code Analysis / Analyze (push) Waiting to run
linux bug fixes
2025-03-22 01:10:19 +00:00

150 lines
3.8 KiB
C++
Executable File

#include "../TestFramework.h"
#include "../../memory/ChunkMemory.h"
static void test_chunk_alloc() {
ChunkMemory mem = {};
chunk_alloc(&mem, 10, 10);
ASSERT_TRUE(memcmp(mem.memory, mem.memory + 1, 10 * 10) == 0);
ASSERT_EQUALS(mem.size, 10 * 64 + 8 * 1); // chunks are aligned to 64
ASSERT_EQUALS(*mem.free, 0);
chunk_free(&mem);
ASSERT_EQUALS(mem.size, 0);
ASSERT_EQUALS(mem.memory, NULL);
}
static void test_chunk_id_from_memory() {
ChunkMemory mem = {};
chunk_alloc(&mem, 10, 10);
ASSERT_EQUALS(chunk_id_from_memory(&mem, mem.memory), 0);
ASSERT_EQUALS(chunk_id_from_memory(&mem, mem.memory + 64), 1);
ASSERT_EQUALS(chunk_id_from_memory(&mem, mem.memory + 127), 1);
ASSERT_EQUALS(chunk_id_from_memory(&mem, mem.memory + 128), 2);
chunk_free(&mem);
}
static void test_chunk_get_element() {
ChunkMemory mem = {};
chunk_alloc(&mem, 10, 10);
ASSERT_EQUALS(chunk_get_element(&mem, 2), mem.memory + 128);
chunk_free(&mem);
}
static void test_chunk_reserve() {
ChunkMemory mem = {};
chunk_alloc(&mem, 10, 10);
ASSERT_EQUALS(chunk_reserve(&mem, 1), 0);
ASSERT_EQUALS(chunk_reserve(&mem, 1), 1);
ASSERT_TRUE(IS_BIT_SET_64_R2L(*mem.free, 0));
ASSERT_TRUE(IS_BIT_SET_64_R2L(*mem.free, 1));
ASSERT_FALSE(IS_BIT_SET_64_R2L(*mem.free, 2));
ASSERT_EQUALS(chunk_reserve(&mem, 2), 2);
ASSERT_TRUE(IS_BIT_SET_64_R2L(*mem.free, 2));
ASSERT_TRUE(IS_BIT_SET_64_R2L(*mem.free, 3));
chunk_free(&mem);
}
static void test_chunk_free_elements() {
ChunkMemory mem = {};
chunk_alloc(&mem, 10, 10);
ASSERT_EQUALS(chunk_reserve(&mem, 3), 0);
chunk_free_elements(&mem, 0, 2);
ASSERT_FALSE(IS_BIT_SET_64_R2L(*mem.free, 0));
ASSERT_FALSE(IS_BIT_SET_64_R2L(*mem.free, 1));
ASSERT_TRUE(IS_BIT_SET_64_R2L(*mem.free, 2));
chunk_free_elements(&mem, 2, 1);
ASSERT_FALSE(IS_BIT_SET_64_R2L(*mem.free, 2));
chunk_free_elements(&mem, 0, 10);
ASSERT_EQUALS(*mem.free, 0);
chunk_free(&mem);
}
// To ensure there is no logical error we test memory wrapping specifically
static void test_chunk_reserve_wrapping() {
ChunkMemory mem = {};
chunk_alloc(&mem, 10, 10);
mem.last_pos = 7;
ASSERT_EQUALS(chunk_reserve(&mem, 5), 0);
ASSERT_EQUALS((byte) BITS_GET_8_R2L(*mem.free, 0, 8), (byte) 0b00011111);
chunk_free(&mem);
}
// To ensure there is no logical error we test the last element specifically
static void test_chunk_reserve_last_element() {
ChunkMemory mem = {};
chunk_alloc(&mem, 10, 10);
// Get last element when the last_pos is the previous element
mem.last_pos = 8;
ASSERT_EQUALS(chunk_reserve(&mem, 1), 9);
// Get last element when the last element is not defined and all other elements are in use
mem.last_pos = -1;
*mem.free = 511;
ASSERT_EQUALS(chunk_reserve(&mem, 1), 9);
chunk_free(&mem);
}
#if !DEBUG
static void test_chunk_reserve_full() {
ChunkMemory mem = {};
chunk_alloc(&mem, 10, 10);
mem.free[0] = 0xFFFFFFFFFFFFFFFF;
ASSERT_EQUALS(chunk_reserve(&mem, 1), -1);
}
static void test_chunk_reserve_invalid_size() {
ChunkMemory mem = {};
chunk_alloc(&mem, 10, 10);
ASSERT_EQUALS(chunk_reserve(&mem, 11), -1);
chunk_free(&mem);
}
#endif
#ifdef UBER_TEST
#ifdef main
#undef main
#endif
#define main MemoryChunkMemoryTest
#endif
int main() {
TEST_INIT(25);
TEST_RUN(test_chunk_alloc);
TEST_RUN(test_chunk_id_from_memory);
TEST_RUN(test_chunk_get_element);
TEST_RUN(test_chunk_reserve);
TEST_RUN(test_chunk_free_elements);
TEST_RUN(test_chunk_reserve_wrapping);
TEST_RUN(test_chunk_reserve_last_element);
#if !DEBUG
TEST_RUN(test_chunk_reserve_full);
TEST_RUN(test_chunk_reserve_invalid_size);
#endif
TEST_FINALIZE();
return 0;
}