cOMS/tests/utils/UtilsTest.cpp
Dennis Eichhorn eb9a135ca7
Some checks failed
CodeQL / Analyze (${{ matrix.language }}) (autobuild, c-cpp) (push) Has been cancelled
Microsoft C++ Code Analysis / Analyze (push) Has been cancelled
fixing bugs and adding some test scripts
2025-04-27 20:10:58 +00:00

150 lines
4.1 KiB
C++
Executable File

#include "../TestFramework.h"
#include "../../utils/Utils.h"
static void test_is_equal() {
uint8_t region1[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
uint8_t region2[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
uint8_t region3[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x09};
// Test equal regions
ASSERT_TRUE(is_equal(region1, region2, sizeof(region1)));
// Test unequal regions
ASSERT_FALSE(is_equal(region1, region3, sizeof(region1)));
// Test partial equality
ASSERT_TRUE(is_equal(region1, region2, 4));
// Test unequal partial regions
ASSERT_FALSE(is_equal(region1 + 4, region3 + 4, 4));
// Test smaller than 4 bytes
ASSERT_TRUE(is_equal(region1, region2, 2));
// Test empty regions
ASSERT_TRUE(is_equal(region1, region2, 0));
}
static void test_is_empty() {
uint8_t region1[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t region2[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
uint8_t region3[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
uint8_t region4[] = {0x01, 0x02, 0x03, 0x04, 0x00, 0x00, 0x00, 0x00};
// Test empty region
ASSERT_TRUE(is_empty(region1, sizeof(region1)));
// Test non-empty region
ASSERT_FALSE(is_empty(region2, sizeof(region2)));
// Test partial empty region
ASSERT_TRUE(is_empty(region1, 4));
// Test partial non-empty region
ASSERT_FALSE(is_empty(region2 + 4, 4));
// Test smaller than 4 bytes
ASSERT_TRUE(is_empty(region3, sizeof(region3)));
// Test non-empty smaller than 4 bytes
ASSERT_FALSE(is_empty(region4, sizeof(region4)));
// Test empty region with size 0
ASSERT_TRUE(is_empty(region1, 0));
}
#if PERFORMANCE_TEST
static void _is_equal(volatile void* val) {
volatile bool* res = (volatile bool *) val;
uint8_t region1[64];
uint8_t region2[64];
memset(region1, 0xAA, sizeof(region1));
memset(region2, 0xAA, sizeof(region2));
*res |= is_equal(region1, region2, sizeof(region1));
}
static void _memcmp(volatile void* val) {
volatile bool* res = (volatile bool *) val;
uint8_t region1[64];
uint8_t region2[64];
memset(region1, 0xAA, sizeof(region1));
memset(region2, 0xAA, sizeof(region2));
*res |= (bool) (memcmp(region1, region2, sizeof(region1)) == 0);
}
static void test_is_equal_performance() {
COMPARE_FUNCTION_TEST_TIME(_is_equal, _memcmp, 10.0);
COMPARE_FUNCTION_TEST_CYCLE(_is_equal, _memcmp, 10.0);
}
static void _is_empty(volatile void* val) {
volatile bool* res = (volatile bool *) val;
alignas(64) uint8_t region1[64];
memset(region1, 0xAA, sizeof(region1));
*res |= is_empty(region1, sizeof(region1));
}
static void _memcmp_empty(volatile void* val) {
volatile bool* res = (volatile bool *) val;
alignas(64) uint8_t region1[64];
memset(region1, 0xAA, sizeof(region1));
*res |= *region1 == 0 && memcmp(region1, region1 + 1, sizeof(region1) - 1) == 0;
}
static void _is_empty2(volatile void* val) {
volatile bool* res = (volatile bool *) val;
alignas(64) uint8_t region1[64];
memset(region1, 0, sizeof(region1));
*res |= is_empty(region1, sizeof(region1));
}
static void _memcmp_empty2(volatile void* val) {
volatile bool* res = (volatile bool *) val;
alignas(64) uint8_t region1[64];
memset(region1, 0, sizeof(region1));
*res |= *region1 == 0 && memcmp(region1, region1 + 1, sizeof(region1) - 1) == 0;
}
static void test_is_empty_performance() {
COMPARE_FUNCTION_TEST_TIME(_is_empty, _memcmp_empty, 10.0);
COMPARE_FUNCTION_TEST_CYCLE(_is_empty, _memcmp_empty, 10.0);
COMPARE_FUNCTION_TEST_TIME(_is_empty2, _memcmp_empty2, 10.0);
COMPARE_FUNCTION_TEST_CYCLE(_is_empty2, _memcmp_empty2, 10.0);
}
#endif
#ifdef UBER_TEST
#ifdef main
#undef main
#endif
#define main UtilsUtilsTest
#endif
int main() {
TEST_INIT(10);
TEST_RUN(test_is_equal);
TEST_RUN(test_is_empty);
#if PERFORMANCE_TEST
TEST_RUN(test_is_equal_performance);
TEST_RUN(test_is_empty_performance);
#endif
TEST_FINALIZE();
return 0;
}