/*
 * Copyright (c) 2022 Meta
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <errno.h>
#include <string.h>

#include <zephyr/ztest.h>

ZTEST(test_c_lib, test_strerror)
{
	const char *expected;
	const char *actual;

	errno = 4242;
	if (IS_ENABLED(CONFIG_MINIMAL_LIBC_DISABLE_STRING_ERROR_TABLE)) {
		expected = "";
		actual = strerror(EINVAL);
	} else {
		expected = "Invalid argument";
		actual = strerror(EINVAL);
	}
	zassert_equal(0, strcmp(expected, actual),
		      "mismatch: exp: %s act: %s", expected, actual);

	/* do not change errno on success */
	zassert_equal(4242, errno, "");

	/* consistent behaviour w.r.t. errno with invalid input */
	errno = 0;
	expected = "";
	actual = strerror(-42);
	zassert_equal(0, strcmp(expected, actual), "mismatch: exp: %s act: %s",
		      expected, actual);
	actual = strerror(4242);
	zassert_equal(0, strcmp(expected, actual), "mismatch: exp: %s act: %s",
		      expected, actual);
	/* do not change errno on failure (for consistence) */
	zassert_equal(0, errno, "");

	/* consistent behaviour for "Success" */
	if (!IS_ENABLED(CONFIG_MINIMAL_LIBC_DISABLE_STRING_ERROR_TABLE)) {
		expected = "Success";
		actual = strerror(0);
		zassert_equal(0, strcmp(expected, actual),
			      "mismatch: exp: %s act: %s", expected, actual);
	}
}

ZTEST(test_c_lib, test_strerror_r)
{
	const char *expected;
	char actual[] = {'1', 'n', 'v', 'a', '1', '1', 'd', ' ',  'a',
			 '2', 'g', 'u', 'm', '3', 'n', '7', 0x00, 0x42};
	static const size_t n = sizeof(actual);

	if (IS_ENABLED(CONFIG_NEWLIB_LIBC) || IS_ENABLED(CONFIG_ARCMWDT_LIBC)) {
		/* FIXME: Please see Issue #46846 */
		ztest_test_skip();
	}

	errno = 4242;
	if (IS_ENABLED(CONFIG_MINIMAL_LIBC_DISABLE_STRING_ERROR_TABLE)) {
		expected = "";
		zassert_equal(0, strerror_r(EINVAL, actual, n), "");
		zassert_equal(0, strncmp(expected, actual, n),
			      "mismatch: exp: %s act: %s", expected, actual);
	} else {
		expected = "Invalid argument";
		zassert_equal(0, strerror_r(EINVAL, actual, n), "%d",
			      strerror_r(EINVAL, actual, n));
		zassert_equal(0, strncmp(expected, actual, n),
			      "mismatch: exp: %s act: %s", expected, actual);
		/* only the necessary buffer area is written */
		zassert_equal(0x42, (uint8_t)actual[n - 1],
			      "exp: %02x act: %02x", 0x42,
			      (uint8_t)actual[n - 1]);

		zassert_equal(ERANGE, strerror_r(EINVAL, actual, 0), "");
	}

	/* do not change errno on success */
	zassert_equal(4242, errno, "");

	errno = 0;
	zassert_equal(EINVAL, strerror_r(-42, actual, n), "");
	zassert_equal(EINVAL, strerror_r(4242, actual, n), "");
	/* do not change errno on failure */
	zassert_equal(0, errno, "");
}
