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