/* SPDX-License-Identifier: GPL-2.0-only */ #include <stdlib.h> #include <tests/test.h> #include <commonlib/helpers.h> #include <types.h> #include <string.h> #define MEMSET_BUFFER_SZ (4 * KiB) struct memset_test_state { u8 *base_buffer; u8 *helper_buffer; }; static int setup_test(void **state) { struct memset_test_state *s = malloc(sizeof(struct memset_test_state)); u8 *buf = malloc(MEMSET_BUFFER_SZ); u8 *helper_buf = malloc(MEMSET_BUFFER_SZ); if (!s || !buf || !helper_buf) goto error; s->base_buffer = buf; s->helper_buffer = helper_buf; *state = s; return 0; error: free(buf); free(helper_buf); free(s); return -1; } static int teardown_test(void **state) { struct memset_test_state *s = *state; if (s) { free(s->base_buffer); free(s->helper_buffer); } free(s); return 0; } static void test_memset_full_range(void **state) { struct memset_test_state *s = *state; for (int i = 0; i < MEMSET_BUFFER_SZ; ++i) s->helper_buffer[i] = 0x42; memset(s->base_buffer, 0x42, MEMSET_BUFFER_SZ); assert_memory_equal(s->base_buffer, s->helper_buffer, MEMSET_BUFFER_SZ); } static void test_memset_subrange(void **state) { struct memset_test_state *s = *state; int i = 0; for (; i < MEMSET_BUFFER_SZ / 2; ++i) s->helper_buffer[i] = 0xEF; for (; i < MEMSET_BUFFER_SZ; ++i) s->helper_buffer[i] = 0xCD; /* Expect correct buffer subranges to be filled */ memset(s->base_buffer, 0xEF, MEMSET_BUFFER_SZ / 2); memset(s->base_buffer + MEMSET_BUFFER_SZ / 2, 0xCD, MEMSET_BUFFER_SZ / 2); assert_memory_equal(s->base_buffer, s->helper_buffer, MEMSET_BUFFER_SZ); } static void test_memset_zero_size(void **state) { struct memset_test_state *s = *state; for (int i = 0; i < MEMSET_BUFFER_SZ; ++i) { s->base_buffer[i] = 0xFF; s->helper_buffer[i] = 0xFF; } /* Expect no change in buffer after calling memset with zero size */ memset(s->base_buffer, 0xAA, (0)); assert_memory_equal(s->base_buffer, s->helper_buffer, MEMSET_BUFFER_SZ); } static void test_memset_one_byte(void **state) { struct memset_test_state *s = *state; for (int i = 0; i < MEMSET_BUFFER_SZ; ++i) { s->base_buffer[i] = 0x66; s->helper_buffer[i] = 0x66; } s->helper_buffer[MEMSET_BUFFER_SZ / 4] = 0xCC; memset(&s->base_buffer[MEMSET_BUFFER_SZ / 4], 0xCC, 1); assert_memory_equal(s->base_buffer, s->helper_buffer, MEMSET_BUFFER_SZ); } int main(void) { const struct CMUnitTest tests[] = { cmocka_unit_test_setup_teardown(test_memset_full_range, setup_test, teardown_test), cmocka_unit_test_setup_teardown(test_memset_subrange, setup_test, teardown_test), cmocka_unit_test_setup_teardown(test_memset_zero_size, setup_test, teardown_test), cmocka_unit_test_setup_teardown(test_memset_one_byte, setup_test, teardown_test), }; return cb_run_group_tests(tests, NULL, NULL); }