// SPDX-License-Identifier: GPL-2.0
/*
 * KUnit test for strerror and strerror_r
 *
 * Copyright (C) 2019, Google LLC.
 * Author: Mike Krinkin <krinkin@google.com>
 */

#include <linux/err.h>
#include <test/strerror.h>
#include <test/test.h>


static void test_strerror_returns_null_for_unknown_errors(struct test *test)
{
	EXPECT_NULL(test, strerror(-1));
	EXPECT_NULL(test, strerror(MAX_ERRNO + 1));
}

static void test_strerror_r_returns_null_if_buflen_is_zero(struct test *test)
{
	EXPECT_NULL(test, strerror_r(-1, NULL, 0));
}

static void test_strerror_returns_string(struct test *test)
{
	const char *err;
	char buf[64];

	err = strerror(EAGAIN);
	ASSERT_NOT_NULL(test, err);
	EXPECT_STREQ(test, err, "EAGAIN");

	err = strerror_r(EAGAIN, buf, sizeof(buf));
	ASSERT_NOT_NULL(test, err);
	EXPECT_STREQ(test, err, "EAGAIN");
}

static void test_strerror_r_correctly_truncates_message_to_buffer_size(
		struct test *test)
{
	const char *err;
	char buf[64];

	err = strerror_r(EAGAIN, buf, 1);
	ASSERT_NOT_NULL(test, err);
	EXPECT_EQ(test, strlen(err), 0);

	err = strerror_r(EAGAIN, buf, 2);
	ASSERT_NOT_NULL(test, err);
	EXPECT_EQ(test, strlen(err), 1);

	err = strerror_r(EAGAIN, buf, sizeof(buf));
	ASSERT_NOT_NULL(test, err);
	EXPECT_STREQ(test, err, "EAGAIN");
}

static void test_strerror_r_returns_string_for_unknown_errors(struct test *test)
{
	char buf[64];

	EXPECT_NOT_NULL(test, strerror_r(-1, buf, sizeof(buf)));
	EXPECT_NOT_NULL(test, strerror_r(MAX_ERRNO + 1, buf, sizeof(buf)));
}

static struct test_case strerror_test_cases[] = {
	TEST_CASE(test_strerror_returns_null_for_unknown_errors),
	TEST_CASE(test_strerror_r_returns_null_if_buflen_is_zero),
	TEST_CASE(test_strerror_returns_string),
	TEST_CASE(test_strerror_r_correctly_truncates_message_to_buffer_size),
	TEST_CASE(test_strerror_r_returns_string_for_unknown_errors),
	{},
};

static struct test_module strerror_test_module = {
	.name = "strerror-test",
	.test_cases = strerror_test_cases,
};
module_test(strerror_test_module);
