run-testsize.c 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #include <ccan/alloc/alloc.h>
  2. #include <ccan/tap/tap.h>
  3. #include <ccan/alloc/alloc.c>
  4. #include <ccan/alloc/bitops.c>
  5. #include <ccan/alloc/tiny.c>
  6. #include <stdlib.h>
  7. #include <stdbool.h>
  8. #include <err.h>
  9. static void invert_bytes(unsigned char *p, unsigned long size)
  10. {
  11. unsigned int i;
  12. for (i = 0; i < size; i++)
  13. p[i] ^= 0xFF;
  14. }
  15. static bool sizes_ok(void *mem, unsigned long poolsize, void *p[], unsigned num)
  16. {
  17. unsigned int i;
  18. for (i = 0; i < num; i++)
  19. if (p[i] && alloc_size(mem, poolsize, p[i]) < i)
  20. return false;
  21. return true;
  22. }
  23. static void test_pool(unsigned long pool_size)
  24. {
  25. unsigned int i, num;
  26. void *mem;
  27. void **p;
  28. bool flip = false;
  29. p = calloc(pool_size, sizeof(void *));
  30. mem = malloc(pool_size);
  31. alloc_init(mem, pool_size);
  32. /* Check that alloc_size() gives reasonable answers. */
  33. for (i = 0; i < pool_size; i = i * 3 / 2 + 1) {
  34. p[i] = alloc_get(mem, pool_size, i, 1);
  35. if (!p[i])
  36. break;
  37. invert_bytes(p[i], alloc_size(mem, pool_size, p[i]));
  38. }
  39. ok1(i < pool_size);
  40. num = i;
  41. ok1(alloc_check(mem, pool_size));
  42. ok1(sizes_ok(mem, pool_size, p, num));
  43. /* Free every second one. */
  44. for (i = 0; i < num; i = i * 3 / 2 + 1) {
  45. flip = !flip;
  46. if (flip) {
  47. invert_bytes(p[i], alloc_size(mem,pool_size,p[i]));
  48. continue;
  49. }
  50. alloc_free(mem, pool_size, p[i]);
  51. p[i] = NULL;
  52. }
  53. ok1(alloc_check(mem, pool_size));
  54. ok1(sizes_ok(mem, pool_size, p, num));
  55. free(p);
  56. free(mem);
  57. }
  58. int main(int argc, char *argv[])
  59. {
  60. plan_tests(10);
  61. /* Large test. */
  62. test_pool(MIN_USEFUL_SIZE * 2);
  63. /* Small test. */
  64. test_pool(MIN_USEFUL_SIZE / 2);
  65. return exit_status();
  66. }