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
15static 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
26static 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
41static void damon_sysfs_test_set_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	sysfs_targets->nr = 1;
49	sysfs_targets->targets_arr = kmalloc_array(1,
50			sizeof(*sysfs_targets->targets_arr), GFP_KERNEL);
51
52	sysfs_target = damon_sysfs_target_alloc();
53	sysfs_target->pid = __damon_sysfs_test_get_any_pid(12, 100);
54	sysfs_target->regions = damon_sysfs_regions_alloc();
55	sysfs_targets->targets_arr[0] = sysfs_target;
56
57	ctx = damon_new_ctx();
58
59	damon_sysfs_set_targets(ctx, sysfs_targets);
60	KUNIT_EXPECT_EQ(test, 1u, nr_damon_targets(ctx));
61
62	sysfs_target->pid = __damon_sysfs_test_get_any_pid(
63			sysfs_target->pid + 1, 200);
64	damon_sysfs_set_targets(ctx, sysfs_targets);
65	KUNIT_EXPECT_EQ(test, 1u, nr_damon_targets(ctx));
66
67	damon_destroy_ctx(ctx);
68	kfree(sysfs_targets->targets_arr);
69	kfree(sysfs_targets);
70	kfree(sysfs_target);
71}
72
73static struct kunit_case damon_sysfs_test_cases[] = {
74	KUNIT_CASE(damon_sysfs_test_set_targets),
75	{},
76};
77
78static struct kunit_suite damon_sysfs_test_suite = {
79	.name = "damon-sysfs",
80	.test_cases = damon_sysfs_test_cases,
81};
82kunit_test_suite(damon_sysfs_test_suite);
83
84#endif /* _DAMON_SYSFS_TEST_H */
85
86#endif /* CONFIG_DAMON_SYSFS_KUNIT_TEST */
87