assert_test.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * KUnit test for the assertion formatting functions.
  4. * Author: Ivan Orlov <ivan.orlov0322@gmail.com>
  5. */
  6. #include <kunit/test.h>
  7. #include "string-stream.h"
  8. #define TEST_PTR_EXPECTED_BUF_SIZE 32
  9. #define HEXDUMP_TEST_BUF_LEN 5
  10. #define ASSERT_TEST_EXPECT_CONTAIN(test, str, substr) KUNIT_EXPECT_TRUE(test, strstr(str, substr))
  11. #define ASSERT_TEST_EXPECT_NCONTAIN(test, str, substr) KUNIT_EXPECT_FALSE(test, strstr(str, substr))
  12. static void kunit_test_is_literal(struct kunit *test)
  13. {
  14. KUNIT_EXPECT_TRUE(test, is_literal("5", 5));
  15. KUNIT_EXPECT_TRUE(test, is_literal("0", 0));
  16. KUNIT_EXPECT_TRUE(test, is_literal("1234567890", 1234567890));
  17. KUNIT_EXPECT_TRUE(test, is_literal("-1234567890", -1234567890));
  18. KUNIT_EXPECT_FALSE(test, is_literal("05", 5));
  19. KUNIT_EXPECT_FALSE(test, is_literal("", 0));
  20. KUNIT_EXPECT_FALSE(test, is_literal("-0", 0));
  21. KUNIT_EXPECT_FALSE(test, is_literal("12#45", 1245));
  22. }
  23. static void kunit_test_is_str_literal(struct kunit *test)
  24. {
  25. KUNIT_EXPECT_TRUE(test, is_str_literal("\"Hello, World!\"", "Hello, World!"));
  26. KUNIT_EXPECT_TRUE(test, is_str_literal("\"\"", ""));
  27. KUNIT_EXPECT_TRUE(test, is_str_literal("\"\"\"", "\""));
  28. KUNIT_EXPECT_FALSE(test, is_str_literal("", ""));
  29. KUNIT_EXPECT_FALSE(test, is_str_literal("\"", "\""));
  30. KUNIT_EXPECT_FALSE(test, is_str_literal("\"Abacaba", "Abacaba"));
  31. KUNIT_EXPECT_FALSE(test, is_str_literal("Abacaba\"", "Abacaba"));
  32. KUNIT_EXPECT_FALSE(test, is_str_literal("\"Abacaba\"", "\"Abacaba\""));
  33. }
  34. KUNIT_DEFINE_ACTION_WRAPPER(kfree_wrapper, kfree, const void *);
  35. /* this function is used to get a "char *" string from the string stream and defer its cleanup */
  36. static char *get_str_from_stream(struct kunit *test, struct string_stream *stream)
  37. {
  38. char *str = string_stream_get_string(stream);
  39. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, str);
  40. kunit_add_action(test, kfree_wrapper, (void *)str);
  41. return str;
  42. }
  43. static void kunit_test_assert_prologue(struct kunit *test)
  44. {
  45. struct string_stream *stream;
  46. char *str;
  47. const struct kunit_loc location = {
  48. .file = "testfile.c",
  49. .line = 1337,
  50. };
  51. stream = kunit_alloc_string_stream(test, GFP_KERNEL);
  52. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
  53. /* Test an expectation fail prologue */
  54. kunit_assert_prologue(&location, KUNIT_EXPECTATION, stream);
  55. str = get_str_from_stream(test, stream);
  56. ASSERT_TEST_EXPECT_CONTAIN(test, str, "EXPECTATION");
  57. ASSERT_TEST_EXPECT_CONTAIN(test, str, "testfile.c");
  58. ASSERT_TEST_EXPECT_CONTAIN(test, str, "1337");
  59. /* Test an assertion fail prologue */
  60. string_stream_clear(stream);
  61. kunit_assert_prologue(&location, KUNIT_ASSERTION, stream);
  62. str = get_str_from_stream(test, stream);
  63. ASSERT_TEST_EXPECT_CONTAIN(test, str, "ASSERTION");
  64. ASSERT_TEST_EXPECT_CONTAIN(test, str, "testfile.c");
  65. ASSERT_TEST_EXPECT_CONTAIN(test, str, "1337");
  66. }
  67. /*
  68. * This function accepts an arbitrary count of parameters and generates a va_format struct,
  69. * which can be used to validate kunit_assert_print_msg function
  70. */
  71. static void verify_assert_print_msg(struct kunit *test,
  72. struct string_stream *stream,
  73. char *expected, const char *format, ...)
  74. {
  75. va_list list;
  76. const struct va_format vformat = {
  77. .fmt = format,
  78. .va = &list,
  79. };
  80. va_start(list, format);
  81. string_stream_clear(stream);
  82. kunit_assert_print_msg(&vformat, stream);
  83. KUNIT_EXPECT_STREQ(test, get_str_from_stream(test, stream), expected);
  84. }
  85. static void kunit_test_assert_print_msg(struct kunit *test)
  86. {
  87. struct string_stream *stream;
  88. stream = kunit_alloc_string_stream(test, GFP_KERNEL);
  89. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
  90. verify_assert_print_msg(test, stream, "\nTest", "Test");
  91. verify_assert_print_msg(test, stream, "\nAbacaba -123 234", "%s %d %u",
  92. "Abacaba", -123, 234U);
  93. verify_assert_print_msg(test, stream, "", NULL);
  94. }
  95. /*
  96. * Further code contains the tests for different assert format functions.
  97. * This helper function accepts the assert format function, executes it and
  98. * validates the result string from the stream by checking that all of the
  99. * substrings exist in the output.
  100. */
  101. static void validate_assert(assert_format_t format_func, struct kunit *test,
  102. const struct kunit_assert *assert,
  103. struct string_stream *stream, int num_checks, ...)
  104. {
  105. size_t i;
  106. va_list checks;
  107. char *cur_substr_exp;
  108. struct va_format message = { NULL, NULL };
  109. va_start(checks, num_checks);
  110. string_stream_clear(stream);
  111. format_func(assert, &message, stream);
  112. for (i = 0; i < num_checks; i++) {
  113. cur_substr_exp = va_arg(checks, char *);
  114. ASSERT_TEST_EXPECT_CONTAIN(test, get_str_from_stream(test, stream), cur_substr_exp);
  115. }
  116. }
  117. static void kunit_test_unary_assert_format(struct kunit *test)
  118. {
  119. struct string_stream *stream;
  120. struct kunit_assert assert = {};
  121. struct kunit_unary_assert un_assert = {
  122. .assert = assert,
  123. .condition = "expr",
  124. .expected_true = true,
  125. };
  126. stream = kunit_alloc_string_stream(test, GFP_KERNEL);
  127. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
  128. validate_assert(kunit_unary_assert_format, test, &un_assert.assert,
  129. stream, 2, "true", "is false");
  130. un_assert.expected_true = false;
  131. validate_assert(kunit_unary_assert_format, test, &un_assert.assert,
  132. stream, 2, "false", "is true");
  133. }
  134. static void kunit_test_ptr_not_err_assert_format(struct kunit *test)
  135. {
  136. struct string_stream *stream;
  137. struct kunit_assert assert = {};
  138. struct kunit_ptr_not_err_assert not_err_assert = {
  139. .assert = assert,
  140. .text = "expr",
  141. .value = NULL,
  142. };
  143. stream = kunit_alloc_string_stream(test, GFP_KERNEL);
  144. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
  145. /* Value is NULL. The corresponding message should be printed out */
  146. validate_assert(kunit_ptr_not_err_assert_format, test,
  147. &not_err_assert.assert,
  148. stream, 1, "null");
  149. /* Value is not NULL, but looks like an error pointer. Error should be printed out */
  150. not_err_assert.value = (void *)-12;
  151. validate_assert(kunit_ptr_not_err_assert_format, test,
  152. &not_err_assert.assert, stream, 2,
  153. "error", "-12");
  154. }
  155. static void kunit_test_binary_assert_format(struct kunit *test)
  156. {
  157. struct string_stream *stream;
  158. struct kunit_assert assert = {};
  159. struct kunit_binary_assert_text text = {
  160. .left_text = "1 + 2",
  161. .operation = "==",
  162. .right_text = "2",
  163. };
  164. const struct kunit_binary_assert binary_assert = {
  165. .assert = assert,
  166. .text = &text,
  167. .left_value = 3,
  168. .right_value = 2,
  169. };
  170. stream = kunit_alloc_string_stream(test, GFP_KERNEL);
  171. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
  172. /*
  173. * Printed values should depend on the input we provide: the left text, right text, left
  174. * value and the right value.
  175. */
  176. validate_assert(kunit_binary_assert_format, test, &binary_assert.assert,
  177. stream, 4, "1 + 2", "2", "3", "==");
  178. text.right_text = "4 - 2";
  179. validate_assert(kunit_binary_assert_format, test, &binary_assert.assert,
  180. stream, 3, "==", "1 + 2", "4 - 2");
  181. text.left_text = "3";
  182. validate_assert(kunit_binary_assert_format, test, &binary_assert.assert,
  183. stream, 4, "3", "4 - 2", "2", "==");
  184. text.right_text = "2";
  185. validate_assert(kunit_binary_assert_format, test, &binary_assert.assert,
  186. stream, 3, "3", "2", "==");
  187. }
  188. static void kunit_test_binary_ptr_assert_format(struct kunit *test)
  189. {
  190. struct string_stream *stream;
  191. struct kunit_assert assert = {};
  192. char *addr_var_a, *addr_var_b;
  193. static const void *var_a = (void *)0xDEADBEEF;
  194. static const void *var_b = (void *)0xBADDCAFE;
  195. struct kunit_binary_assert_text text = {
  196. .left_text = "var_a",
  197. .operation = "==",
  198. .right_text = "var_b",
  199. };
  200. struct kunit_binary_ptr_assert binary_ptr_assert = {
  201. .assert = assert,
  202. .text = &text,
  203. .left_value = var_a,
  204. .right_value = var_b,
  205. };
  206. addr_var_a = kunit_kzalloc(test, TEST_PTR_EXPECTED_BUF_SIZE, GFP_KERNEL);
  207. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, addr_var_a);
  208. addr_var_b = kunit_kzalloc(test, TEST_PTR_EXPECTED_BUF_SIZE, GFP_KERNEL);
  209. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, addr_var_b);
  210. /*
  211. * Print the addresses to the buffers first.
  212. * This is necessary as we may have different count of leading zeros in the pointer
  213. * on different architectures.
  214. */
  215. snprintf(addr_var_a, TEST_PTR_EXPECTED_BUF_SIZE, "%px", var_a);
  216. snprintf(addr_var_b, TEST_PTR_EXPECTED_BUF_SIZE, "%px", var_b);
  217. stream = kunit_alloc_string_stream(test, GFP_KERNEL);
  218. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
  219. validate_assert(kunit_binary_ptr_assert_format, test, &binary_ptr_assert.assert,
  220. stream, 3, addr_var_a, addr_var_b, "==");
  221. }
  222. static void kunit_test_binary_str_assert_format(struct kunit *test)
  223. {
  224. struct string_stream *stream;
  225. struct kunit_assert assert = {};
  226. static const char *var_a = "abacaba";
  227. static const char *var_b = "kernel";
  228. struct kunit_binary_assert_text text = {
  229. .left_text = "var_a",
  230. .operation = "==",
  231. .right_text = "var_b",
  232. };
  233. struct kunit_binary_str_assert binary_str_assert = {
  234. .assert = assert,
  235. .text = &text,
  236. .left_value = var_a,
  237. .right_value = var_b,
  238. };
  239. stream = kunit_alloc_string_stream(test, GFP_KERNEL);
  240. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
  241. validate_assert(kunit_binary_str_assert_format, test,
  242. &binary_str_assert.assert,
  243. stream, 5, "var_a", "var_b", "\"abacaba\"",
  244. "\"kernel\"", "==");
  245. text.left_text = "\"abacaba\"";
  246. validate_assert(kunit_binary_str_assert_format, test, &binary_str_assert.assert,
  247. stream, 4, "\"abacaba\"", "var_b", "\"kernel\"", "==");
  248. text.right_text = "\"kernel\"";
  249. validate_assert(kunit_binary_str_assert_format, test, &binary_str_assert.assert,
  250. stream, 3, "\"abacaba\"", "\"kernel\"", "==");
  251. }
  252. static const u8 hex_testbuf1[] = { 0x26, 0x74, 0x6b, 0x9c, 0x55,
  253. 0x45, 0x9d, 0x47, 0xd6, 0x47,
  254. 0x2, 0x89, 0x8c, 0x81, 0x94,
  255. 0x12, 0xfe, 0x01 };
  256. static const u8 hex_testbuf2[] = { 0x26, 0x74, 0x6b, 0x9c, 0x55,
  257. 0x45, 0x9d, 0x47, 0x21, 0x47,
  258. 0xcd, 0x89, 0x24, 0x50, 0x94,
  259. 0x12, 0xba, 0x01 };
  260. static void kunit_test_assert_hexdump(struct kunit *test)
  261. {
  262. struct string_stream *stream;
  263. char *str;
  264. size_t i;
  265. char buf[HEXDUMP_TEST_BUF_LEN];
  266. stream = kunit_alloc_string_stream(test, GFP_KERNEL);
  267. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
  268. /* Check that we are getting output like <xx> for non-matching numbers. */
  269. kunit_assert_hexdump(stream, hex_testbuf1, hex_testbuf2, sizeof(hex_testbuf1));
  270. str = get_str_from_stream(test, stream);
  271. for (i = 0; i < sizeof(hex_testbuf1); i++) {
  272. snprintf(buf, HEXDUMP_TEST_BUF_LEN, "<%02x>", hex_testbuf1[i]);
  273. if (hex_testbuf1[i] != hex_testbuf2[i])
  274. ASSERT_TEST_EXPECT_CONTAIN(test, str, buf);
  275. }
  276. /* We shouldn't get any <xx> numbers when comparing the buffer with itself. */
  277. string_stream_clear(stream);
  278. kunit_assert_hexdump(stream, hex_testbuf1, hex_testbuf1, sizeof(hex_testbuf1));
  279. str = get_str_from_stream(test, stream);
  280. ASSERT_TEST_EXPECT_NCONTAIN(test, str, "<");
  281. ASSERT_TEST_EXPECT_NCONTAIN(test, str, ">");
  282. }
  283. static void kunit_test_mem_assert_format(struct kunit *test)
  284. {
  285. struct string_stream *stream;
  286. struct string_stream *expected_stream;
  287. struct kunit_assert assert = {};
  288. static const struct kunit_binary_assert_text text = {
  289. .left_text = "hex_testbuf1",
  290. .operation = "==",
  291. .right_text = "hex_testbuf2",
  292. };
  293. struct kunit_mem_assert mem_assert = {
  294. .assert = assert,
  295. .text = &text,
  296. .left_value = NULL,
  297. .right_value = hex_testbuf2,
  298. .size = sizeof(hex_testbuf1),
  299. };
  300. expected_stream = kunit_alloc_string_stream(test, GFP_KERNEL);
  301. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, expected_stream);
  302. stream = kunit_alloc_string_stream(test, GFP_KERNEL);
  303. KUNIT_ASSERT_NOT_ERR_OR_NULL(test, stream);
  304. /* The left value is NULL */
  305. validate_assert(kunit_mem_assert_format, test, &mem_assert.assert,
  306. stream, 2, "hex_testbuf1", "is not null");
  307. /* The right value is NULL, the left value is not NULL */
  308. mem_assert.left_value = hex_testbuf1;
  309. mem_assert.right_value = NULL;
  310. validate_assert(kunit_mem_assert_format, test, &mem_assert.assert,
  311. stream, 2, "hex_testbuf2", "is not null");
  312. /* Both arguments are not null */
  313. mem_assert.left_value = hex_testbuf1;
  314. mem_assert.right_value = hex_testbuf2;
  315. validate_assert(kunit_mem_assert_format, test, &mem_assert.assert,
  316. stream, 3, "hex_testbuf1", "hex_testbuf2", "==");
  317. }
  318. static struct kunit_case assert_test_cases[] = {
  319. KUNIT_CASE(kunit_test_is_literal),
  320. KUNIT_CASE(kunit_test_is_str_literal),
  321. KUNIT_CASE(kunit_test_assert_prologue),
  322. KUNIT_CASE(kunit_test_assert_print_msg),
  323. KUNIT_CASE(kunit_test_unary_assert_format),
  324. KUNIT_CASE(kunit_test_ptr_not_err_assert_format),
  325. KUNIT_CASE(kunit_test_binary_assert_format),
  326. KUNIT_CASE(kunit_test_binary_ptr_assert_format),
  327. KUNIT_CASE(kunit_test_binary_str_assert_format),
  328. KUNIT_CASE(kunit_test_assert_hexdump),
  329. KUNIT_CASE(kunit_test_mem_assert_format),
  330. {}
  331. };
  332. static struct kunit_suite assert_test_suite = {
  333. .name = "kunit-assert",
  334. .test_cases = assert_test_cases,
  335. };
  336. kunit_test_suites(&assert_test_suite);