test_container_multipeermap.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /*
  2. This file is part of GNUnet.
  3. Copyright (C) 2008, 2013 GNUnet e.V.
  4. GNUnet is free software: you can redistribute it and/or modify it
  5. under the terms of the GNU Affero General Public License as published
  6. by the Free Software Foundation, either version 3 of the License,
  7. or (at your option) any later version.
  8. GNUnet is distributed in the hope that it will be useful, but
  9. WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. Affero General Public License for more details.
  12. You should have received a copy of the GNU Affero General Public License
  13. along with this program. If not, see <http://www.gnu.org/licenses/>.
  14. SPDX-License-Identifier: AGPL3.0-or-later
  15. */
  16. /**
  17. * @file util/test_container_multipeermap.c
  18. * @brief Test for container_multipeermap.c
  19. * @author Christian Grothoff
  20. */
  21. #include "platform.h"
  22. #include "gnunet_util_lib.h"
  23. #define ABORT() { fprintf (stderr, "Error at %s:%d\n", __FILE__, __LINE__); \
  24. if (NULL != m) GNUNET_CONTAINER_multipeermap_destroy (m); \
  25. if (NULL != \
  26. iter) \
  27. GNUNET_CONTAINER_multipeermap_iterator_destroy (iter); \
  28. return 1; }
  29. #define CHECK(c) { if (! (c)) ABORT (); }
  30. static int
  31. testMap (int i)
  32. {
  33. struct GNUNET_CONTAINER_MultiPeerMap *m;
  34. struct GNUNET_PeerIdentity k1;
  35. struct GNUNET_PeerIdentity k2;
  36. struct GNUNET_CONTAINER_MultiPeerMapIterator *iter = NULL;
  37. struct GNUNET_PeerIdentity key_ret;
  38. const char *ret;
  39. int j;
  40. CHECK (NULL != (m = GNUNET_CONTAINER_multipeermap_create (i, GNUNET_NO)));
  41. memset (&k1, 0, sizeof(k1));
  42. memset (&k2, 1, sizeof(k2));
  43. CHECK (GNUNET_NO == GNUNET_CONTAINER_multipeermap_contains (m, &k1));
  44. CHECK (GNUNET_NO == GNUNET_CONTAINER_multipeermap_contains (m, &k2));
  45. CHECK (GNUNET_NO == GNUNET_CONTAINER_multipeermap_remove (m, &k1, NULL));
  46. CHECK (GNUNET_NO == GNUNET_CONTAINER_multipeermap_remove (m, &k2, NULL));
  47. CHECK (NULL == GNUNET_CONTAINER_multipeermap_get (m, &k1));
  48. CHECK (NULL == GNUNET_CONTAINER_multipeermap_get (m, &k2));
  49. CHECK (0 == GNUNET_CONTAINER_multipeermap_remove_all (m, &k1));
  50. CHECK (0 == GNUNET_CONTAINER_multipeermap_size (m));
  51. CHECK (0 == GNUNET_CONTAINER_multipeermap_iterate (m, NULL, NULL));
  52. CHECK (0 == GNUNET_CONTAINER_multipeermap_get_multiple (m, &k1, NULL, NULL));
  53. CHECK (GNUNET_OK ==
  54. GNUNET_CONTAINER_multipeermap_put (m, &k1, "v1",
  55. GNUNET_CONTAINER_MULTIHASHMAPOPTION_REPLACE));
  56. CHECK (1 == GNUNET_CONTAINER_multipeermap_size (m));
  57. ret = GNUNET_CONTAINER_multipeermap_get (m, &k1);
  58. GNUNET_assert (ret != NULL);
  59. CHECK (0 == strcmp ("v1", ret));
  60. CHECK (GNUNET_NO ==
  61. GNUNET_CONTAINER_multipeermap_put (m, &k1, "v1",
  62. GNUNET_CONTAINER_MULTIHASHMAPOPTION_REPLACE));
  63. CHECK (1 == GNUNET_CONTAINER_multipeermap_size (m));
  64. CHECK (GNUNET_OK ==
  65. GNUNET_CONTAINER_multipeermap_put (m, &k1, "v2",
  66. GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
  67. CHECK (GNUNET_OK ==
  68. GNUNET_CONTAINER_multipeermap_put (m, &k1, "v3",
  69. GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
  70. CHECK (3 == GNUNET_CONTAINER_multipeermap_size (m));
  71. CHECK (GNUNET_OK == GNUNET_CONTAINER_multipeermap_remove (m, &k1, "v3"));
  72. CHECK (2 == GNUNET_CONTAINER_multipeermap_size (m));
  73. CHECK (GNUNET_YES == GNUNET_CONTAINER_multipeermap_contains (m, &k1));
  74. CHECK (GNUNET_NO == GNUNET_CONTAINER_multipeermap_contains (m, &k2));
  75. CHECK (2 == GNUNET_CONTAINER_multipeermap_get_multiple (m, &k1, NULL, NULL));
  76. CHECK (0 == GNUNET_CONTAINER_multipeermap_get_multiple (m, &k2, NULL, NULL));
  77. CHECK (2 == GNUNET_CONTAINER_multipeermap_iterate (m, NULL, NULL));
  78. iter = GNUNET_CONTAINER_multipeermap_iterator_create (m);
  79. CHECK (GNUNET_YES == GNUNET_CONTAINER_multipeermap_iterator_next (iter,
  80. &key_ret,
  81. (const
  82. void **) &
  83. ret));
  84. CHECK (0 == memcmp (&key_ret, &k1, sizeof(key_ret)));
  85. CHECK (GNUNET_YES == GNUNET_CONTAINER_multipeermap_iterator_next (iter,
  86. &key_ret,
  87. (const
  88. void **) &
  89. ret));
  90. CHECK (0 == memcmp (&key_ret, &k1, sizeof(key_ret)));
  91. CHECK (GNUNET_NO == GNUNET_CONTAINER_multipeermap_iterator_next (iter, NULL,
  92. NULL));
  93. GNUNET_free (iter);
  94. CHECK (2 == GNUNET_CONTAINER_multipeermap_remove_all (m, &k1));
  95. for (j = 0; j < 1024; j++)
  96. CHECK (GNUNET_OK ==
  97. GNUNET_CONTAINER_multipeermap_put (m, &k1, "v2",
  98. GNUNET_CONTAINER_MULTIHASHMAPOPTION_MULTIPLE));
  99. iter = GNUNET_CONTAINER_multipeermap_iterator_create (m);
  100. for (j = 0; j < GNUNET_CONTAINER_multipeermap_size (m); j++)
  101. CHECK (GNUNET_YES == GNUNET_CONTAINER_multipeermap_iterator_next (iter,
  102. NULL,
  103. NULL));
  104. CHECK (GNUNET_NO == GNUNET_CONTAINER_multipeermap_iterator_next (iter, NULL,
  105. NULL));
  106. GNUNET_CONTAINER_multipeermap_iterator_destroy (iter);
  107. GNUNET_CONTAINER_multipeermap_destroy (m);
  108. return 0;
  109. }
  110. int
  111. main (int argc, char *argv[])
  112. {
  113. int failureCount = 0;
  114. int i;
  115. GNUNET_log_setup ("test-container-multipeermap", "WARNING", NULL);
  116. for (i = 1; i < 255; i++)
  117. failureCount += testMap (i);
  118. if (failureCount != 0)
  119. return 1;
  120. return 0;
  121. }
  122. /* end of test_container_multipeermap.c */