xref: /openbmc/linux/mm/damon/dbgfs-test.h (revision 1c2e11bfa649cc07e6322b0e5ea3cdbada9c43c3)
117ccae8bSSeongJae Park /* SPDX-License-Identifier: GPL-2.0 */
217ccae8bSSeongJae Park /*
317ccae8bSSeongJae Park  * DAMON Debugfs Interface Unit Tests
417ccae8bSSeongJae Park  *
517ccae8bSSeongJae Park  * Author: SeongJae Park <sjpark@amazon.de>
617ccae8bSSeongJae Park  */
717ccae8bSSeongJae Park 
817ccae8bSSeongJae Park #ifdef CONFIG_DAMON_DBGFS_KUNIT_TEST
917ccae8bSSeongJae Park 
1017ccae8bSSeongJae Park #ifndef _DAMON_DBGFS_TEST_H
1117ccae8bSSeongJae Park #define _DAMON_DBGFS_TEST_H
1217ccae8bSSeongJae Park 
1317ccae8bSSeongJae Park #include <kunit/test.h>
1417ccae8bSSeongJae Park 
1517ccae8bSSeongJae Park static void damon_dbgfs_test_str_to_target_ids(struct kunit *test)
1617ccae8bSSeongJae Park {
1717ccae8bSSeongJae Park 	char *question;
1817ccae8bSSeongJae Park 	unsigned long *answers;
1917ccae8bSSeongJae Park 	unsigned long expected[] = {12, 35, 46};
2017ccae8bSSeongJae Park 	ssize_t nr_integers = 0, i;
2117ccae8bSSeongJae Park 
2217ccae8bSSeongJae Park 	question = "123";
23892ab4bbSAdam Borowski 	answers = str_to_target_ids(question, strlen(question),
2417ccae8bSSeongJae Park 			&nr_integers);
2517ccae8bSSeongJae Park 	KUNIT_EXPECT_EQ(test, (ssize_t)1, nr_integers);
2617ccae8bSSeongJae Park 	KUNIT_EXPECT_EQ(test, 123ul, answers[0]);
2717ccae8bSSeongJae Park 	kfree(answers);
2817ccae8bSSeongJae Park 
2917ccae8bSSeongJae Park 	question = "123abc";
30892ab4bbSAdam Borowski 	answers = str_to_target_ids(question, strlen(question),
3117ccae8bSSeongJae Park 			&nr_integers);
3217ccae8bSSeongJae Park 	KUNIT_EXPECT_EQ(test, (ssize_t)1, nr_integers);
3317ccae8bSSeongJae Park 	KUNIT_EXPECT_EQ(test, 123ul, answers[0]);
3417ccae8bSSeongJae Park 	kfree(answers);
3517ccae8bSSeongJae Park 
3617ccae8bSSeongJae Park 	question = "a123";
37892ab4bbSAdam Borowski 	answers = str_to_target_ids(question, strlen(question),
3817ccae8bSSeongJae Park 			&nr_integers);
3917ccae8bSSeongJae Park 	KUNIT_EXPECT_EQ(test, (ssize_t)0, nr_integers);
4017ccae8bSSeongJae Park 	kfree(answers);
4117ccae8bSSeongJae Park 
4217ccae8bSSeongJae Park 	question = "12 35";
43892ab4bbSAdam Borowski 	answers = str_to_target_ids(question, strlen(question),
4417ccae8bSSeongJae Park 			&nr_integers);
4517ccae8bSSeongJae Park 	KUNIT_EXPECT_EQ(test, (ssize_t)2, nr_integers);
4617ccae8bSSeongJae Park 	for (i = 0; i < nr_integers; i++)
4717ccae8bSSeongJae Park 		KUNIT_EXPECT_EQ(test, expected[i], answers[i]);
4817ccae8bSSeongJae Park 	kfree(answers);
4917ccae8bSSeongJae Park 
5017ccae8bSSeongJae Park 	question = "12 35 46";
51892ab4bbSAdam Borowski 	answers = str_to_target_ids(question, strlen(question),
5217ccae8bSSeongJae Park 			&nr_integers);
5317ccae8bSSeongJae Park 	KUNIT_EXPECT_EQ(test, (ssize_t)3, nr_integers);
5417ccae8bSSeongJae Park 	for (i = 0; i < nr_integers; i++)
5517ccae8bSSeongJae Park 		KUNIT_EXPECT_EQ(test, expected[i], answers[i]);
5617ccae8bSSeongJae Park 	kfree(answers);
5717ccae8bSSeongJae Park 
5817ccae8bSSeongJae Park 	question = "12 35 abc 46";
59892ab4bbSAdam Borowski 	answers = str_to_target_ids(question, strlen(question),
6017ccae8bSSeongJae Park 			&nr_integers);
6117ccae8bSSeongJae Park 	KUNIT_EXPECT_EQ(test, (ssize_t)2, nr_integers);
6217ccae8bSSeongJae Park 	for (i = 0; i < 2; i++)
6317ccae8bSSeongJae Park 		KUNIT_EXPECT_EQ(test, expected[i], answers[i]);
6417ccae8bSSeongJae Park 	kfree(answers);
6517ccae8bSSeongJae Park 
6617ccae8bSSeongJae Park 	question = "";
67892ab4bbSAdam Borowski 	answers = str_to_target_ids(question, strlen(question),
6817ccae8bSSeongJae Park 			&nr_integers);
6917ccae8bSSeongJae Park 	KUNIT_EXPECT_EQ(test, (ssize_t)0, nr_integers);
7017ccae8bSSeongJae Park 	kfree(answers);
7117ccae8bSSeongJae Park 
7217ccae8bSSeongJae Park 	question = "\n";
73892ab4bbSAdam Borowski 	answers = str_to_target_ids(question, strlen(question),
7417ccae8bSSeongJae Park 			&nr_integers);
7517ccae8bSSeongJae Park 	KUNIT_EXPECT_EQ(test, (ssize_t)0, nr_integers);
7617ccae8bSSeongJae Park 	kfree(answers);
7717ccae8bSSeongJae Park }
7817ccae8bSSeongJae Park 
7917ccae8bSSeongJae Park static void damon_dbgfs_test_set_targets(struct kunit *test)
8017ccae8bSSeongJae Park {
8117ccae8bSSeongJae Park 	struct damon_ctx *ctx = dbgfs_new_ctx();
8217ccae8bSSeongJae Park 	unsigned long ids[] = {1, 2, 3};
8317ccae8bSSeongJae Park 	char buf[64];
8417ccae8bSSeongJae Park 
8517ccae8bSSeongJae Park 	/* Make DAMON consider target id as plain number */
8617ccae8bSSeongJae Park 	ctx->primitive.target_valid = NULL;
8717ccae8bSSeongJae Park 	ctx->primitive.cleanup = NULL;
8817ccae8bSSeongJae Park 
8917ccae8bSSeongJae Park 	damon_set_targets(ctx, ids, 3);
9017ccae8bSSeongJae Park 	sprint_target_ids(ctx, buf, 64);
9117ccae8bSSeongJae Park 	KUNIT_EXPECT_STREQ(test, (char *)buf, "1 2 3\n");
9217ccae8bSSeongJae Park 
9317ccae8bSSeongJae Park 	damon_set_targets(ctx, NULL, 0);
9417ccae8bSSeongJae Park 	sprint_target_ids(ctx, buf, 64);
9517ccae8bSSeongJae Park 	KUNIT_EXPECT_STREQ(test, (char *)buf, "\n");
9617ccae8bSSeongJae Park 
9717ccae8bSSeongJae Park 	damon_set_targets(ctx, (unsigned long []){1, 2}, 2);
9817ccae8bSSeongJae Park 	sprint_target_ids(ctx, buf, 64);
9917ccae8bSSeongJae Park 	KUNIT_EXPECT_STREQ(test, (char *)buf, "1 2\n");
10017ccae8bSSeongJae Park 
10117ccae8bSSeongJae Park 	damon_set_targets(ctx, (unsigned long []){2}, 1);
10217ccae8bSSeongJae Park 	sprint_target_ids(ctx, buf, 64);
10317ccae8bSSeongJae Park 	KUNIT_EXPECT_STREQ(test, (char *)buf, "2\n");
10417ccae8bSSeongJae Park 
10517ccae8bSSeongJae Park 	damon_set_targets(ctx, NULL, 0);
10617ccae8bSSeongJae Park 	sprint_target_ids(ctx, buf, 64);
10717ccae8bSSeongJae Park 	KUNIT_EXPECT_STREQ(test, (char *)buf, "\n");
10817ccae8bSSeongJae Park 
10917ccae8bSSeongJae Park 	dbgfs_destroy_ctx(ctx);
11017ccae8bSSeongJae Park }
11117ccae8bSSeongJae Park 
112*1c2e11bfSSeongJae Park static void damon_dbgfs_test_set_init_regions(struct kunit *test)
113*1c2e11bfSSeongJae Park {
114*1c2e11bfSSeongJae Park 	struct damon_ctx *ctx = damon_new_ctx();
115*1c2e11bfSSeongJae Park 	unsigned long ids[] = {1, 2, 3};
116*1c2e11bfSSeongJae Park 	/* Each line represents one region in ``<target id> <start> <end>`` */
117*1c2e11bfSSeongJae Park 	char * const valid_inputs[] = {"2 10 20\n 2   20 30\n2 35 45",
118*1c2e11bfSSeongJae Park 		"2 10 20\n",
119*1c2e11bfSSeongJae Park 		"2 10 20\n1 39 59\n1 70 134\n  2  20 25\n",
120*1c2e11bfSSeongJae Park 		""};
121*1c2e11bfSSeongJae Park 	/* Reading the file again will show sorted, clean output */
122*1c2e11bfSSeongJae Park 	char * const valid_expects[] = {"2 10 20\n2 20 30\n2 35 45\n",
123*1c2e11bfSSeongJae Park 		"2 10 20\n",
124*1c2e11bfSSeongJae Park 		"1 39 59\n1 70 134\n2 10 20\n2 20 25\n",
125*1c2e11bfSSeongJae Park 		""};
126*1c2e11bfSSeongJae Park 	char * const invalid_inputs[] = {"4 10 20\n",	/* target not exists */
127*1c2e11bfSSeongJae Park 		"2 10 20\n 2 14 26\n",		/* regions overlap */
128*1c2e11bfSSeongJae Park 		"1 10 20\n2 30 40\n 1 5 8"};	/* not sorted by address */
129*1c2e11bfSSeongJae Park 	char *input, *expect;
130*1c2e11bfSSeongJae Park 	int i, rc;
131*1c2e11bfSSeongJae Park 	char buf[256];
132*1c2e11bfSSeongJae Park 
133*1c2e11bfSSeongJae Park 	damon_set_targets(ctx, ids, 3);
134*1c2e11bfSSeongJae Park 
135*1c2e11bfSSeongJae Park 	/* Put valid inputs and check the results */
136*1c2e11bfSSeongJae Park 	for (i = 0; i < ARRAY_SIZE(valid_inputs); i++) {
137*1c2e11bfSSeongJae Park 		input = valid_inputs[i];
138*1c2e11bfSSeongJae Park 		expect = valid_expects[i];
139*1c2e11bfSSeongJae Park 
140*1c2e11bfSSeongJae Park 		rc = set_init_regions(ctx, input, strnlen(input, 256));
141*1c2e11bfSSeongJae Park 		KUNIT_EXPECT_EQ(test, rc, 0);
142*1c2e11bfSSeongJae Park 
143*1c2e11bfSSeongJae Park 		memset(buf, 0, 256);
144*1c2e11bfSSeongJae Park 		sprint_init_regions(ctx, buf, 256);
145*1c2e11bfSSeongJae Park 
146*1c2e11bfSSeongJae Park 		KUNIT_EXPECT_STREQ(test, (char *)buf, expect);
147*1c2e11bfSSeongJae Park 	}
148*1c2e11bfSSeongJae Park 	/* Put invlid inputs and check the return error code */
149*1c2e11bfSSeongJae Park 	for (i = 0; i < ARRAY_SIZE(invalid_inputs); i++) {
150*1c2e11bfSSeongJae Park 		input = invalid_inputs[i];
151*1c2e11bfSSeongJae Park 		pr_info("input: %s\n", input);
152*1c2e11bfSSeongJae Park 		rc = set_init_regions(ctx, input, strnlen(input, 256));
153*1c2e11bfSSeongJae Park 		KUNIT_EXPECT_EQ(test, rc, -EINVAL);
154*1c2e11bfSSeongJae Park 
155*1c2e11bfSSeongJae Park 		memset(buf, 0, 256);
156*1c2e11bfSSeongJae Park 		sprint_init_regions(ctx, buf, 256);
157*1c2e11bfSSeongJae Park 
158*1c2e11bfSSeongJae Park 		KUNIT_EXPECT_STREQ(test, (char *)buf, "");
159*1c2e11bfSSeongJae Park 	}
160*1c2e11bfSSeongJae Park 
161*1c2e11bfSSeongJae Park 	damon_set_targets(ctx, NULL, 0);
162*1c2e11bfSSeongJae Park 	damon_destroy_ctx(ctx);
163*1c2e11bfSSeongJae Park }
164*1c2e11bfSSeongJae Park 
16517ccae8bSSeongJae Park static struct kunit_case damon_test_cases[] = {
16617ccae8bSSeongJae Park 	KUNIT_CASE(damon_dbgfs_test_str_to_target_ids),
16717ccae8bSSeongJae Park 	KUNIT_CASE(damon_dbgfs_test_set_targets),
168*1c2e11bfSSeongJae Park 	KUNIT_CASE(damon_dbgfs_test_set_init_regions),
16917ccae8bSSeongJae Park 	{},
17017ccae8bSSeongJae Park };
17117ccae8bSSeongJae Park 
17217ccae8bSSeongJae Park static struct kunit_suite damon_test_suite = {
17317ccae8bSSeongJae Park 	.name = "damon-dbgfs",
17417ccae8bSSeongJae Park 	.test_cases = damon_test_cases,
17517ccae8bSSeongJae Park };
17617ccae8bSSeongJae Park kunit_test_suite(damon_test_suite);
17717ccae8bSSeongJae Park 
17817ccae8bSSeongJae Park #endif /* _DAMON_TEST_H */
17917ccae8bSSeongJae Park 
18017ccae8bSSeongJae Park #endif	/* CONFIG_DAMON_KUNIT_TEST */
181