lib/kunit/assert_test.c

Source file repositories/reference/linux-study-clean/lib/kunit/assert_test.c

File Facts

System
Linux kernel
Corpus path
lib/kunit/assert_test.c
Extension
.c
Size
12839 bytes
Lines
389
Domain
Kernel Services
Bucket
lib
Inferred role
Kernel Services: implementation source
Status
source implementation candidate

Why This File Exists

Shared kernel service surface used by multiple subsystems, including helpers, cryptography, virtualization support, and async I/O infrastructure.

Dependency Surface

Detected Declarations

Annotated Snippet

// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * KUnit test for the assertion formatting functions.
 * Author: Ivan Orlov <ivan.orlov0322@gmail.com>
 */
#include <kunit/test.h>
#include "string-stream.h"

#define TEST_PTR_EXPECTED_BUF_SIZE 32
#define HEXDUMP_TEST_BUF_LEN 5
#define ASSERT_TEST_EXPECT_CONTAIN(test, str, substr) KUNIT_EXPECT_TRUE(test, strstr(str, substr))
#define ASSERT_TEST_EXPECT_NCONTAIN(test, str, substr) KUNIT_EXPECT_FALSE(test, strstr(str, substr))

static void kunit_test_is_literal(struct kunit *test)
{
	KUNIT_EXPECT_TRUE(test, is_literal("5", 5));
	KUNIT_EXPECT_TRUE(test, is_literal("0", 0));
	KUNIT_EXPECT_TRUE(test, is_literal("1234567890", 1234567890));
	KUNIT_EXPECT_TRUE(test, is_literal("-1234567890", -1234567890));
	KUNIT_EXPECT_FALSE(test, is_literal("05", 5));
	KUNIT_EXPECT_FALSE(test, is_literal("", 0));
	KUNIT_EXPECT_FALSE(test, is_literal("-0", 0));
	KUNIT_EXPECT_FALSE(test, is_literal("12#45", 1245));
}

static void kunit_test_is_str_literal(struct kunit *test)
{
	KUNIT_EXPECT_TRUE(test, is_str_literal("\"Hello, World!\"", "Hello, World!"));
	KUNIT_EXPECT_TRUE(test, is_str_literal("\"\"", ""));
	KUNIT_EXPECT_TRUE(test, is_str_literal("\"\"\"", "\""));
	KUNIT_EXPECT_FALSE(test, is_str_literal("", ""));
	KUNIT_EXPECT_FALSE(test, is_str_literal("\"", "\""));
	KUNIT_EXPECT_FALSE(test, is_str_literal("\"Abacaba", "Abacaba"));
	KUNIT_EXPECT_FALSE(test, is_str_literal("Abacaba\"", "Abacaba"));
	KUNIT_EXPECT_FALSE(test, is_str_literal("\"Abacaba\"", "\"Abacaba\""));
}

KUNIT_DEFINE_ACTION_WRAPPER(kfree_wrapper, kfree, const void *);

/* this function is used to get a "char *" string from the string stream and defer its cleanup  */
static char *get_str_from_stream(struct kunit *test, struct string_stream *stream)
{
	char *str = string_stream_get_string(stream);

	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, str);
	kunit_add_action(test, kfree_wrapper, (void *)str);

	return str;
}

static void kunit_test_assert_prologue(struct kunit *test)
{
	struct string_stream *stream;
	char *str;
	const struct kunit_loc location = {
		.file = "testfile.c",
		.line = 1337,
	};

	stream = kunit_alloc_string_stream(test, GFP_KERNEL);
	KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);

	/* Test an expectation fail prologue */
	kunit_assert_prologue(&location, KUNIT_EXPECTATION, stream);
	str = get_str_from_stream(test, stream);
	ASSERT_TEST_EXPECT_CONTAIN(test, str, "EXPECTATION");
	ASSERT_TEST_EXPECT_CONTAIN(test, str, "testfile.c");
	ASSERT_TEST_EXPECT_CONTAIN(test, str, "1337");

	/* Test an assertion fail prologue */
	string_stream_clear(stream);
	kunit_assert_prologue(&location, KUNIT_ASSERTION, stream);
	str = get_str_from_stream(test, stream);
	ASSERT_TEST_EXPECT_CONTAIN(test, str, "ASSERTION");
	ASSERT_TEST_EXPECT_CONTAIN(test, str, "testfile.c");
	ASSERT_TEST_EXPECT_CONTAIN(test, str, "1337");
}

/*
 * This function accepts an arbitrary count of parameters and generates a va_format struct,
 * which can be used to validate kunit_assert_print_msg function
 */
static void verify_assert_print_msg(struct kunit *test,
				    struct string_stream *stream,
				    char *expected, const char *format, ...)
{
	va_list list;
	const struct va_format vformat = {
		.fmt = format,
		.va = &list,

Annotation

Implementation Notes