shared_heap_test.cc 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. /*
  2. * Copyright (C) 2024 Xiaomi 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_read_file.h"
  8. #include "wasm_runtime_common.h"
  9. class shared_heap_test : public testing::Test
  10. {
  11. protected:
  12. virtual void SetUp() {}
  13. static void SetUpTestCase() {}
  14. virtual void TearDown() {}
  15. WAMRRuntimeRAII<512 * 1024> runtime;
  16. };
  17. struct ret_env {
  18. wasm_exec_env_t exec_env;
  19. wasm_module_t wasm_module;
  20. wasm_module_inst_t wasm_module_inst;
  21. unsigned char *wasm_file_buf;
  22. char error_buf[128];
  23. };
  24. struct ret_env
  25. load_wasm(char *wasm_file_tested, unsigned int app_heap_size)
  26. {
  27. std::string wasm_mem_page = wasm_file_tested;
  28. const char *wasm_file = strdup(wasm_mem_page.c_str());
  29. wasm_module_inst_t wasm_module_inst = nullptr;
  30. wasm_module_t wasm_module = nullptr;
  31. wasm_exec_env_t exec_env = nullptr;
  32. unsigned char *wasm_file_buf = nullptr;
  33. unsigned int wasm_file_size = 0;
  34. unsigned int stack_size = 16 * 1024, heap_size = app_heap_size;
  35. char error_buf[128] = { 0 };
  36. struct ret_env ret_module_env;
  37. memset(ret_module_env.error_buf, 0, 128);
  38. wasm_file_buf =
  39. (unsigned char *)bh_read_file_to_buffer(wasm_file, &wasm_file_size);
  40. if (!wasm_file_buf) {
  41. goto fail;
  42. }
  43. wasm_module = wasm_runtime_load(wasm_file_buf, wasm_file_size, error_buf,
  44. sizeof(error_buf));
  45. if (!wasm_module) {
  46. memcpy(ret_module_env.error_buf, error_buf, 128);
  47. goto fail;
  48. }
  49. wasm_module_inst = wasm_runtime_instantiate(
  50. wasm_module, stack_size, heap_size, error_buf, sizeof(error_buf));
  51. if (!wasm_module_inst) {
  52. memcpy(ret_module_env.error_buf, error_buf, 128);
  53. goto fail;
  54. }
  55. exec_env = wasm_runtime_create_exec_env(wasm_module_inst, stack_size);
  56. fail:
  57. ret_module_env.exec_env = exec_env;
  58. ret_module_env.wasm_module = wasm_module;
  59. ret_module_env.wasm_module_inst = wasm_module_inst;
  60. ret_module_env.wasm_file_buf = wasm_file_buf;
  61. return ret_module_env;
  62. }
  63. void
  64. destroy_module_env(struct ret_env module_env)
  65. {
  66. if (module_env.exec_env) {
  67. wasm_runtime_destroy_exec_env(module_env.exec_env);
  68. }
  69. if (module_env.wasm_module_inst) {
  70. wasm_runtime_deinstantiate(module_env.wasm_module_inst);
  71. }
  72. if (module_env.wasm_module) {
  73. wasm_runtime_unload(module_env.wasm_module);
  74. }
  75. if (module_env.wasm_file_buf) {
  76. wasm_runtime_free(module_env.wasm_file_buf);
  77. }
  78. }
  79. static void test_shared_heap(WASMSharedHeap *shared_heap, const char *file, const char *func_name, uint32 argc, uint32 argv[])
  80. {
  81. struct ret_env tmp_module_env;
  82. WASMFunctionInstanceCommon *func_test = nullptr;
  83. bool ret = false;
  84. const char *exception = nullptr;
  85. tmp_module_env = load_wasm((char *)file, 0);
  86. if (!wasm_runtime_attach_shared_heap(tmp_module_env.wasm_module_inst, shared_heap)) {
  87. printf("Failed to attach shared heap\n");
  88. goto test_failed;
  89. }
  90. func_test = wasm_runtime_lookup_function(tmp_module_env.wasm_module_inst,
  91. func_name);
  92. if (!func_test) {
  93. printf("\nFailed to wasm_runtime_lookup_function!\n");
  94. goto test_failed;
  95. }
  96. ret =
  97. wasm_runtime_call_wasm(tmp_module_env.exec_env, func_test, argc, argv);
  98. if (!ret) {
  99. printf("\nFailed to wasm_runtime_call_wasm!\n");
  100. const char *s = wasm_runtime_get_exception(tmp_module_env.wasm_module_inst);
  101. printf("exception: %s\n", s);
  102. goto test_failed;
  103. }
  104. wasm_runtime_detach_shared_heap(tmp_module_env.wasm_module_inst);
  105. destroy_module_env(tmp_module_env);
  106. return;
  107. test_failed:
  108. destroy_module_env(tmp_module_env);
  109. EXPECT_EQ(1, 0);
  110. }
  111. TEST_F(shared_heap_test, test_shared_heap_basic)
  112. {
  113. SharedHeapInitArgs args;
  114. WASMSharedHeap *shared_heap = nullptr;
  115. uint32 argv[1] = { 0 };
  116. args.size = 1024;
  117. shared_heap = wasm_runtime_create_shared_heap(&args);
  118. if (!shared_heap) {
  119. printf("Failed to create shared heap\n");
  120. EXPECT_EQ(1, 0);
  121. }
  122. // test wasm
  123. test_shared_heap(shared_heap, "test.wasm", "test", 1, argv);
  124. EXPECT_EQ(10, argv[0]);
  125. // test aot
  126. test_shared_heap(shared_heap, "test.aot", "test", 1, argv);
  127. EXPECT_EQ(10, argv[0]);
  128. }
  129. TEST_F(shared_heap_test, test_shared_heap_malloc_fail)
  130. {
  131. SharedHeapInitArgs args;
  132. WASMSharedHeap *shared_heap = nullptr;
  133. uint32 argv[1] = { 0 };
  134. args.size = 1024;
  135. shared_heap = wasm_runtime_create_shared_heap(&args);
  136. if (!shared_heap) {
  137. printf("Failed to create shared heap\n");
  138. EXPECT_EQ(1, 0);
  139. }
  140. // test wasm
  141. test_shared_heap(shared_heap, "test.wasm", "test_malloc_fail", 1, argv);
  142. EXPECT_EQ(1, argv[0]);
  143. // test aot
  144. test_shared_heap(shared_heap, "test.aot", "test_malloc_fail", 1, argv);
  145. EXPECT_EQ(1, argv[0]);
  146. }
  147. #ifndef native_function
  148. #define native_function(func_name, signature) \
  149. { #func_name, (void *)glue_##func_name, signature, NULL }
  150. #endif
  151. #ifndef nitems
  152. #define nitems(_a) (sizeof(_a) / sizeof(0 [(_a)]))
  153. #endif /* nitems */
  154. uintptr_t glue_test_addr_conv(wasm_exec_env_t env, uintptr_t addr)
  155. {
  156. wasm_module_inst_t module_inst = get_module_inst(env);
  157. uintptr_t ret;
  158. void *native_addr = (void *)addr;
  159. uintptr_t app_addr = addr_native_to_app(native_addr);
  160. native_addr = addr_app_to_native(app_addr);
  161. if (native_addr != (void *)addr)
  162. {
  163. EXPECT_EQ(1, 0);
  164. }
  165. return app_addr;
  166. }
  167. static NativeSymbol g_test_native_symbols[] =
  168. {
  169. native_function(test_addr_conv,"(*)i"),
  170. };
  171. TEST_F(shared_heap_test, test_addr_conv)
  172. {
  173. SharedHeapInitArgs args;
  174. WASMSharedHeap *shared_heap = nullptr;
  175. uint32 argv[1] = { 0 };
  176. struct ret_env tmp_module_env;
  177. WASMFunctionInstanceCommon *func_test = nullptr;
  178. bool ret = false;
  179. const char *exception = nullptr;
  180. wasm_module_inst_t module_inst = tmp_module_env.wasm_module_inst;
  181. ret = wasm_native_register_natives("env", g_test_native_symbols,
  182. nitems(g_test_native_symbols));
  183. if (!ret)
  184. {
  185. EXPECT_EQ(1, 0);
  186. return;
  187. }
  188. args.size = 1024;
  189. shared_heap = wasm_runtime_create_shared_heap(&args);
  190. if (!shared_heap) {
  191. printf("Failed to create shared heap\n");
  192. EXPECT_EQ(1, 0);
  193. }
  194. // test wasm
  195. test_shared_heap(shared_heap, "test_addr_conv.wasm", "test", 1, argv);
  196. EXPECT_EQ(1, argv[0]);
  197. // test aot
  198. test_shared_heap(shared_heap, "test_addr_conv.aot", "test", 1, argv);
  199. EXPECT_EQ(1, argv[0]);
  200. }