vector_io.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. /*
  2. * Monolithium Unit Tests
  3. * vector_io.c
  4. *
  5. * Copyright (C) 2018 Aleksandar Andrejevic <theflash@sdf.lonestar.org>
  6. *
  7. * This program is free software: you can redistribute it and/or modify
  8. * it under the terms of the GNU Affero General Public License as
  9. * published by the Free Software Foundation, either version 3 of the
  10. * License, or (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU Affero General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Affero General Public License
  18. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  19. */
  20. #include <check.h>
  21. #include <stdlib.h>
  22. #include <sdk/vector.h>
  23. static void setup(void)
  24. {
  25. }
  26. static void teardown(void)
  27. {
  28. }
  29. START_TEST(test_vector_io_simple_scatter)
  30. {
  31. const char text[] = "The destiny of this string is to break apart into pieces.";
  32. const char correct_piece1[] = "The destiny";
  33. const char correct_piece2[] = " of this string";
  34. const char correct_piece3[] = " is to break apart into pieces.";
  35. char piece1[sizeof(correct_piece1)] = "";
  36. char piece2[sizeof(correct_piece2)] = "";
  37. char piece3[sizeof(correct_piece3)] = "";
  38. vector_buffer_t buffers[] = {
  39. { piece1, sizeof(piece1) - 1 },
  40. { piece2, sizeof(piece2) - 1 },
  41. { piece3, sizeof(piece3) - 1 },
  42. };
  43. vector_t vector;
  44. vector_init(&vector, buffers, sizeof(buffers) / sizeof(*buffers));
  45. vector_write_scatter(&vector, text, sizeof(text) - 1);
  46. vector_clear(&vector);
  47. ck_assert_str_eq(piece1, correct_piece1);
  48. ck_assert_str_eq(piece2, correct_piece2);
  49. ck_assert_str_eq(piece3, correct_piece3);
  50. }
  51. END_TEST
  52. START_TEST(test_vector_io_simple_gather)
  53. {
  54. char piece1[] = "And then ";
  55. char piece2[] = "come back together,";
  56. char piece3[] = " like nothing ever happened.";
  57. const char correct_text[] = "And then come back together, like nothing ever happened.";
  58. char text[sizeof(correct_text)] = "";
  59. vector_buffer_t buffers[] = {
  60. { piece1, sizeof(piece1) - 1 },
  61. { piece2, sizeof(piece2) - 1 },
  62. { piece3, sizeof(piece3) - 1 },
  63. };
  64. vector_t vector;
  65. vector_init(&vector, buffers, sizeof(buffers) / sizeof(*buffers));
  66. vector_read_gather(&vector, text, sizeof(text) - 1);
  67. vector_clear(&vector);
  68. ck_assert_str_eq(text, correct_text);
  69. }
  70. END_TEST
  71. START_TEST(test_vector_io_multi_write_scatter)
  72. {
  73. const char text[] = "The destiny of this string is to break apart into pieces.";
  74. const char correct_piece1[] = "The destiny";
  75. const char correct_piece2[] = " of this string";
  76. const char correct_piece3[] = " is to break apart into pieces.";
  77. char piece1[sizeof(correct_piece1)] = "";
  78. char piece2[sizeof(correct_piece2)] = "";
  79. char piece3[sizeof(correct_piece3)] = "";
  80. vector_buffer_t buffers[] = {
  81. { piece1, sizeof(piece1) - 1 },
  82. { piece2, sizeof(piece2) - 1 },
  83. { piece3, sizeof(piece3) - 1 },
  84. };
  85. vector_t vector;
  86. vector_init(&vector, buffers, sizeof(buffers) / sizeof(*buffers));
  87. int i;
  88. for (i = 0; i < sizeof(text) - 1; i++) vector_write_scatter(&vector, &text[i], 1);
  89. vector_clear(&vector);
  90. ck_assert_str_eq(piece1, correct_piece1);
  91. ck_assert_str_eq(piece2, correct_piece2);
  92. ck_assert_str_eq(piece3, correct_piece3);
  93. }
  94. END_TEST
  95. START_TEST(test_vector_io_multi_read_gather)
  96. {
  97. char piece1[] = "And then ";
  98. char piece2[] = "come back together,";
  99. char piece3[] = " like nothing ever happened.";
  100. const char correct_text[] = "And then come back together, like nothing ever happened.";
  101. char text[sizeof(correct_text)] = "";
  102. vector_buffer_t buffers[] = {
  103. { piece1, sizeof(piece1) - 1 },
  104. { piece2, sizeof(piece2) - 1 },
  105. { piece3, sizeof(piece3) - 1 },
  106. };
  107. vector_t vector;
  108. vector_init(&vector, buffers, sizeof(buffers) / sizeof(*buffers));
  109. int i;
  110. for (i = 0; i < sizeof(text) - 1; i++) vector_read_gather(&vector, &text[i], 1);
  111. vector_clear(&vector);
  112. ck_assert_str_eq(text, correct_text);
  113. }
  114. END_TEST
  115. START_TEST(test_vector_io_dynamic_scatter)
  116. {
  117. const char text[] = "Scattering strings in an unnecessarily complicated way is fun.";
  118. const char correct_piece1[] = "Scattering strings is fun.";
  119. const char correct_piece2[] = "in a complicated way ";
  120. const char correct_piece3[] = "n unnecessarily";
  121. char piece1[sizeof(correct_piece1)] = "";
  122. char piece2[sizeof(correct_piece2)] = "";
  123. char piece3[sizeof(correct_piece3)] = "";
  124. vector_buffer_t buffers[] = {
  125. { piece1, sizeof(piece1) - 1 },
  126. { piece2, sizeof(piece2) - 1 },
  127. { piece3, sizeof(piece3) - 1 },
  128. };
  129. vector_t vector;
  130. vector_init(&vector, NULL, 0);
  131. vector_insert_buffer(&vector, 0, &buffers[0]);
  132. vector_insert_buffer(&vector, 19, &buffers[1]);
  133. vector_insert_buffer(&vector, 23, &buffers[2]);
  134. vector_write_scatter(&vector, text, sizeof(text) - 1);
  135. vector_clear(&vector);
  136. ck_assert_str_eq(piece1, correct_piece1);
  137. ck_assert_str_eq(piece2, correct_piece2);
  138. ck_assert_str_eq(piece3, correct_piece3);
  139. }
  140. END_TEST
  141. START_TEST(test_vector_io_dynamic_gather)
  142. {
  143. char piece1[] = "Building is fun.";
  144. char piece2[] = "a string in a non-linear way ";
  145. char piece3[] = "from pieces ";
  146. const char correct_text[] = "Building a string from pieces in a non-linear way is fun.";
  147. char text[sizeof(correct_text)] = "";
  148. vector_buffer_t buffers[] = {
  149. { piece1, sizeof(piece1) - 1 },
  150. { piece2, sizeof(piece2) - 1 },
  151. { piece3, sizeof(piece3) - 1 },
  152. };
  153. vector_t vector;
  154. vector_init(&vector, NULL, 0);
  155. vector_insert_buffer(&vector, 0, &buffers[0]);
  156. vector_insert_buffer(&vector, 9, &buffers[1]);
  157. vector_insert_buffer(&vector, 18, &buffers[2]);
  158. vector_read_gather(&vector, text, sizeof(text) - 1);
  159. vector_clear(&vector);
  160. ck_assert_str_eq(text, correct_text);
  161. }
  162. END_TEST
  163. TCase *tcase_vector_io_simple_create(void)
  164. {
  165. TCase *tc = tcase_create("Simple");
  166. tcase_add_checked_fixture(tc, setup, teardown);
  167. tcase_add_test(tc, test_vector_io_simple_scatter);
  168. tcase_add_test(tc, test_vector_io_simple_gather);
  169. return tc;
  170. }
  171. TCase *tcase_vector_io_multi_create(void)
  172. {
  173. TCase *tc = tcase_create("Multiple Reads/Writes");
  174. tcase_add_checked_fixture(tc, setup, teardown);
  175. tcase_add_test(tc, test_vector_io_multi_write_scatter);
  176. tcase_add_test(tc, test_vector_io_multi_read_gather);
  177. return tc;
  178. }
  179. TCase *tcase_vector_io_dynamic_create(void)
  180. {
  181. TCase *tc = tcase_create("Dynamic");
  182. tcase_add_checked_fixture(tc, setup, teardown);
  183. tcase_add_test(tc, test_vector_io_dynamic_scatter);
  184. tcase_add_test(tc, test_vector_io_dynamic_gather);
  185. return tc;
  186. }
  187. Suite *suite_vector_io_create(void)
  188. {
  189. Suite *suite = suite_create("Vectored I/O");
  190. suite_add_tcase(suite, tcase_vector_io_simple_create());
  191. suite_add_tcase(suite, tcase_vector_io_multi_create());
  192. suite_add_tcase(suite, tcase_vector_io_dynamic_create());
  193. return suite;
  194. }