1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3 * Data Access Monitor Unit Tests
4 *
5 * Author: SeongJae Park <sj@kernel.org>
6 */
7
8 #ifdef CONFIG_DAMON_SYSFS_KUNIT_TEST
9
10 #ifndef _DAMON_SYSFS_TEST_H
11 #define _DAMON_SYSFS_TEST_H
12
13 #include <kunit/test.h>
14
nr_damon_targets(struct damon_ctx * ctx)15 static unsigned int nr_damon_targets(struct damon_ctx *ctx)
16 {
17 struct damon_target *t;
18 unsigned int nr_targets = 0;
19
20 damon_for_each_target(t, ctx)
21 nr_targets++;
22
23 return nr_targets;
24 }
25
__damon_sysfs_test_get_any_pid(int min,int max)26 static int __damon_sysfs_test_get_any_pid(int min, int max)
27 {
28 struct pid *pid;
29 int i;
30
31 for (i = min; i <= max; i++) {
32 pid = find_get_pid(i);
33 if (pid) {
34 put_pid(pid);
35 return i;
36 }
37 }
38 return -1;
39 }
40
damon_sysfs_test_add_targets(struct kunit * test)41 static void damon_sysfs_test_add_targets(struct kunit *test)
42 {
43 struct damon_sysfs_targets *sysfs_targets;
44 struct damon_sysfs_target *sysfs_target;
45 struct damon_ctx *ctx;
46
47 sysfs_targets = damon_sysfs_targets_alloc();
48 if (!sysfs_targets)
49 kunit_skip(test, "sysfs_targets alloc fail");
50 sysfs_targets->nr = 1;
51 sysfs_targets->targets_arr = kmalloc_array(1,
52 sizeof(*sysfs_targets->targets_arr), GFP_KERNEL);
53 if (!sysfs_targets->targets_arr) {
54 kfree(sysfs_targets);
55 kunit_skip(test, "targets_arr alloc fail");
56 }
57
58 sysfs_target = damon_sysfs_target_alloc();
59 if (!sysfs_target) {
60 kfree(sysfs_targets->targets_arr);
61 kfree(sysfs_targets);
62 kunit_skip(test, "sysfs_target alloc fail");
63 }
64 sysfs_target->pid = __damon_sysfs_test_get_any_pid(12, 100);
65 sysfs_target->regions = damon_sysfs_regions_alloc();
66 if (!sysfs_target->regions) {
67 kfree(sysfs_targets->targets_arr);
68 kfree(sysfs_targets);
69 kfree(sysfs_target);
70 kunit_skip(test, "sysfs_regions alloc fail");
71 }
72
73 sysfs_targets->targets_arr[0] = sysfs_target;
74
75 ctx = damon_new_ctx();
76 if (!ctx) {
77 kfree(sysfs_targets->targets_arr);
78 kfree(sysfs_targets);
79 kfree(sysfs_target->regions);
80 kfree(sysfs_target);
81 kunit_skip(test, "ctx alloc fail");
82 }
83
84 damon_sysfs_add_targets(ctx, sysfs_targets);
85 KUNIT_EXPECT_EQ(test, 1u, nr_damon_targets(ctx));
86
87 sysfs_target->pid = __damon_sysfs_test_get_any_pid(
88 sysfs_target->pid + 1, 200);
89 damon_sysfs_add_targets(ctx, sysfs_targets);
90 KUNIT_EXPECT_EQ(test, 2u, nr_damon_targets(ctx));
91
92 damon_destroy_ctx(ctx);
93 kfree(sysfs_targets->targets_arr);
94 kfree(sysfs_targets);
95 kfree(sysfs_target->regions);
96 kfree(sysfs_target);
97 }
98
99 static struct kunit_case damon_sysfs_test_cases[] = {
100 KUNIT_CASE(damon_sysfs_test_add_targets),
101 {},
102 };
103
104 static struct kunit_suite damon_sysfs_test_suite = {
105 .name = "damon-sysfs",
106 .test_cases = damon_sysfs_test_cases,
107 };
108 kunit_test_suite(damon_sysfs_test_suite);
109
110 #endif /* _DAMON_SYSFS_TEST_H */
111
112 #endif /* CONFIG_DAMON_SYSFS_KUNIT_TEST */
113