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