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