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