brintos

brintos / linux-shallow public Read only

0
0
Text · 4.7 KiB · d2ecfcc Raw
174 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2/*3 * DAMON Debugfs Interface Unit Tests4 *5 * Author: SeongJae Park <sj@kernel.org>6 */7 8#ifdef CONFIG_DAMON_DBGFS_KUNIT_TEST9 10#ifndef _DAMON_DBGFS_TEST_H11#define _DAMON_DBGFS_TEST_H12 13#include <kunit/test.h>14 15static void damon_dbgfs_test_str_to_ints(struct kunit *test)16{17	char *question;18	int *answers;19	int expected[] = {12, 35, 46};20	ssize_t nr_integers = 0, i;21 22	question = "123";23	answers = str_to_ints(question, strlen(question), &nr_integers);24	KUNIT_EXPECT_EQ(test, (ssize_t)1, nr_integers);25	KUNIT_EXPECT_EQ(test, 123, answers[0]);26	kfree(answers);27 28	question = "123abc";29	answers = str_to_ints(question, strlen(question), &nr_integers);30	KUNIT_EXPECT_EQ(test, (ssize_t)1, nr_integers);31	KUNIT_EXPECT_EQ(test, 123, answers[0]);32	kfree(answers);33 34	question = "a123";35	answers = str_to_ints(question, strlen(question), &nr_integers);36	KUNIT_EXPECT_EQ(test, (ssize_t)0, nr_integers);37	kfree(answers);38 39	question = "12 35";40	answers = str_to_ints(question, strlen(question), &nr_integers);41	KUNIT_EXPECT_EQ(test, (ssize_t)2, nr_integers);42	for (i = 0; i < nr_integers; i++)43		KUNIT_EXPECT_EQ(test, expected[i], answers[i]);44	kfree(answers);45 46	question = "12 35 46";47	answers = str_to_ints(question, strlen(question), &nr_integers);48	KUNIT_EXPECT_EQ(test, (ssize_t)3, nr_integers);49	for (i = 0; i < nr_integers; i++)50		KUNIT_EXPECT_EQ(test, expected[i], answers[i]);51	kfree(answers);52 53	question = "12 35 abc 46";54	answers = str_to_ints(question, strlen(question), &nr_integers);55	KUNIT_EXPECT_EQ(test, (ssize_t)2, nr_integers);56	for (i = 0; i < 2; i++)57		KUNIT_EXPECT_EQ(test, expected[i], answers[i]);58	kfree(answers);59 60	question = "";61	answers = str_to_ints(question, strlen(question), &nr_integers);62	KUNIT_EXPECT_EQ(test, (ssize_t)0, nr_integers);63	kfree(answers);64 65	question = "\n";66	answers = str_to_ints(question, strlen(question), &nr_integers);67	KUNIT_EXPECT_EQ(test, (ssize_t)0, nr_integers);68	kfree(answers);69}70 71static void damon_dbgfs_test_set_targets(struct kunit *test)72{73	struct damon_ctx *ctx = dbgfs_new_ctx();74	char buf[64];75 76	if (!damon_is_registered_ops(DAMON_OPS_PADDR)) {77		dbgfs_destroy_ctx(ctx);78		kunit_skip(test, "PADDR not registered");79	}80 81	/* Make DAMON consider target has no pid */82	damon_select_ops(ctx, DAMON_OPS_PADDR);83 84	dbgfs_set_targets(ctx, 0, NULL);85	sprint_target_ids(ctx, buf, 64);86	KUNIT_EXPECT_STREQ(test, (char *)buf, "\n");87 88	dbgfs_set_targets(ctx, 1, NULL);89	sprint_target_ids(ctx, buf, 64);90	KUNIT_EXPECT_STREQ(test, (char *)buf, "42\n");91 92	dbgfs_set_targets(ctx, 0, NULL);93	sprint_target_ids(ctx, buf, 64);94	KUNIT_EXPECT_STREQ(test, (char *)buf, "\n");95 96	dbgfs_destroy_ctx(ctx);97}98 99static void damon_dbgfs_test_set_init_regions(struct kunit *test)100{101	struct damon_ctx *ctx = damon_new_ctx();102	/* Each line represents one region in ``<target idx> <start> <end>`` */103	char * const valid_inputs[] = {"1 10 20\n 1   20 30\n1 35 45",104		"1 10 20\n",105		"1 10 20\n0 39 59\n0 70 134\n  1  20 25\n",106		""};107	/* Reading the file again will show sorted, clean output */108	char * const valid_expects[] = {"1 10 20\n1 20 30\n1 35 45\n",109		"1 10 20\n",110		"0 39 59\n0 70 134\n1 10 20\n1 20 25\n",111		""};112	char * const invalid_inputs[] = {"3 10 20\n",	/* target not exists */113		"1 10 20\n 1 14 26\n",		/* regions overlap */114		"0 10 20\n1 30 40\n 0 5 8"};	/* not sorted by address */115	char *input, *expect;116	int i, rc;117	char buf[256];118 119	if (!damon_is_registered_ops(DAMON_OPS_PADDR)) {120		damon_destroy_ctx(ctx);121		kunit_skip(test, "PADDR not registered");122	}123 124	damon_select_ops(ctx, DAMON_OPS_PADDR);125 126	dbgfs_set_targets(ctx, 3, NULL);127 128	/* Put valid inputs and check the results */129	for (i = 0; i < ARRAY_SIZE(valid_inputs); i++) {130		input = valid_inputs[i];131		expect = valid_expects[i];132 133		rc = set_init_regions(ctx, input, strnlen(input, 256));134		KUNIT_EXPECT_EQ(test, rc, 0);135 136		memset(buf, 0, 256);137		sprint_init_regions(ctx, buf, 256);138 139		KUNIT_EXPECT_STREQ(test, (char *)buf, expect);140	}141	/* Put invalid inputs and check the return error code */142	for (i = 0; i < ARRAY_SIZE(invalid_inputs); i++) {143		input = invalid_inputs[i];144		pr_info("input: %s\n", input);145		rc = set_init_regions(ctx, input, strnlen(input, 256));146		KUNIT_EXPECT_EQ(test, rc, -EINVAL);147 148		memset(buf, 0, 256);149		sprint_init_regions(ctx, buf, 256);150 151		KUNIT_EXPECT_STREQ(test, (char *)buf, "");152	}153 154	dbgfs_set_targets(ctx, 0, NULL);155	damon_destroy_ctx(ctx);156}157 158static struct kunit_case damon_test_cases[] = {159	KUNIT_CASE(damon_dbgfs_test_str_to_ints),160	KUNIT_CASE(damon_dbgfs_test_set_targets),161	KUNIT_CASE(damon_dbgfs_test_set_init_regions),162	{},163};164 165static struct kunit_suite damon_test_suite = {166	.name = "damon-dbgfs",167	.test_cases = damon_test_cases,168};169kunit_test_suite(damon_test_suite);170 171#endif /* _DAMON_TEST_H */172 173#endif	/* CONFIG_DAMON_KUNIT_TEST */174