/* 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 (!buf || !helper_buf)
		goto error;

	s->base_buffer = buf;
	s->helper_buffer = helper_buf;
	*state = s;

	return 0;

error:
	free(buf);
	free(helper_buf);
	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 cmocka_run_group_tests(tests, NULL, NULL);
}
