xref: /openbmc/linux/mm/damon/dbgfs-test.h (revision 0107865541961ee128149c9873996d32143a74d0)
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 
1121c2e11bfSSeongJae Park static void damon_dbgfs_test_set_init_regions(struct kunit *test)
1131c2e11bfSSeongJae Park {
1141c2e11bfSSeongJae Park 	struct damon_ctx *ctx = damon_new_ctx();
1151c2e11bfSSeongJae Park 	unsigned long ids[] = {1, 2, 3};
1161c2e11bfSSeongJae Park 	/* Each line represents one region in ``<target id> <start> <end>`` */
1171c2e11bfSSeongJae Park 	char * const valid_inputs[] = {"2 10 20\n 2   20 30\n2 35 45",
1181c2e11bfSSeongJae Park 		"2 10 20\n",
1191c2e11bfSSeongJae Park 		"2 10 20\n1 39 59\n1 70 134\n  2  20 25\n",
1201c2e11bfSSeongJae Park 		""};
1211c2e11bfSSeongJae Park 	/* Reading the file again will show sorted, clean output */
1221c2e11bfSSeongJae Park 	char * const valid_expects[] = {"2 10 20\n2 20 30\n2 35 45\n",
1231c2e11bfSSeongJae Park 		"2 10 20\n",
1241c2e11bfSSeongJae Park 		"1 39 59\n1 70 134\n2 10 20\n2 20 25\n",
1251c2e11bfSSeongJae Park 		""};
1261c2e11bfSSeongJae Park 	char * const invalid_inputs[] = {"4 10 20\n",	/* target not exists */
1271c2e11bfSSeongJae Park 		"2 10 20\n 2 14 26\n",		/* regions overlap */
1281c2e11bfSSeongJae Park 		"1 10 20\n2 30 40\n 1 5 8"};	/* not sorted by address */
1291c2e11bfSSeongJae Park 	char *input, *expect;
1301c2e11bfSSeongJae Park 	int i, rc;
1311c2e11bfSSeongJae Park 	char buf[256];
1321c2e11bfSSeongJae Park 
1331c2e11bfSSeongJae Park 	damon_set_targets(ctx, ids, 3);
1341c2e11bfSSeongJae Park 
1351c2e11bfSSeongJae Park 	/* Put valid inputs and check the results */
1361c2e11bfSSeongJae Park 	for (i = 0; i < ARRAY_SIZE(valid_inputs); i++) {
1371c2e11bfSSeongJae Park 		input = valid_inputs[i];
1381c2e11bfSSeongJae Park 		expect = valid_expects[i];
1391c2e11bfSSeongJae Park 
1401c2e11bfSSeongJae Park 		rc = set_init_regions(ctx, input, strnlen(input, 256));
1411c2e11bfSSeongJae Park 		KUNIT_EXPECT_EQ(test, rc, 0);
1421c2e11bfSSeongJae Park 
1431c2e11bfSSeongJae Park 		memset(buf, 0, 256);
1441c2e11bfSSeongJae Park 		sprint_init_regions(ctx, buf, 256);
1451c2e11bfSSeongJae Park 
1461c2e11bfSSeongJae Park 		KUNIT_EXPECT_STREQ(test, (char *)buf, expect);
1471c2e11bfSSeongJae Park 	}
148*01078655SColin Ian King 	/* Put invalid inputs and check the return error code */
1491c2e11bfSSeongJae Park 	for (i = 0; i < ARRAY_SIZE(invalid_inputs); i++) {
1501c2e11bfSSeongJae Park 		input = invalid_inputs[i];
1511c2e11bfSSeongJae Park 		pr_info("input: %s\n", input);
1521c2e11bfSSeongJae Park 		rc = set_init_regions(ctx, input, strnlen(input, 256));
1531c2e11bfSSeongJae Park 		KUNIT_EXPECT_EQ(test, rc, -EINVAL);
1541c2e11bfSSeongJae Park 
1551c2e11bfSSeongJae Park 		memset(buf, 0, 256);
1561c2e11bfSSeongJae Park 		sprint_init_regions(ctx, buf, 256);
1571c2e11bfSSeongJae Park 
1581c2e11bfSSeongJae Park 		KUNIT_EXPECT_STREQ(test, (char *)buf, "");
1591c2e11bfSSeongJae Park 	}
1601c2e11bfSSeongJae Park 
1611c2e11bfSSeongJae Park 	damon_set_targets(ctx, NULL, 0);
1621c2e11bfSSeongJae Park 	damon_destroy_ctx(ctx);
1631c2e11bfSSeongJae Park }
1641c2e11bfSSeongJae 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),
1681c2e11bfSSeongJae 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