seq_buf_kunit.c 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * KUnit tests for the seq_buf API
  4. *
  5. * Copyright (C) 2025, Google LLC.
  6. */
  7. #include <kunit/test.h>
  8. #include <linux/seq_buf.h>
  9. static void seq_buf_init_test(struct kunit *test)
  10. {
  11. char buf[32];
  12. struct seq_buf s;
  13. seq_buf_init(&s, buf, sizeof(buf));
  14. KUNIT_EXPECT_EQ(test, s.size, 32);
  15. KUNIT_EXPECT_EQ(test, s.len, 0);
  16. KUNIT_EXPECT_FALSE(test, seq_buf_has_overflowed(&s));
  17. KUNIT_EXPECT_EQ(test, seq_buf_buffer_left(&s), 32);
  18. KUNIT_EXPECT_EQ(test, seq_buf_used(&s), 0);
  19. KUNIT_EXPECT_STREQ(test, seq_buf_str(&s), "");
  20. }
  21. static void seq_buf_declare_test(struct kunit *test)
  22. {
  23. DECLARE_SEQ_BUF(s, 24);
  24. KUNIT_EXPECT_EQ(test, s.size, 24);
  25. KUNIT_EXPECT_EQ(test, s.len, 0);
  26. KUNIT_EXPECT_FALSE(test, seq_buf_has_overflowed(&s));
  27. KUNIT_EXPECT_EQ(test, seq_buf_buffer_left(&s), 24);
  28. KUNIT_EXPECT_EQ(test, seq_buf_used(&s), 0);
  29. KUNIT_EXPECT_STREQ(test, seq_buf_str(&s), "");
  30. }
  31. static void seq_buf_clear_test(struct kunit *test)
  32. {
  33. DECLARE_SEQ_BUF(s, 128);
  34. seq_buf_puts(&s, "hello");
  35. KUNIT_EXPECT_EQ(test, s.len, 5);
  36. KUNIT_EXPECT_FALSE(test, seq_buf_has_overflowed(&s));
  37. KUNIT_EXPECT_STREQ(test, seq_buf_str(&s), "hello");
  38. seq_buf_clear(&s);
  39. KUNIT_EXPECT_EQ(test, s.len, 0);
  40. KUNIT_EXPECT_FALSE(test, seq_buf_has_overflowed(&s));
  41. KUNIT_EXPECT_STREQ(test, seq_buf_str(&s), "");
  42. }
  43. static void seq_buf_puts_test(struct kunit *test)
  44. {
  45. DECLARE_SEQ_BUF(s, 16);
  46. seq_buf_puts(&s, "hello");
  47. KUNIT_EXPECT_EQ(test, seq_buf_used(&s), 5);
  48. KUNIT_EXPECT_FALSE(test, seq_buf_has_overflowed(&s));
  49. KUNIT_EXPECT_STREQ(test, seq_buf_str(&s), "hello");
  50. seq_buf_puts(&s, " world");
  51. KUNIT_EXPECT_EQ(test, seq_buf_used(&s), 11);
  52. KUNIT_EXPECT_FALSE(test, seq_buf_has_overflowed(&s));
  53. KUNIT_EXPECT_STREQ(test, seq_buf_str(&s), "hello world");
  54. }
  55. static void seq_buf_puts_overflow_test(struct kunit *test)
  56. {
  57. DECLARE_SEQ_BUF(s, 10);
  58. seq_buf_puts(&s, "123456789");
  59. KUNIT_EXPECT_FALSE(test, seq_buf_has_overflowed(&s));
  60. KUNIT_EXPECT_EQ(test, seq_buf_used(&s), 9);
  61. seq_buf_puts(&s, "0");
  62. KUNIT_EXPECT_TRUE(test, seq_buf_has_overflowed(&s));
  63. KUNIT_EXPECT_EQ(test, seq_buf_used(&s), 10);
  64. KUNIT_EXPECT_STREQ(test, seq_buf_str(&s), "123456789");
  65. seq_buf_clear(&s);
  66. KUNIT_EXPECT_EQ(test, s.len, 0);
  67. KUNIT_EXPECT_FALSE(test, seq_buf_has_overflowed(&s));
  68. KUNIT_EXPECT_STREQ(test, seq_buf_str(&s), "");
  69. }
  70. static void seq_buf_putc_test(struct kunit *test)
  71. {
  72. DECLARE_SEQ_BUF(s, 4);
  73. seq_buf_putc(&s, 'a');
  74. seq_buf_putc(&s, 'b');
  75. seq_buf_putc(&s, 'c');
  76. KUNIT_EXPECT_EQ(test, seq_buf_used(&s), 3);
  77. KUNIT_EXPECT_FALSE(test, seq_buf_has_overflowed(&s));
  78. KUNIT_EXPECT_STREQ(test, seq_buf_str(&s), "abc");
  79. seq_buf_putc(&s, 'd');
  80. KUNIT_EXPECT_EQ(test, seq_buf_used(&s), 4);
  81. KUNIT_EXPECT_FALSE(test, seq_buf_has_overflowed(&s));
  82. KUNIT_EXPECT_STREQ(test, seq_buf_str(&s), "abc");
  83. seq_buf_putc(&s, 'e');
  84. KUNIT_EXPECT_EQ(test, seq_buf_used(&s), 4);
  85. KUNIT_EXPECT_TRUE(test, seq_buf_has_overflowed(&s));
  86. KUNIT_EXPECT_STREQ(test, seq_buf_str(&s), "abc");
  87. seq_buf_clear(&s);
  88. KUNIT_EXPECT_EQ(test, s.len, 0);
  89. KUNIT_EXPECT_FALSE(test, seq_buf_has_overflowed(&s));
  90. KUNIT_EXPECT_STREQ(test, seq_buf_str(&s), "");
  91. }
  92. static void seq_buf_printf_test(struct kunit *test)
  93. {
  94. DECLARE_SEQ_BUF(s, 32);
  95. seq_buf_printf(&s, "hello %s", "world");
  96. KUNIT_EXPECT_EQ(test, seq_buf_used(&s), 11);
  97. KUNIT_EXPECT_FALSE(test, seq_buf_has_overflowed(&s));
  98. KUNIT_EXPECT_STREQ(test, seq_buf_str(&s), "hello world");
  99. seq_buf_printf(&s, " %d", 123);
  100. KUNIT_EXPECT_EQ(test, seq_buf_used(&s), 15);
  101. KUNIT_EXPECT_FALSE(test, seq_buf_has_overflowed(&s));
  102. KUNIT_EXPECT_STREQ(test, seq_buf_str(&s), "hello world 123");
  103. }
  104. static void seq_buf_printf_overflow_test(struct kunit *test)
  105. {
  106. DECLARE_SEQ_BUF(s, 16);
  107. seq_buf_printf(&s, "%lu", 1234567890UL);
  108. KUNIT_EXPECT_FALSE(test, seq_buf_has_overflowed(&s));
  109. KUNIT_EXPECT_EQ(test, seq_buf_used(&s), 10);
  110. KUNIT_EXPECT_STREQ(test, seq_buf_str(&s), "1234567890");
  111. seq_buf_printf(&s, "%s", "abcdefghij");
  112. KUNIT_EXPECT_TRUE(test, seq_buf_has_overflowed(&s));
  113. KUNIT_EXPECT_EQ(test, seq_buf_used(&s), 16);
  114. KUNIT_EXPECT_STREQ(test, seq_buf_str(&s), "1234567890abcde");
  115. seq_buf_clear(&s);
  116. KUNIT_EXPECT_EQ(test, s.len, 0);
  117. KUNIT_EXPECT_FALSE(test, seq_buf_has_overflowed(&s));
  118. KUNIT_EXPECT_STREQ(test, seq_buf_str(&s), "");
  119. }
  120. static void seq_buf_get_buf_commit_test(struct kunit *test)
  121. {
  122. DECLARE_SEQ_BUF(s, 16);
  123. char *buf;
  124. size_t len;
  125. len = seq_buf_get_buf(&s, &buf);
  126. KUNIT_EXPECT_EQ(test, len, 16);
  127. KUNIT_EXPECT_PTR_NE(test, buf, NULL);
  128. memcpy(buf, "hello", 5);
  129. seq_buf_commit(&s, 5);
  130. KUNIT_EXPECT_EQ(test, seq_buf_used(&s), 5);
  131. KUNIT_EXPECT_FALSE(test, seq_buf_has_overflowed(&s));
  132. KUNIT_EXPECT_STREQ(test, seq_buf_str(&s), "hello");
  133. len = seq_buf_get_buf(&s, &buf);
  134. KUNIT_EXPECT_EQ(test, len, 11);
  135. KUNIT_EXPECT_PTR_NE(test, buf, NULL);
  136. memcpy(buf, " worlds!", 8);
  137. seq_buf_commit(&s, 6);
  138. KUNIT_EXPECT_EQ(test, seq_buf_used(&s), 11);
  139. KUNIT_EXPECT_FALSE(test, seq_buf_has_overflowed(&s));
  140. KUNIT_EXPECT_STREQ(test, seq_buf_str(&s), "hello world");
  141. len = seq_buf_get_buf(&s, &buf);
  142. KUNIT_EXPECT_EQ(test, len, 5);
  143. KUNIT_EXPECT_PTR_NE(test, buf, NULL);
  144. seq_buf_commit(&s, -1);
  145. KUNIT_EXPECT_TRUE(test, seq_buf_has_overflowed(&s));
  146. }
  147. static struct kunit_case seq_buf_test_cases[] = {
  148. KUNIT_CASE(seq_buf_init_test),
  149. KUNIT_CASE(seq_buf_declare_test),
  150. KUNIT_CASE(seq_buf_clear_test),
  151. KUNIT_CASE(seq_buf_puts_test),
  152. KUNIT_CASE(seq_buf_puts_overflow_test),
  153. KUNIT_CASE(seq_buf_putc_test),
  154. KUNIT_CASE(seq_buf_printf_test),
  155. KUNIT_CASE(seq_buf_printf_overflow_test),
  156. KUNIT_CASE(seq_buf_get_buf_commit_test),
  157. {}
  158. };
  159. static struct kunit_suite seq_buf_test_suite = {
  160. .name = "seq_buf",
  161. .test_cases = seq_buf_test_cases,
  162. };
  163. kunit_test_suite(seq_buf_test_suite);
  164. MODULE_DESCRIPTION("Runtime test cases for seq_buf string API");
  165. MODULE_LICENSE("GPL");