resource_kunit.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Test cases for API provided by resource.c and ioport.h
  4. */
  5. #include <kunit/test.h>
  6. #include <linux/ioport.h>
  7. #include <linux/kernel.h>
  8. #include <linux/string.h>
  9. #define R0_START 0x0000
  10. #define R0_END 0xffff
  11. #define R1_START 0x1234
  12. #define R1_END 0x2345
  13. #define R2_START 0x4567
  14. #define R2_END 0x5678
  15. #define R3_START 0x6789
  16. #define R3_END 0x789a
  17. #define R4_START 0x2000
  18. #define R4_END 0x7000
  19. static struct resource r0 = { .start = R0_START, .end = R0_END };
  20. static struct resource r1 = { .start = R1_START, .end = R1_END };
  21. static struct resource r2 = { .start = R2_START, .end = R2_END };
  22. static struct resource r3 = { .start = R3_START, .end = R3_END };
  23. static struct resource r4 = { .start = R4_START, .end = R4_END };
  24. struct result {
  25. struct resource *r1;
  26. struct resource *r2;
  27. struct resource r;
  28. bool ret;
  29. };
  30. static struct result results_for_union[] = {
  31. {
  32. .r1 = &r1, .r2 = &r0, .r.start = R0_START, .r.end = R0_END, .ret = true,
  33. }, {
  34. .r1 = &r2, .r2 = &r0, .r.start = R0_START, .r.end = R0_END, .ret = true,
  35. }, {
  36. .r1 = &r3, .r2 = &r0, .r.start = R0_START, .r.end = R0_END, .ret = true,
  37. }, {
  38. .r1 = &r4, .r2 = &r0, .r.start = R0_START, .r.end = R0_END, .ret = true,
  39. }, {
  40. .r1 = &r2, .r2 = &r1, .ret = false,
  41. }, {
  42. .r1 = &r3, .r2 = &r1, .ret = false,
  43. }, {
  44. .r1 = &r4, .r2 = &r1, .r.start = R1_START, .r.end = R4_END, .ret = true,
  45. }, {
  46. .r1 = &r2, .r2 = &r3, .ret = false,
  47. }, {
  48. .r1 = &r2, .r2 = &r4, .r.start = R4_START, .r.end = R4_END, .ret = true,
  49. }, {
  50. .r1 = &r3, .r2 = &r4, .r.start = R4_START, .r.end = R3_END, .ret = true,
  51. },
  52. };
  53. static struct result results_for_intersection[] = {
  54. {
  55. .r1 = &r1, .r2 = &r0, .r.start = R1_START, .r.end = R1_END, .ret = true,
  56. }, {
  57. .r1 = &r2, .r2 = &r0, .r.start = R2_START, .r.end = R2_END, .ret = true,
  58. }, {
  59. .r1 = &r3, .r2 = &r0, .r.start = R3_START, .r.end = R3_END, .ret = true,
  60. }, {
  61. .r1 = &r4, .r2 = &r0, .r.start = R4_START, .r.end = R4_END, .ret = true,
  62. }, {
  63. .r1 = &r2, .r2 = &r1, .ret = false,
  64. }, {
  65. .r1 = &r3, .r2 = &r1, .ret = false,
  66. }, {
  67. .r1 = &r4, .r2 = &r1, .r.start = R4_START, .r.end = R1_END, .ret = true,
  68. }, {
  69. .r1 = &r2, .r2 = &r3, .ret = false,
  70. }, {
  71. .r1 = &r2, .r2 = &r4, .r.start = R2_START, .r.end = R2_END, .ret = true,
  72. }, {
  73. .r1 = &r3, .r2 = &r4, .r.start = R3_START, .r.end = R4_END, .ret = true,
  74. },
  75. };
  76. static void resource_do_test(struct kunit *test, bool ret, struct resource *r,
  77. bool exp_ret, struct resource *exp_r,
  78. struct resource *r1, struct resource *r2)
  79. {
  80. KUNIT_EXPECT_EQ_MSG(test, ret, exp_ret, "Resources %pR %pR", r1, r2);
  81. KUNIT_EXPECT_EQ_MSG(test, r->start, exp_r->start, "Start elements are not equal");
  82. KUNIT_EXPECT_EQ_MSG(test, r->end, exp_r->end, "End elements are not equal");
  83. }
  84. static void resource_do_union_test(struct kunit *test, struct result *r)
  85. {
  86. struct resource result;
  87. bool ret;
  88. memset(&result, 0, sizeof(result));
  89. ret = resource_union(r->r1, r->r2, &result);
  90. resource_do_test(test, ret, &result, r->ret, &r->r, r->r1, r->r2);
  91. memset(&result, 0, sizeof(result));
  92. ret = resource_union(r->r2, r->r1, &result);
  93. resource_do_test(test, ret, &result, r->ret, &r->r, r->r2, r->r1);
  94. }
  95. static void resource_test_union(struct kunit *test)
  96. {
  97. struct result *r = results_for_union;
  98. unsigned int i = 0;
  99. do {
  100. resource_do_union_test(test, &r[i]);
  101. } while (++i < ARRAY_SIZE(results_for_union));
  102. }
  103. static void resource_do_intersection_test(struct kunit *test, struct result *r)
  104. {
  105. struct resource result;
  106. bool ret;
  107. memset(&result, 0, sizeof(result));
  108. ret = resource_intersection(r->r1, r->r2, &result);
  109. resource_do_test(test, ret, &result, r->ret, &r->r, r->r1, r->r2);
  110. memset(&result, 0, sizeof(result));
  111. ret = resource_intersection(r->r2, r->r1, &result);
  112. resource_do_test(test, ret, &result, r->ret, &r->r, r->r2, r->r1);
  113. }
  114. static void resource_test_intersection(struct kunit *test)
  115. {
  116. struct result *r = results_for_intersection;
  117. unsigned int i = 0;
  118. do {
  119. resource_do_intersection_test(test, &r[i]);
  120. } while (++i < ARRAY_SIZE(results_for_intersection));
  121. }
  122. static struct kunit_case resource_test_cases[] = {
  123. KUNIT_CASE(resource_test_union),
  124. KUNIT_CASE(resource_test_intersection),
  125. {}
  126. };
  127. static struct kunit_suite resource_test_suite = {
  128. .name = "resource",
  129. .test_cases = resource_test_cases,
  130. };
  131. kunit_test_suite(resource_test_suite);
  132. MODULE_LICENSE("GPL");