test_buffers.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. /* Copyright (c) 2001-2004, Roger Dingledine.
  2. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
  3. * Copyright (c) 2007-2013, The Tor Project, Inc. */
  4. /* See LICENSE for licensing information */
  5. #define BUFFERS_PRIVATE
  6. #include "or.h"
  7. #include "buffers.h"
  8. #include "test.h"
  9. /** Run unit tests for buffers.c */
  10. static void
  11. test_buffers_basic(void *arg)
  12. {
  13. char str[256];
  14. char str2[256];
  15. buf_t *buf = NULL, *buf2 = NULL;
  16. const char *cp;
  17. int j;
  18. size_t r;
  19. (void) arg;
  20. /****
  21. * buf_new
  22. ****/
  23. if (!(buf = buf_new()))
  24. test_fail();
  25. //test_eq(buf_capacity(buf), 4096);
  26. test_eq(buf_datalen(buf), 0);
  27. /****
  28. * General pointer frobbing
  29. */
  30. for (j=0;j<256;++j) {
  31. str[j] = (char)j;
  32. }
  33. write_to_buf(str, 256, buf);
  34. write_to_buf(str, 256, buf);
  35. test_eq(buf_datalen(buf), 512);
  36. fetch_from_buf(str2, 200, buf);
  37. test_memeq(str, str2, 200);
  38. test_eq(buf_datalen(buf), 312);
  39. memset(str2, 0, sizeof(str2));
  40. fetch_from_buf(str2, 256, buf);
  41. test_memeq(str+200, str2, 56);
  42. test_memeq(str, str2+56, 200);
  43. test_eq(buf_datalen(buf), 56);
  44. memset(str2, 0, sizeof(str2));
  45. /* Okay, now we should be 512 bytes into the 4096-byte buffer. If we add
  46. * another 3584 bytes, we hit the end. */
  47. for (j=0;j<15;++j) {
  48. write_to_buf(str, 256, buf);
  49. }
  50. assert_buf_ok(buf);
  51. test_eq(buf_datalen(buf), 3896);
  52. fetch_from_buf(str2, 56, buf);
  53. test_eq(buf_datalen(buf), 3840);
  54. test_memeq(str+200, str2, 56);
  55. for (j=0;j<15;++j) {
  56. memset(str2, 0, sizeof(str2));
  57. fetch_from_buf(str2, 256, buf);
  58. test_memeq(str, str2, 256);
  59. }
  60. test_eq(buf_datalen(buf), 0);
  61. buf_free(buf);
  62. buf = NULL;
  63. /* Okay, now make sure growing can work. */
  64. buf = buf_new_with_capacity(16);
  65. //test_eq(buf_capacity(buf), 16);
  66. write_to_buf(str+1, 255, buf);
  67. //test_eq(buf_capacity(buf), 256);
  68. fetch_from_buf(str2, 254, buf);
  69. test_memeq(str+1, str2, 254);
  70. //test_eq(buf_capacity(buf), 256);
  71. assert_buf_ok(buf);
  72. write_to_buf(str, 32, buf);
  73. //test_eq(buf_capacity(buf), 256);
  74. assert_buf_ok(buf);
  75. write_to_buf(str, 256, buf);
  76. assert_buf_ok(buf);
  77. //test_eq(buf_capacity(buf), 512);
  78. test_eq(buf_datalen(buf), 33+256);
  79. fetch_from_buf(str2, 33, buf);
  80. test_eq(*str2, str[255]);
  81. test_memeq(str2+1, str, 32);
  82. //test_eq(buf_capacity(buf), 512);
  83. test_eq(buf_datalen(buf), 256);
  84. fetch_from_buf(str2, 256, buf);
  85. test_memeq(str, str2, 256);
  86. /* now try shrinking: case 1. */
  87. buf_free(buf);
  88. buf = buf_new_with_capacity(33668);
  89. for (j=0;j<67;++j) {
  90. write_to_buf(str,255, buf);
  91. }
  92. //test_eq(buf_capacity(buf), 33668);
  93. test_eq(buf_datalen(buf), 17085);
  94. for (j=0; j < 40; ++j) {
  95. fetch_from_buf(str2, 255,buf);
  96. test_memeq(str2, str, 255);
  97. }
  98. /* now try shrinking: case 2. */
  99. buf_free(buf);
  100. buf = buf_new_with_capacity(33668);
  101. for (j=0;j<67;++j) {
  102. write_to_buf(str,255, buf);
  103. }
  104. for (j=0; j < 20; ++j) {
  105. fetch_from_buf(str2, 255,buf);
  106. test_memeq(str2, str, 255);
  107. }
  108. for (j=0;j<80;++j) {
  109. write_to_buf(str,255, buf);
  110. }
  111. //test_eq(buf_capacity(buf),33668);
  112. for (j=0; j < 120; ++j) {
  113. fetch_from_buf(str2, 255,buf);
  114. test_memeq(str2, str, 255);
  115. }
  116. /* Move from buf to buf. */
  117. buf_free(buf);
  118. buf = buf_new_with_capacity(4096);
  119. buf2 = buf_new_with_capacity(4096);
  120. for (j=0;j<100;++j)
  121. write_to_buf(str, 255, buf);
  122. test_eq(buf_datalen(buf), 25500);
  123. for (j=0;j<100;++j) {
  124. r = 10;
  125. move_buf_to_buf(buf2, buf, &r);
  126. test_eq(r, 0);
  127. }
  128. test_eq(buf_datalen(buf), 24500);
  129. test_eq(buf_datalen(buf2), 1000);
  130. for (j=0;j<3;++j) {
  131. fetch_from_buf(str2, 255, buf2);
  132. test_memeq(str2, str, 255);
  133. }
  134. r = 8192; /*big move*/
  135. move_buf_to_buf(buf2, buf, &r);
  136. test_eq(r, 0);
  137. r = 30000; /* incomplete move */
  138. move_buf_to_buf(buf2, buf, &r);
  139. test_eq(r, 13692);
  140. for (j=0;j<97;++j) {
  141. fetch_from_buf(str2, 255, buf2);
  142. test_memeq(str2, str, 255);
  143. }
  144. buf_free(buf);
  145. buf_free(buf2);
  146. buf = buf2 = NULL;
  147. buf = buf_new_with_capacity(5);
  148. cp = "Testing. This is a moderately long Testing string.";
  149. for (j = 0; cp[j]; j++)
  150. write_to_buf(cp+j, 1, buf);
  151. test_eq(0, buf_find_string_offset(buf, "Testing", 7));
  152. test_eq(1, buf_find_string_offset(buf, "esting", 6));
  153. test_eq(1, buf_find_string_offset(buf, "est", 3));
  154. test_eq(39, buf_find_string_offset(buf, "ing str", 7));
  155. test_eq(35, buf_find_string_offset(buf, "Testing str", 11));
  156. test_eq(32, buf_find_string_offset(buf, "ng ", 3));
  157. test_eq(43, buf_find_string_offset(buf, "string.", 7));
  158. test_eq(-1, buf_find_string_offset(buf, "shrdlu", 6));
  159. test_eq(-1, buf_find_string_offset(buf, "Testing thing", 13));
  160. test_eq(-1, buf_find_string_offset(buf, "ngx", 3));
  161. buf_free(buf);
  162. buf = NULL;
  163. /* Try adding a string too long for any freelist. */
  164. {
  165. char *cp = tor_malloc_zero(65536);
  166. buf = buf_new();
  167. write_to_buf(cp, 65536, buf);
  168. tor_free(cp);
  169. tt_int_op(buf_datalen(buf), ==, 65536);
  170. buf_free(buf);
  171. buf = NULL;
  172. }
  173. done:
  174. if (buf)
  175. buf_free(buf);
  176. if (buf2)
  177. buf_free(buf2);
  178. }
  179. static void
  180. test_buffer_copy(void *arg)
  181. {
  182. generic_buffer_t *buf=NULL, *buf2=NULL;
  183. const char *s;
  184. size_t len;
  185. char b[256];
  186. int i;
  187. (void)arg;
  188. buf = generic_buffer_new();
  189. tt_assert(buf);
  190. /* Copy an empty buffer. */
  191. tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
  192. tt_assert(buf2);
  193. tt_int_op(0, ==, generic_buffer_len(buf2));
  194. /* Now try with a short buffer. */
  195. s = "And now comes an act of enormous enormance!";
  196. len = strlen(s);
  197. generic_buffer_add(buf, s, len);
  198. tt_int_op(len, ==, generic_buffer_len(buf));
  199. /* Add junk to buf2 so we can test replacing.*/
  200. generic_buffer_add(buf2, "BLARG", 5);
  201. tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
  202. tt_int_op(len, ==, generic_buffer_len(buf2));
  203. generic_buffer_get(buf2, b, len);
  204. test_mem_op(b, ==, s, len);
  205. /* Now free buf2 and retry so we can test allocating */
  206. generic_buffer_free(buf2);
  207. buf2 = NULL;
  208. tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
  209. tt_int_op(len, ==, generic_buffer_len(buf2));
  210. generic_buffer_get(buf2, b, len);
  211. test_mem_op(b, ==, s, len);
  212. /* Clear buf for next test */
  213. generic_buffer_get(buf, b, len);
  214. tt_int_op(generic_buffer_len(buf),==,0);
  215. /* Okay, now let's try a bigger buffer. */
  216. s = "Quis autem vel eum iure reprehenderit qui in ea voluptate velit "
  217. "esse quam nihil molestiae consequatur, vel illum qui dolorem eum "
  218. "fugiat quo voluptas nulla pariatur?";
  219. len = strlen(s);
  220. for (i = 0; i < 256; ++i) {
  221. b[0]=i;
  222. generic_buffer_add(buf, b, 1);
  223. generic_buffer_add(buf, s, len);
  224. }
  225. tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
  226. tt_int_op(generic_buffer_len(buf2), ==, generic_buffer_len(buf));
  227. for (i = 0; i < 256; ++i) {
  228. generic_buffer_get(buf2, b, len+1);
  229. tt_int_op((unsigned char)b[0],==,i);
  230. test_mem_op(b+1, ==, s, len);
  231. }
  232. done:
  233. if (buf)
  234. generic_buffer_free(buf);
  235. if (buf2)
  236. generic_buffer_free(buf2);
  237. }
  238. struct testcase_t buffer_tests[] = {
  239. { "basic", test_buffers_basic, 0, NULL, NULL },
  240. { "copy", test_buffer_copy, 0, NULL, NULL },
  241. END_OF_TESTCASES
  242. };