sysfs-kunit.h 2.6 KB

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