/*
 * 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);

		zassert_equal(0, strcmp("", 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, "");
}
