1 /* SPDX-License-Identifier: GPL-2.0 */
3 * DAMON Debugfs Interface Unit Tests
5 * Author: SeongJae Park <sj@kernel.org>
8 #ifdef CONFIG_DAMON_DBGFS_KUNIT_TEST
10 #ifndef _DAMON_DBGFS_TEST_H
11 #define _DAMON_DBGFS_TEST_H
13 #include <kunit/test.h>
15 static void damon_dbgfs_test_str_to_ints(struct kunit
*test
)
19 int expected
[] = {12, 35, 46};
20 ssize_t nr_integers
= 0, i
;
23 answers
= str_to_ints(question
, strlen(question
), &nr_integers
);
24 KUNIT_EXPECT_EQ(test
, (ssize_t
)1, nr_integers
);
25 KUNIT_EXPECT_EQ(test
, 123, answers
[0]);
29 answers
= str_to_ints(question
, strlen(question
), &nr_integers
);
30 KUNIT_EXPECT_EQ(test
, (ssize_t
)1, nr_integers
);
31 KUNIT_EXPECT_EQ(test
, 123, answers
[0]);
35 answers
= str_to_ints(question
, strlen(question
), &nr_integers
);
36 KUNIT_EXPECT_EQ(test
, (ssize_t
)0, nr_integers
);
40 answers
= str_to_ints(question
, strlen(question
), &nr_integers
);
41 KUNIT_EXPECT_EQ(test
, (ssize_t
)2, nr_integers
);
42 for (i
= 0; i
< nr_integers
; i
++)
43 KUNIT_EXPECT_EQ(test
, expected
[i
], answers
[i
]);
46 question
= "12 35 46";
47 answers
= str_to_ints(question
, strlen(question
), &nr_integers
);
48 KUNIT_EXPECT_EQ(test
, (ssize_t
)3, nr_integers
);
49 for (i
= 0; i
< nr_integers
; i
++)
50 KUNIT_EXPECT_EQ(test
, expected
[i
], answers
[i
]);
53 question
= "12 35 abc 46";
54 answers
= str_to_ints(question
, strlen(question
), &nr_integers
);
55 KUNIT_EXPECT_EQ(test
, (ssize_t
)2, nr_integers
);
56 for (i
= 0; i
< 2; i
++)
57 KUNIT_EXPECT_EQ(test
, expected
[i
], answers
[i
]);
61 answers
= str_to_ints(question
, strlen(question
), &nr_integers
);
62 KUNIT_EXPECT_EQ(test
, (ssize_t
)0, nr_integers
);
66 answers
= str_to_ints(question
, strlen(question
), &nr_integers
);
67 KUNIT_EXPECT_EQ(test
, (ssize_t
)0, nr_integers
);
71 static void damon_dbgfs_test_set_targets(struct kunit
*test
)
73 struct damon_ctx
*ctx
= dbgfs_new_ctx();
76 if (!damon_is_registered_ops(DAMON_OPS_PADDR
)) {
77 dbgfs_destroy_ctx(ctx
);
78 kunit_skip(test
, "PADDR not registered");
81 /* Make DAMON consider target has no pid */
82 damon_select_ops(ctx
, DAMON_OPS_PADDR
);
84 dbgfs_set_targets(ctx
, 0, NULL
);
85 sprint_target_ids(ctx
, buf
, 64);
86 KUNIT_EXPECT_STREQ(test
, (char *)buf
, "\n");
88 dbgfs_set_targets(ctx
, 1, NULL
);
89 sprint_target_ids(ctx
, buf
, 64);
90 KUNIT_EXPECT_STREQ(test
, (char *)buf
, "42\n");
92 dbgfs_set_targets(ctx
, 0, NULL
);
93 sprint_target_ids(ctx
, buf
, 64);
94 KUNIT_EXPECT_STREQ(test
, (char *)buf
, "\n");
96 dbgfs_destroy_ctx(ctx
);
99 static void damon_dbgfs_test_set_init_regions(struct kunit
*test
)
101 struct damon_ctx
*ctx
= damon_new_ctx();
102 /* Each line represents one region in ``<target idx> <start> <end>`` */
103 char * const valid_inputs
[] = {"1 10 20\n 1 20 30\n1 35 45",
105 "1 10 20\n0 39 59\n0 70 134\n 1 20 25\n",
107 /* Reading the file again will show sorted, clean output */
108 char * const valid_expects
[] = {"1 10 20\n1 20 30\n1 35 45\n",
110 "0 39 59\n0 70 134\n1 10 20\n1 20 25\n",
112 char * const invalid_inputs
[] = {"3 10 20\n", /* target not exists */
113 "1 10 20\n 1 14 26\n", /* regions overlap */
114 "0 10 20\n1 30 40\n 0 5 8"}; /* not sorted by address */
115 char *input
, *expect
;
119 if (!damon_is_registered_ops(DAMON_OPS_PADDR
)) {
120 damon_destroy_ctx(ctx
);
121 kunit_skip(test
, "PADDR not registered");
124 damon_select_ops(ctx
, DAMON_OPS_PADDR
);
126 dbgfs_set_targets(ctx
, 3, NULL
);
128 /* Put valid inputs and check the results */
129 for (i
= 0; i
< ARRAY_SIZE(valid_inputs
); i
++) {
130 input
= valid_inputs
[i
];
131 expect
= valid_expects
[i
];
133 rc
= set_init_regions(ctx
, input
, strnlen(input
, 256));
134 KUNIT_EXPECT_EQ(test
, rc
, 0);
137 sprint_init_regions(ctx
, buf
, 256);
139 KUNIT_EXPECT_STREQ(test
, (char *)buf
, expect
);
141 /* Put invalid inputs and check the return error code */
142 for (i
= 0; i
< ARRAY_SIZE(invalid_inputs
); i
++) {
143 input
= invalid_inputs
[i
];
144 pr_info("input: %s\n", input
);
145 rc
= set_init_regions(ctx
, input
, strnlen(input
, 256));
146 KUNIT_EXPECT_EQ(test
, rc
, -EINVAL
);
149 sprint_init_regions(ctx
, buf
, 256);
151 KUNIT_EXPECT_STREQ(test
, (char *)buf
, "");
154 dbgfs_set_targets(ctx
, 0, NULL
);
155 damon_destroy_ctx(ctx
);
158 static struct kunit_case damon_test_cases
[] = {
159 KUNIT_CASE(damon_dbgfs_test_str_to_ints
),
160 KUNIT_CASE(damon_dbgfs_test_set_targets
),
161 KUNIT_CASE(damon_dbgfs_test_set_init_regions
),
165 static struct kunit_suite damon_test_suite
= {
166 .name
= "damon-dbgfs",
167 .test_cases
= damon_test_cases
,
169 kunit_test_suite(damon_test_suite
);
171 #endif /* _DAMON_DBGFS_TEST_H */
173 #endif /* CONFIG_DAMON_KUNIT_TEST */