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