bh_vector_test.cc 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. /*
  2. * Copyright (C) 2019 Intel Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #include "test_helper.h"
  6. #include "gtest/gtest.h"
  7. #include "bh_platform.h"
  8. #include <future>
  9. class bh_vector_test_suite : public testing::Test
  10. {
  11. protected:
  12. // You should make the members protected s.t. they can be
  13. // accessed from sub-classes.
  14. // virtual void SetUp() will be called before each test is run. You
  15. // should define it if you need to initialize the variables.
  16. // Otherwise, this can be skipped.
  17. virtual void SetUp() {}
  18. // virtual void TearDown() will be called after each test is run.
  19. // You should define it if there is cleanup work to do. Otherwise,
  20. // you don't have to provide it.
  21. //
  22. virtual void TearDown() {}
  23. public:
  24. WAMRRuntimeRAII<512 * 1024> runtime;
  25. };
  26. static inline void *
  27. malloc_internal(uint64 size);
  28. TEST_F(bh_vector_test_suite, bh_vector_init)
  29. {
  30. Vector *vector_ptr = nullptr;
  31. // Normally. use_lock is true.
  32. vector_ptr = (Vector *)wasm_runtime_malloc(sizeof(Vector));
  33. memset(vector_ptr, 0, sizeof(Vector));
  34. EXPECT_EQ(true, bh_vector_init(vector_ptr, 6, sizeof(Vector *), true));
  35. // use_lock is false.
  36. EXPECT_EQ(true, bh_vector_init(vector_ptr, 6, sizeof(Vector *), false));
  37. // init_length == 0.
  38. EXPECT_EQ(true, bh_vector_init(vector_ptr, 0, sizeof(Vector *), false));
  39. // size_elem > UINT32_MAX.
  40. EXPECT_EQ(true, bh_vector_init(vector_ptr, 6, UINT32_MAX + 1, false));
  41. // init_length > UINT32_MAX.
  42. EXPECT_EQ(true, bh_vector_init(vector_ptr, UINT32_MAX + 1, sizeof(Vector *),
  43. false));
  44. // Illegal parameters.
  45. EXPECT_EQ(false, bh_vector_init(nullptr, 6, sizeof(Vector *), true));
  46. }
  47. TEST_F(bh_vector_test_suite, bh_vector_set)
  48. {
  49. Vector *vector_ptr = nullptr;
  50. char elem_buf[] = "test_vector";
  51. vector_ptr = (Vector *)wasm_runtime_malloc(sizeof(Vector));
  52. memset(vector_ptr, 0, sizeof(Vector));
  53. bh_vector_init(vector_ptr, 6, sizeof(elem_buf), true);
  54. bh_vector_append(vector_ptr, "test");
  55. // Normally. use_lock is true.
  56. EXPECT_EQ(true, bh_vector_set(vector_ptr, 0, elem_buf));
  57. // Illegal parameters: nullptr.
  58. EXPECT_EQ(false, bh_vector_set(nullptr, 0, nullptr));
  59. EXPECT_EQ(false, bh_vector_set(vector_ptr, 0, nullptr));
  60. // Illegal parameters: index >= vector->num_elems.
  61. EXPECT_EQ(false, bh_vector_set(vector_ptr, 1, elem_buf));
  62. // Normally. use_lock is false.
  63. bh_vector_init(vector_ptr, 6, sizeof(elem_buf), false);
  64. bh_vector_append(vector_ptr, "test");
  65. EXPECT_EQ(true, bh_vector_set(vector_ptr, 0, elem_buf));
  66. }
  67. TEST_F(bh_vector_test_suite, bh_vector_get)
  68. {
  69. Vector *vector_ptr = nullptr;
  70. char elem_buf[] = "test_vector";
  71. char get_elem[12] = { 0 };
  72. vector_ptr = (Vector *)wasm_runtime_malloc(sizeof(Vector));
  73. memset(vector_ptr, 0, sizeof(Vector));
  74. bh_vector_init(vector_ptr, 6, sizeof(elem_buf), true);
  75. bh_vector_append(vector_ptr, elem_buf);
  76. // Normally. use_lock is true.
  77. EXPECT_EQ(true, bh_vector_get(vector_ptr, 0, get_elem));
  78. EXPECT_EQ(0, strncmp(elem_buf, get_elem, 11));
  79. // Illegal parameters: nullptr.
  80. EXPECT_EQ(false, bh_vector_get(nullptr, 0, nullptr));
  81. EXPECT_EQ(false, bh_vector_get(vector_ptr, 0, nullptr));
  82. // Illegal parameters: index >= vector->num_elems.
  83. EXPECT_EQ(false, bh_vector_get(vector_ptr, 1, get_elem));
  84. // Normally. use_lock is false.
  85. bh_vector_init(vector_ptr, 6, sizeof(elem_buf), false);
  86. bh_vector_append(vector_ptr, elem_buf);
  87. EXPECT_EQ(true, bh_vector_get(vector_ptr, 0, get_elem));
  88. EXPECT_EQ(0, strncmp(elem_buf, get_elem, 11));
  89. }
  90. TEST_F(bh_vector_test_suite, bh_vector_insert)
  91. {
  92. Vector *vector_ptr = nullptr;
  93. char elem_buf[] = "test_vector";
  94. char get_elem[12] = { 0 };
  95. vector_ptr = (Vector *)wasm_runtime_malloc(sizeof(Vector));
  96. memset(vector_ptr, 0, sizeof(Vector));
  97. bh_vector_init(vector_ptr, 6, sizeof(elem_buf), true);
  98. bh_vector_append(vector_ptr, "test");
  99. bh_vector_append(vector_ptr, "test");
  100. bh_vector_append(vector_ptr, "test");
  101. bh_vector_append(vector_ptr, "test");
  102. // Normally.
  103. EXPECT_EQ(true, bh_vector_insert(vector_ptr, 0, elem_buf));
  104. bh_vector_get(vector_ptr, 1, get_elem);
  105. EXPECT_EQ(0, strncmp(elem_buf, get_elem, 11));
  106. EXPECT_EQ(true, bh_vector_insert(vector_ptr, 2, elem_buf));
  107. EXPECT_EQ(true, bh_vector_insert(vector_ptr, 5, elem_buf));
  108. // Illegal parameters: nullptr.
  109. EXPECT_EQ(false, bh_vector_insert(nullptr, 0, nullptr));
  110. EXPECT_EQ(false, bh_vector_insert(vector_ptr, 0, nullptr));
  111. EXPECT_EQ(0, strncmp(elem_buf, get_elem, 0));
  112. // Illegal parameters: index >= vector->num_elems.
  113. EXPECT_EQ(false, bh_vector_insert(vector_ptr, 10, elem_buf));
  114. // "if (!extend_vector(vector, vector->num_elems + 1))" == true.
  115. vector_ptr->num_elems = UINT32_MAX + 1;
  116. EXPECT_EQ(false, bh_vector_insert(vector_ptr, 2, elem_buf));
  117. // use_lock is false.
  118. bh_vector_init(vector_ptr, 6, sizeof(elem_buf), false);
  119. bh_vector_append(vector_ptr, "test");
  120. EXPECT_EQ(true, bh_vector_insert(vector_ptr, 0, elem_buf));
  121. }
  122. TEST_F(bh_vector_test_suite, bh_vector_append)
  123. {
  124. Vector *vector_ptr = nullptr;
  125. char elem_buf[] = "test_vector";
  126. char get_elem[12] = { 0 };
  127. vector_ptr = (Vector *)wasm_runtime_malloc(sizeof(Vector));
  128. memset(vector_ptr, 0, sizeof(Vector));
  129. bh_vector_init(vector_ptr, 6, sizeof(elem_buf), true);
  130. // Normally.
  131. EXPECT_EQ(true, bh_vector_append(vector_ptr, elem_buf));
  132. bh_vector_get(vector_ptr, 0, get_elem);
  133. EXPECT_EQ(0, strncmp(elem_buf, get_elem, 11));
  134. // Illegal parameters: nullptr.
  135. EXPECT_EQ(false, bh_vector_append(nullptr, nullptr));
  136. EXPECT_EQ(false, bh_vector_append(vector_ptr, nullptr));
  137. }
  138. TEST_F(bh_vector_test_suite, bh_vector_remove)
  139. {
  140. Vector *vector_ptr = nullptr;
  141. char elem_buf[] = "test_vector";
  142. char old_elem[12] = { 0 };
  143. vector_ptr = (Vector *)wasm_runtime_malloc(sizeof(Vector));
  144. memset(vector_ptr, 0, sizeof(Vector));
  145. bh_vector_init(vector_ptr, 6, sizeof(elem_buf), true);
  146. bh_vector_append(vector_ptr, elem_buf);
  147. bh_vector_append(vector_ptr, elem_buf);
  148. bh_vector_append(vector_ptr, elem_buf);
  149. bh_vector_append(vector_ptr, elem_buf);
  150. // Normally.
  151. // Remove the first one.
  152. EXPECT_EQ(true, bh_vector_remove(vector_ptr, 0, old_elem));
  153. // Remove the middle one.
  154. EXPECT_EQ(true, bh_vector_remove(vector_ptr, 2, old_elem));
  155. // Remove the last one.
  156. EXPECT_EQ(true, bh_vector_remove(vector_ptr, 1, old_elem));
  157. EXPECT_EQ(true, bh_vector_remove(vector_ptr, 0, nullptr));
  158. // Illegal parameters: nullptr.
  159. EXPECT_EQ(false, bh_vector_remove(nullptr, 0, nullptr));
  160. EXPECT_EQ(false, bh_vector_remove(vector_ptr, 0, nullptr));
  161. // Illegal parameters: index >= vector->num_elems.
  162. EXPECT_EQ(false, bh_vector_remove(vector_ptr, 1, old_elem));
  163. // use_lock is false.
  164. bh_vector_init(vector_ptr, 6, sizeof(elem_buf), false);
  165. bh_vector_append(vector_ptr, elem_buf);
  166. EXPECT_EQ(true, bh_vector_remove(vector_ptr, 0, old_elem));
  167. }
  168. TEST_F(bh_vector_test_suite, bh_vector_size)
  169. {
  170. Vector *vector_ptr = nullptr;
  171. char elem_buf[] = "test_vector";
  172. vector_ptr = (Vector *)wasm_runtime_malloc(sizeof(Vector));
  173. memset(vector_ptr, 0, sizeof(Vector));
  174. bh_vector_init(vector_ptr, 6, sizeof(elem_buf), true);
  175. bh_vector_append(vector_ptr, elem_buf);
  176. EXPECT_EQ(1, bh_vector_size(vector_ptr));
  177. EXPECT_EQ(0, bh_vector_size(nullptr));
  178. }
  179. TEST_F(bh_vector_test_suite, bh_vector_destroy)
  180. {
  181. Vector *vector_ptr = nullptr;
  182. char elem_buf[] = "test_vector";
  183. vector_ptr = (Vector *)wasm_runtime_malloc(sizeof(Vector));
  184. memset(vector_ptr, 0, sizeof(Vector));
  185. bh_vector_init(vector_ptr, 6, sizeof(elem_buf), true);
  186. bh_vector_append(vector_ptr, elem_buf);
  187. // Normally.
  188. EXPECT_EQ(true, bh_vector_destroy(vector_ptr));
  189. // Illegal parameters: nullptr.
  190. EXPECT_EQ(false, bh_vector_destroy(nullptr));
  191. // use_lock is false.
  192. bh_vector_init(vector_ptr, 6, sizeof(elem_buf), false);
  193. bh_vector_append(vector_ptr, elem_buf);
  194. EXPECT_EQ(true, bh_vector_destroy(vector_ptr));
  195. }
  196. TEST_F(bh_vector_test_suite, bh_vector_thread_safety)
  197. {
  198. Vector *vector_ptr = nullptr;
  199. char elem;
  200. int32_t i = 0;
  201. std::vector<std::future<void>> threads;
  202. vector_ptr = (Vector *)wasm_runtime_malloc(sizeof(Vector));
  203. memset(vector_ptr, 0, sizeof(Vector));
  204. bh_vector_init(vector_ptr, 6, sizeof(elem), true);
  205. for (i = 0; i < 8; i++) {
  206. threads.push_back(std::async([&] {
  207. for (int j = 0; j < 25; j++) {
  208. bh_vector_append(vector_ptr, (void *)&elem);
  209. }
  210. }));
  211. }
  212. for (auto &t : threads) {
  213. t.wait();
  214. }
  215. EXPECT_EQ(bh_vector_size(vector_ptr), 200);
  216. // Normally.
  217. EXPECT_EQ(true, bh_vector_destroy(vector_ptr));
  218. }