t-varbuf.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. /*
  2. * libdpkg - Debian packaging suite library routines
  3. * t-verbuf.c - test varbuf implementation
  4. *
  5. * Copyright © 2009 Guillem Jover <guillem@debian.org>
  6. *
  7. * This is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as
  9. * published by the Free Software Foundation; either version 2,
  10. * or (at your option) any later version.
  11. *
  12. * This is distributed in the hope that it will be useful, but
  13. * WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  19. */
  20. #include <dpkg/test.h>
  21. #include <dpkg/dpkg-db.h>
  22. static void
  23. test_varbuf_init(void)
  24. {
  25. struct varbuf vb;
  26. varbufinit(&vb, 0);
  27. test_pass(vb.used == 0);
  28. test_pass(vb.size == 0);
  29. test_pass(vb.buf == NULL);
  30. varbuffree(&vb);
  31. test_pass(vb.used == 0);
  32. test_pass(vb.size == 0);
  33. test_pass(vb.buf == NULL);
  34. }
  35. static void
  36. test_varbuf_prealloc(void)
  37. {
  38. struct varbuf vb;
  39. varbufinit(&vb, 10);
  40. test_pass(vb.used == 0);
  41. test_pass(vb.size >= 10);
  42. test_pass(vb.buf != NULL);
  43. varbuffree(&vb);
  44. test_pass(vb.used == 0);
  45. test_pass(vb.size == 0);
  46. test_pass(vb.buf == NULL);
  47. }
  48. static void
  49. test_varbuf_grow(void)
  50. {
  51. struct varbuf vb;
  52. size_t old_size;
  53. int i;
  54. varbufinit(&vb, 10);
  55. /* Test that we grow when needed. */
  56. varbuf_grow(&vb, 100);
  57. test_pass(vb.used == 0);
  58. test_pass(vb.size >= 100);
  59. old_size = vb.size;
  60. /* Test that we are not leaking. */
  61. for (i = 0; i < 10; i++) {
  62. varbuf_grow(&vb, 100);
  63. test_pass(vb.used == 0);
  64. test_pass(vb.size >= 100);
  65. test_pass(vb.size == old_size);
  66. }
  67. /* Test that we grow when needed, with used space. */
  68. vb.used = 10;
  69. varbuf_grow(&vb, 100);
  70. test_pass(vb.used == 10);
  71. test_pass(vb.size >= 110);
  72. varbuffree(&vb);
  73. }
  74. static void
  75. test_varbuf_addbuf(void)
  76. {
  77. struct varbuf vb;
  78. varbufinit(&vb, 5);
  79. varbufaddbuf(&vb, "1234567890", 10);
  80. test_pass(vb.used == 10);
  81. test_pass(vb.size >= vb.used);
  82. test_mem(vb.buf, ==, "1234567890", 10);
  83. varbufaddbuf(&vb, "abcde", 5);
  84. test_pass(vb.used == 15);
  85. test_pass(vb.size >= vb.used);
  86. test_mem(vb.buf, ==, "1234567890abcde", 15);
  87. varbuffree(&vb);
  88. }
  89. static void
  90. test_varbuf_addc(void)
  91. {
  92. struct varbuf vb;
  93. varbufinit(&vb, 1);
  94. varbufaddc(&vb, 'a');
  95. test_pass(vb.used == 1);
  96. test_pass(vb.size >= vb.used);
  97. test_pass(vb.buf[0] == 'a');
  98. varbufaddc(&vb, 'b');
  99. test_pass(vb.used == 2);
  100. test_pass(vb.size >= vb.used);
  101. test_mem(vb.buf, ==, "ab", 2);
  102. varbufaddc(&vb, 'c');
  103. test_pass(vb.used == 3);
  104. test_pass(vb.size >= vb.used);
  105. test_mem(vb.buf, ==, "abc", 3);
  106. varbufaddc(&vb, 'd');
  107. test_pass(vb.used == 4);
  108. test_pass(vb.size >= vb.used);
  109. test_mem(vb.buf, ==, "abcd", 4);
  110. varbuffree(&vb);
  111. }
  112. static void
  113. test_varbuf_dupc(void)
  114. {
  115. struct varbuf vb;
  116. varbufinit(&vb, 5);
  117. varbufdupc(&vb, 'z', 10);
  118. test_pass(vb.used == 10);
  119. test_pass(vb.size >= vb.used);
  120. test_mem(vb.buf, ==, "zzzzzzzzzz", 10);
  121. varbufdupc(&vb, 'y', 5);
  122. test_pass(vb.used == 15);
  123. test_pass(vb.size >= vb.used);
  124. test_mem(vb.buf, ==, "zzzzzzzzzzyyyyy", 15);
  125. varbuffree(&vb);
  126. }
  127. static void
  128. test_varbuf_substc(void)
  129. {
  130. struct varbuf vb;
  131. varbufinit(&vb, 5);
  132. varbufaddbuf(&vb, "1234a5678a9012a", 15);
  133. varbufsubstc(&vb, 'a', 'z');
  134. test_pass(vb.used == 15);
  135. test_pass(vb.size >= vb.used);
  136. test_mem(vb.buf, ==, "1234z5678z9012z", 15);
  137. varbuffree(&vb);
  138. }
  139. static void
  140. test_varbuf_printf(void)
  141. {
  142. struct varbuf vb;
  143. varbufinit(&vb, 5);
  144. /* Test normal format printing. */
  145. varbufprintf(&vb, "format %s number %d", "string", 10);
  146. varbufaddc(&vb, '\0');
  147. test_pass(vb.used == sizeof("format string number 10"));
  148. test_pass(vb.size >= vb.used);
  149. test_str(vb.buf, ==, "format string number 10");
  150. varbufreset(&vb);
  151. /* Test concatenated format printing. */
  152. varbufprintf(&vb, "format %s number %d", "string", 10);
  153. varbufprintf(&vb, " extra %s", "string");
  154. varbufaddc(&vb, '\0');
  155. test_pass(vb.used == sizeof("format string number 10 extra string"));
  156. test_pass(vb.size >= vb.used);
  157. test_str(vb.buf, ==, "format string number 10 extra string");
  158. varbuffree(&vb);
  159. }
  160. static void
  161. test_varbuf_reset(void)
  162. {
  163. struct varbuf vb;
  164. varbufinit(&vb, 10);
  165. varbufaddbuf(&vb, "1234567890", 10);
  166. varbufreset(&vb);
  167. test_pass(vb.used == 0);
  168. test_pass(vb.size >= vb.used);
  169. varbufaddbuf(&vb, "abcdefghijklmno", 15);
  170. test_pass(vb.used == 15);
  171. test_pass(vb.size >= vb.used);
  172. test_mem(vb.buf, ==, "abcdefghijklmno", 15);
  173. varbuffree(&vb);
  174. }
  175. static void
  176. test(void)
  177. {
  178. test_varbuf_init();
  179. test_varbuf_prealloc();
  180. test_varbuf_grow();
  181. test_varbuf_addbuf();
  182. test_varbuf_addc();
  183. test_varbuf_dupc();
  184. test_varbuf_substc();
  185. test_varbuf_printf();
  186. test_varbuf_reset();
  187. /* FIXME: Complete. */
  188. }