wasm_runtime_common_test.cc 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653
  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 "platform_common.h"
  8. #include "wasm_runtime_common.h"
  9. #include "bh_read_file.h"
  10. #include "wasm_runtime.h"
  11. #include "bh_platform.h"
  12. #include "wasm_export.h"
  13. #include "aot_runtime.h"
  14. using namespace std;
  15. extern "C" {
  16. uint32
  17. wasm_runtime_module_realloc(WASMModuleInstanceCommon *module_inst, uint32 ptr,
  18. uint32 size, void **p_native_addr);
  19. bool
  20. wasm_runtime_create_exec_env_and_call_wasm(
  21. WASMModuleInstanceCommon *module_inst, WASMFunctionInstanceCommon *function,
  22. uint32 argc, uint32 argv[]);
  23. }
  24. static bh_list loading_module_list_head;
  25. static bh_list *const loading_module_list = &loading_module_list_head;
  26. static korp_mutex loading_module_list_lock;
  27. static std::string CWD;
  28. static std::string MAIN_WASM = "/main.wasm";
  29. static std::string MAIN_AOT = "/main.aot";
  30. static char *WASM_FILE_1;
  31. static char *AOT_FILE_1;
  32. class wasm_runtime_common_test_suite : public testing::Test
  33. {
  34. protected:
  35. // You should make the members protected s.t. they can be
  36. // accessed from sub-classes.
  37. // virtual void SetUp() will be called before each test is run. You
  38. // should define it if you need to initialize the variables.
  39. // Otherwise, this can be skipped.
  40. virtual void SetUp() {}
  41. static void SetUpTestCase()
  42. {
  43. CWD = get_test_binary_dir();
  44. WASM_FILE_1 = strdup((CWD + MAIN_WASM).c_str());
  45. AOT_FILE_1 = strdup((CWD + MAIN_AOT).c_str());
  46. }
  47. // virtual void TearDown() will be called after each test is run.
  48. // You should define it if there is cleanup work to do. Otherwise,
  49. // you don't have to provide it.
  50. //
  51. virtual void TearDown() {}
  52. static void TearDownTestCase()
  53. {
  54. free(WASM_FILE_1);
  55. free(AOT_FILE_1);
  56. }
  57. WAMRRuntimeRAII<512 * 1024> runtime;
  58. };
  59. TEST_F(wasm_runtime_common_test_suite, wasm_runtime_destroy)
  60. {
  61. wasm_runtime_init();
  62. wasm_runtime_destroy();
  63. }
  64. static bool
  65. reader_test(package_type_t module_type, const char *module_name,
  66. uint8 **p_buffer, uint32 *p_size)
  67. {
  68. return true;
  69. }
  70. static void
  71. destroyer_test(uint8 *buffer, uint32 size)
  72. {}
  73. TEST_F(wasm_runtime_common_test_suite,
  74. set_module_reader_get_module_reader_get_module_destroyer)
  75. {
  76. wasm_runtime_set_module_reader(reader_test, destroyer_test);
  77. EXPECT_EQ((module_reader)reader_test, wasm_runtime_get_module_reader());
  78. EXPECT_EQ((module_destroyer)destroyer_test,
  79. wasm_runtime_get_module_destroyer());
  80. }
  81. TEST_F(wasm_runtime_common_test_suite, wasm_runtime_register_module)
  82. {
  83. const char *wasm_file = WASM_FILE_1;
  84. wasm_module_t wasm_module = nullptr;
  85. unsigned char *wasm_file_buf = nullptr;
  86. unsigned int wasm_file_size = 0;
  87. char error_buf[128] = { 0 };
  88. char module_name[] = "module_test";
  89. char module_name_1[] = "module_test_1";
  90. // Normal situation.
  91. wasm_file_buf =
  92. (unsigned char *)bh_read_file_to_buffer(wasm_file, &wasm_file_size);
  93. EXPECT_NE(wasm_file_buf, nullptr);
  94. wasm_module = wasm_runtime_load(wasm_file_buf, wasm_file_size, error_buf,
  95. sizeof(error_buf));
  96. EXPECT_NE(wasm_module, nullptr);
  97. EXPECT_NE(false,
  98. wasm_runtime_register_module("module_test", wasm_module,
  99. error_buf, sizeof(error_buf)));
  100. // Abnormal situation.
  101. EXPECT_EQ(false,
  102. wasm_runtime_register_module(nullptr, nullptr, nullptr, 0));
  103. EXPECT_EQ(false, wasm_runtime_register_module(
  104. "module_test", nullptr, error_buf, sizeof(error_buf)));
  105. EXPECT_EQ(false, wasm_runtime_register_module("module_test", wasm_module,
  106. nullptr, sizeof(error_buf)));
  107. EXPECT_EQ(false, wasm_runtime_register_module("module_test", wasm_module,
  108. error_buf, 0));
  109. EXPECT_EQ(false, wasm_runtime_register_module(
  110. nullptr, wasm_module, error_buf, sizeof(error_buf)));
  111. EXPECT_EQ(false, wasm_runtime_register_module(nullptr, nullptr, error_buf,
  112. sizeof(error_buf)));
  113. EXPECT_EQ(true, wasm_runtime_register_module(module_name, wasm_module,
  114. error_buf, sizeof(error_buf)));
  115. EXPECT_EQ(false, wasm_runtime_register_module_internal(nullptr, wasm_module,
  116. NULL, 0, error_buf,
  117. sizeof(error_buf)));
  118. EXPECT_EQ(false, wasm_runtime_register_module_internal(
  119. module_name_1, wasm_module, NULL, 0, error_buf,
  120. sizeof(error_buf)));
  121. }
  122. TEST_F(wasm_runtime_common_test_suite, wasm_runtime_unregister_module)
  123. {
  124. wasm_runtime_unregister_module(nullptr);
  125. }
  126. TEST_F(wasm_runtime_common_test_suite, wasm_runtime_find_module_registered)
  127. {
  128. EXPECT_EQ(nullptr, wasm_runtime_find_module_registered("module_test"));
  129. }
  130. TEST_F(wasm_runtime_common_test_suite, wasm_runtime_is_module_registered)
  131. {
  132. EXPECT_EQ(nullptr, wasm_runtime_find_module_registered(""));
  133. }
  134. /* TODO: add thread safety test. */
  135. TEST_F(wasm_runtime_common_test_suite, wasm_runtime_add_loading_module)
  136. {
  137. EXPECT_EQ(true, wasm_runtime_add_loading_module(nullptr, nullptr, 0));
  138. }
  139. TEST_F(wasm_runtime_common_test_suite, wasm_runtime_destroy_loading_module_list)
  140. {
  141. os_mutex_init(&loading_module_list_lock);
  142. wasm_runtime_destroy_loading_module_list();
  143. os_mutex_destroy(&loading_module_list_lock);
  144. }
  145. TEST_F(wasm_runtime_common_test_suite, wasm_runtime_is_built_in_module)
  146. {
  147. EXPECT_EQ(true, wasm_runtime_is_built_in_module("env"));
  148. EXPECT_EQ(true, wasm_runtime_is_built_in_module("wasi_unstable"));
  149. EXPECT_EQ(true, wasm_runtime_is_built_in_module("wasi_snapshot_preview1"));
  150. EXPECT_EQ(true, wasm_runtime_is_built_in_module(""));
  151. EXPECT_EQ(false, wasm_runtime_is_built_in_module("test"));
  152. }
  153. TEST_F(wasm_runtime_common_test_suite, wasm_runtime_read_v128)
  154. {
  155. unsigned char buf[16] = { '0', '1', '2', '3', '4', '5', '6', '7',
  156. '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
  157. unsigned char ret1[8] = { 0 };
  158. unsigned char ret2[8] = { 0 };
  159. wasm_runtime_read_v128((const uint8 *)buf, (uint64 *)ret1, (uint64 *)ret2);
  160. EXPECT_EQ(0, strncmp("01234567", (const char *)ret1, 8));
  161. EXPECT_EQ(0, strncmp("89ABCDEF", (const char *)ret2, 8));
  162. }
  163. TEST_F(wasm_runtime_common_test_suite,
  164. wasm_runtime_show_app_heap_corrupted_prompt)
  165. {
  166. wasm_runtime_show_app_heap_corrupted_prompt();
  167. }
  168. TEST_F(wasm_runtime_common_test_suite, wasm_runtime_is_xip_file)
  169. {
  170. // WASM file.
  171. const char *wasm_file = WASM_FILE_1;
  172. unsigned int wasm_file_size = 0;
  173. unsigned char *wasm_file_buf = nullptr;
  174. wasm_file_buf =
  175. (unsigned char *)bh_read_file_to_buffer(wasm_file, &wasm_file_size);
  176. EXPECT_NE(wasm_file_buf, nullptr);
  177. EXPECT_EQ(false, wasm_runtime_is_xip_file(wasm_file_buf, wasm_file_size));
  178. // AoT file.
  179. const char *aot_file = AOT_FILE_1;
  180. unsigned int aot_file_size = 0;
  181. unsigned char *aot_file_buf = nullptr;
  182. aot_file_buf =
  183. (unsigned char *)bh_read_file_to_buffer(aot_file, &aot_file_size);
  184. EXPECT_NE(aot_file_buf, nullptr);
  185. EXPECT_EQ(false, wasm_runtime_is_xip_file(aot_file_buf, aot_file_size));
  186. }
  187. TEST_F(wasm_runtime_common_test_suite, get_package_type)
  188. {
  189. const char *wasm_file = WASM_FILE_1;
  190. unsigned int wasm_file_size = 0;
  191. unsigned char *wasm_file_buf = nullptr;
  192. // WASM file.
  193. wasm_file_buf =
  194. (unsigned char *)bh_read_file_to_buffer(wasm_file, &wasm_file_size);
  195. EXPECT_NE(wasm_file_buf, nullptr);
  196. EXPECT_EQ(Wasm_Module_Bytecode,
  197. get_package_type(wasm_file_buf, wasm_file_size));
  198. // WASM file. Abnormally.
  199. wasm_file_buf[3] = -1;
  200. EXPECT_EQ(Package_Type_Unknown,
  201. get_package_type(wasm_file_buf, wasm_file_size));
  202. wasm_file_buf[2] = -1;
  203. EXPECT_EQ(Package_Type_Unknown,
  204. get_package_type(wasm_file_buf, wasm_file_size));
  205. wasm_file_buf[1] = -1;
  206. EXPECT_EQ(Package_Type_Unknown,
  207. get_package_type(wasm_file_buf, wasm_file_size));
  208. wasm_file_buf[0] = -1;
  209. EXPECT_EQ(Package_Type_Unknown,
  210. get_package_type(wasm_file_buf, wasm_file_size));
  211. EXPECT_EQ(Package_Type_Unknown, get_package_type(wasm_file_buf, 0));
  212. EXPECT_EQ(Package_Type_Unknown, get_package_type(nullptr, 0));
  213. // AoT file.
  214. const char *wasm_file_aot = AOT_FILE_1;
  215. wasm_file_buf =
  216. (unsigned char *)bh_read_file_to_buffer(wasm_file_aot, &wasm_file_size);
  217. EXPECT_NE(wasm_file_buf, nullptr);
  218. EXPECT_EQ(Wasm_Module_AoT, get_package_type(wasm_file_buf, wasm_file_size));
  219. // AoT file. Abnormally.
  220. wasm_file_buf[3] = -1;
  221. EXPECT_EQ(Package_Type_Unknown,
  222. get_package_type(wasm_file_buf, wasm_file_size));
  223. wasm_file_buf[2] = -1;
  224. EXPECT_EQ(Package_Type_Unknown,
  225. get_package_type(wasm_file_buf, wasm_file_size));
  226. wasm_file_buf[1] = -1;
  227. EXPECT_EQ(Package_Type_Unknown,
  228. get_package_type(wasm_file_buf, wasm_file_size));
  229. wasm_file_buf[0] = -1;
  230. EXPECT_EQ(Package_Type_Unknown,
  231. get_package_type(wasm_file_buf, wasm_file_size));
  232. EXPECT_EQ(Package_Type_Unknown, get_package_type(wasm_file_buf, 0));
  233. EXPECT_EQ(Package_Type_Unknown, get_package_type(nullptr, 0));
  234. }
  235. TEST_F(wasm_runtime_common_test_suite, functions_on_wasm_module)
  236. {
  237. const char *wasm_file = WASM_FILE_1;
  238. wasm_module_inst_t wasm_module_inst = nullptr;
  239. wasm_module_t wasm_module = nullptr;
  240. wasm_exec_env_t exec_env = nullptr;
  241. wasm_exec_env_t exec_env_1 = nullptr;
  242. unsigned char *wasm_file_buf = nullptr;
  243. WASMFunctionInstanceCommon *func = nullptr;
  244. const char *user_data = "test";
  245. unsigned int wasm_file_size = 0;
  246. unsigned int stack_size = 16 * 1024, heap_size = 16 * 1024;
  247. char error_buf[128] = { 0 };
  248. unsigned int argv[2] = { 0 };
  249. WASMType *func_type = nullptr;
  250. wasm_val_t arguments[1];
  251. char str_test[] = "This is a test.";
  252. char str_exception[] = "Exception: ";
  253. char str_tmp[60] = { 0 };
  254. void *ptr_tmp = nullptr;
  255. unsigned int offset_tmp = 0;
  256. unsigned int tmp = 0;
  257. unsigned char *p_native_start_addr = nullptr;
  258. unsigned char *p_native_end_addr = nullptr;
  259. NativeSymbol *native_symbols;
  260. uint32 n_native_symbols;
  261. const char *exception_test = nullptr;
  262. arguments[0].kind = WASM_I32;
  263. arguments[0].of.i32 = 0;
  264. // Create exec_env.
  265. wasm_file_buf =
  266. (unsigned char *)bh_read_file_to_buffer(wasm_file, &wasm_file_size);
  267. EXPECT_NE(wasm_file_buf, nullptr);
  268. wasm_module = wasm_runtime_load(wasm_file_buf, wasm_file_size, error_buf,
  269. sizeof(error_buf));
  270. EXPECT_NE(wasm_module, nullptr);
  271. wasm_module_inst = wasm_runtime_instantiate(
  272. wasm_module, stack_size, heap_size, error_buf, sizeof(error_buf));
  273. EXPECT_NE(wasm_module_inst, nullptr);
  274. exec_env = wasm_runtime_create_exec_env(wasm_module_inst, stack_size);
  275. EXPECT_NE(exec_env, nullptr);
  276. // Operations on exec_env.
  277. EXPECT_EQ(true, wasm_runtime_register_module_internal("test", wasm_module,
  278. nullptr, 0, error_buf,
  279. sizeof(error_buf)));
  280. EXPECT_NE(nullptr, wasm_runtime_find_module_registered("test"));
  281. EXPECT_EQ(wasm_module_inst, wasm_runtime_get_module_inst(exec_env));
  282. EXPECT_EQ(exec_env->attachment,
  283. wasm_runtime_get_function_attachment(exec_env));
  284. EXPECT_EQ(wasm_module, wasm_exec_env_get_module(exec_env));
  285. wasm_runtime_set_user_data(exec_env, (void *)user_data);
  286. EXPECT_EQ((void *)user_data, wasm_runtime_get_user_data(exec_env));
  287. func = wasm_runtime_lookup_function(wasm_module_inst, "on_timer_event");
  288. func_type =
  289. wasm_runtime_get_function_type(func, wasm_module_inst->module_type);
  290. EXPECT_NE(func_type, nullptr);
  291. EXPECT_EQ(false, wasm_runtime_call_wasm(exec_env, func, 0, argv));
  292. exception_test = wasm_runtime_get_exception(wasm_module_inst);
  293. EXPECT_NE(nullptr, exception_test);
  294. EXPECT_EQ(false, wasm_runtime_call_wasm_a(exec_env, func, 0, nullptr, 1,
  295. arguments));
  296. exception_test = wasm_runtime_get_exception(wasm_module_inst);
  297. EXPECT_NE(nullptr, exception_test);
  298. WASMFunctionInstance func_test_1;
  299. WASMFunction wasm_func_test;
  300. WASMType wasm_type_test;
  301. wasm_func_test.func_type = &wasm_type_test;
  302. func_test_1.u.func = &wasm_func_test;
  303. func_test_1.u.func->func_type->param_count = 1;
  304. func_test_1.u.func->func_type->param_cell_num = 2;
  305. func_test_1.u.func->func_type->types[0] = VALUE_TYPE_I64;
  306. func_test_1.u.func->max_stack_cell_num = 10;
  307. EXPECT_EQ(false, wasm_runtime_call_wasm_v(
  308. exec_env, (WASMFunctionInstanceCommon *)(&func_test_1),
  309. 0, nullptr, 1, arguments));
  310. func_test_1.u.func->func_type->types[0] = VALUE_TYPE_F32;
  311. EXPECT_EQ(false, wasm_runtime_call_wasm_v(
  312. exec_env, (WASMFunctionInstanceCommon *)(&func_test_1),
  313. 0, nullptr, 1, arguments));
  314. func_test_1.u.func->func_type->types[0] = VALUE_TYPE_F64;
  315. EXPECT_EQ(false, wasm_runtime_call_wasm_v(
  316. exec_env, (WASMFunctionInstanceCommon *)(&func_test_1),
  317. 0, nullptr, 1, arguments));
  318. EXPECT_EQ(true, wasm_runtime_create_exec_env_singleton(wasm_module_inst));
  319. EXPECT_NE(nullptr, wasm_runtime_get_exec_env_singleton(wasm_module_inst));
  320. wasm_runtime_set_exception(wasm_module_inst, str_test);
  321. sprintf(str_tmp, "%s%s", str_exception, str_test);
  322. EXPECT_EQ(0, strcmp(str_tmp, wasm_runtime_get_exception(wasm_module_inst)));
  323. wasm_runtime_clear_exception(wasm_module_inst);
  324. EXPECT_EQ(nullptr, wasm_runtime_get_exception(wasm_module_inst));
  325. wasm_runtime_set_custom_data(wasm_module_inst, (void *)user_data);
  326. EXPECT_EQ((void *)user_data,
  327. wasm_runtime_get_custom_data(wasm_module_inst));
  328. offset_tmp = wasm_runtime_module_malloc(wasm_module_inst, 10, &ptr_tmp);
  329. EXPECT_NE(0, offset_tmp);
  330. EXPECT_EQ(true,
  331. wasm_runtime_validate_app_addr(wasm_module_inst, offset_tmp, 10));
  332. EXPECT_EQ(ptr_tmp,
  333. wasm_runtime_addr_app_to_native(wasm_module_inst, offset_tmp));
  334. EXPECT_EQ(true,
  335. wasm_runtime_validate_native_addr(wasm_module_inst, ptr_tmp, 10));
  336. EXPECT_EQ(offset_tmp,
  337. wasm_runtime_addr_native_to_app(wasm_module_inst, ptr_tmp));
  338. EXPECT_EQ(true, wasm_runtime_get_native_addr_range(
  339. wasm_module_inst, (unsigned char *)ptr_tmp,
  340. &p_native_start_addr, &p_native_end_addr));
  341. EXPECT_NE(0, wasm_runtime_module_realloc(wasm_module_inst, offset_tmp, 100,
  342. &ptr_tmp));
  343. /* can't test like that since shrink size optimization will be applied */
  344. /* EXPECT_EQ(false,
  345. wasm_enlarge_memory((WASMModuleInstance *)wasm_module_inst, 1));
  346. */
  347. EXPECT_EQ(offset_tmp,
  348. wasm_runtime_addr_native_to_app(wasm_module_inst, ptr_tmp));
  349. EXPECT_EQ(true, wasm_runtime_get_native_addr_range(
  350. wasm_module_inst, (unsigned char *)ptr_tmp,
  351. &p_native_start_addr, &p_native_end_addr));
  352. offset_tmp = wasm_runtime_module_dup_data(wasm_module_inst, str_test,
  353. sizeof(str_test));
  354. EXPECT_EQ(0, strcmp(str_test, (char *)wasm_runtime_addr_app_to_native(
  355. wasm_module_inst, offset_tmp)));
  356. EXPECT_EQ(true,
  357. wasm_runtime_validate_app_str_addr(wasm_module_inst, offset_tmp));
  358. ((WASMModuleInstance *)wasm_module_inst)->exec_env_singleton = nullptr;
  359. EXPECT_NE(nullptr, wasm_runtime_get_exec_env_singleton(wasm_module_inst));
  360. EXPECT_EQ(false, wasm_runtime_call_wasm(nullptr, func, 0, argv));
  361. wasm_runtime_set_exception(wasm_module_inst, str_test);
  362. EXPECT_EQ(false, wasm_runtime_call_wasm(exec_env, func, 0, argv));
  363. wasm_runtime_clear_exception(wasm_module_inst);
  364. EXPECT_EQ(false, wasm_runtime_call_wasm_a(exec_env, func, 0, nullptr, 2,
  365. arguments));
  366. WASMFunctionInstance *func_test_call_wasm_a_ptr =
  367. (WASMFunctionInstance *)func;
  368. func_test_call_wasm_a_ptr->u.func->func_type->ret_cell_num = 10;
  369. EXPECT_EQ(true, wasm_runtime_call_wasm_a(exec_env, func, 0, nullptr, 1,
  370. arguments));
  371. // Destroy.
  372. wasm_runtime_module_free(wasm_module_inst, offset_tmp);
  373. wasm_runtime_destroy_exec_env(exec_env);
  374. wasm_runtime_deinstantiate(wasm_module_inst);
  375. wasm_runtime_unload(wasm_module);
  376. if (wasm_file_buf) {
  377. wasm_runtime_free(wasm_file_buf);
  378. }
  379. }
  380. TEST_F(wasm_runtime_common_test_suite, functions_on_aot_module)
  381. {
  382. const char *wasm_file = AOT_FILE_1;
  383. wasm_module_inst_t wasm_module_inst = nullptr;
  384. wasm_module_t wasm_module = nullptr;
  385. wasm_exec_env_t exec_env = nullptr;
  386. wasm_exec_env_t exec_env_1 = nullptr;
  387. unsigned char *wasm_file_buf = nullptr;
  388. WASMFunctionInstanceCommon *func = nullptr;
  389. const char *user_data = "test";
  390. unsigned int wasm_file_size = 0;
  391. unsigned int stack_size = 16 * 1024, heap_size = 16 * 1024;
  392. char error_buf[128] = { 0 };
  393. unsigned int argv[2] = { 0 };
  394. WASMType *func_type = nullptr;
  395. wasm_val_t arguments[1];
  396. char str_test[] = "This is a test.";
  397. char str_exception[] = "Exception: ";
  398. char str_tmp[60] = { 0 };
  399. void *ptr_tmp = nullptr;
  400. unsigned int offset_tmp = 0;
  401. unsigned int tmp = 0;
  402. unsigned char *p_native_start_addr = nullptr;
  403. unsigned char *p_native_end_addr = nullptr;
  404. NativeSymbol *native_symbols;
  405. uint32 n_native_symbols;
  406. const char *exception_test = nullptr;
  407. arguments[0].kind = WASM_I32;
  408. arguments[0].of.i32 = 0;
  409. // Create exec_env.
  410. wasm_file_buf =
  411. (unsigned char *)bh_read_file_to_buffer(wasm_file, &wasm_file_size);
  412. EXPECT_NE(wasm_file_buf, nullptr);
  413. wasm_module = wasm_runtime_load(wasm_file_buf, wasm_file_size, error_buf,
  414. sizeof(error_buf));
  415. EXPECT_NE(wasm_module, nullptr);
  416. wasm_module_inst = wasm_runtime_instantiate(
  417. wasm_module, stack_size, heap_size, error_buf, sizeof(error_buf));
  418. EXPECT_NE(wasm_module_inst, nullptr);
  419. exec_env = wasm_runtime_create_exec_env(wasm_module_inst, stack_size);
  420. EXPECT_NE(exec_env, nullptr);
  421. // Operations on exec_env.
  422. EXPECT_EQ(true, wasm_runtime_register_module_internal("test", wasm_module,
  423. nullptr, 0, error_buf,
  424. sizeof(error_buf)));
  425. EXPECT_NE(nullptr, wasm_runtime_find_module_registered("test"));
  426. EXPECT_EQ(wasm_module_inst, wasm_runtime_get_module_inst(exec_env));
  427. EXPECT_EQ(exec_env->attachment,
  428. wasm_runtime_get_function_attachment(exec_env));
  429. EXPECT_EQ(wasm_module, wasm_exec_env_get_module(exec_env));
  430. wasm_runtime_set_user_data(exec_env, (void *)user_data);
  431. EXPECT_EQ((void *)user_data, wasm_runtime_get_user_data(exec_env));
  432. func = wasm_runtime_lookup_function(wasm_module_inst, "on_timer_event");
  433. func_type =
  434. wasm_runtime_get_function_type(func, wasm_module_inst->module_type);
  435. EXPECT_NE(func_type, nullptr);
  436. EXPECT_EQ(false, wasm_runtime_call_wasm(exec_env, func, 0, argv));
  437. exception_test = wasm_runtime_get_exception(wasm_module_inst);
  438. EXPECT_NE(nullptr, exception_test);
  439. EXPECT_EQ(false, wasm_runtime_call_wasm_a(exec_env, func, 0, nullptr, 1,
  440. arguments));
  441. exception_test = wasm_runtime_get_exception(wasm_module_inst);
  442. EXPECT_NE(nullptr, exception_test);
  443. EXPECT_EQ(false, wasm_runtime_call_wasm_v(exec_env, func, 0, nullptr, 1,
  444. arguments));
  445. exception_test = wasm_runtime_get_exception(wasm_module_inst);
  446. EXPECT_NE(nullptr, exception_test);
  447. AOTFunctionInstance func_test;
  448. AOTImportFunc func_import_test;
  449. func_test.u.func_import = &func_import_test;
  450. func_import_test.func_type = (AOTFuncType *)func_type;
  451. func_test.is_import_func = true;
  452. EXPECT_NE(nullptr, wasm_runtime_get_function_type(
  453. &func_test, wasm_module_inst->module_type));
  454. EXPECT_EQ(true, wasm_runtime_create_exec_env_singleton(wasm_module_inst));
  455. EXPECT_NE(nullptr, wasm_runtime_get_exec_env_singleton(wasm_module_inst));
  456. wasm_runtime_set_exception(wasm_module_inst, str_test);
  457. sprintf(str_tmp, "%s%s", str_exception, str_test);
  458. EXPECT_EQ(0, strcmp(str_tmp, wasm_runtime_get_exception(wasm_module_inst)));
  459. wasm_runtime_clear_exception(wasm_module_inst);
  460. EXPECT_EQ(nullptr, wasm_runtime_get_exception(wasm_module_inst));
  461. wasm_runtime_set_custom_data(wasm_module_inst, (void *)user_data);
  462. EXPECT_EQ((void *)user_data,
  463. wasm_runtime_get_custom_data(wasm_module_inst));
  464. offset_tmp = wasm_runtime_module_malloc(wasm_module_inst, 10, &ptr_tmp);
  465. EXPECT_NE(0, offset_tmp);
  466. EXPECT_EQ(true,
  467. wasm_runtime_validate_app_addr(wasm_module_inst, offset_tmp, 10));
  468. EXPECT_EQ(ptr_tmp,
  469. wasm_runtime_addr_app_to_native(wasm_module_inst, offset_tmp));
  470. EXPECT_EQ(true,
  471. wasm_runtime_validate_native_addr(wasm_module_inst, ptr_tmp, 10));
  472. EXPECT_EQ(offset_tmp,
  473. wasm_runtime_addr_native_to_app(wasm_module_inst, ptr_tmp));
  474. EXPECT_EQ(true, wasm_runtime_get_native_addr_range(
  475. wasm_module_inst, (unsigned char *)ptr_tmp,
  476. &p_native_start_addr, &p_native_end_addr));
  477. EXPECT_NE(0, wasm_runtime_module_realloc(wasm_module_inst, offset_tmp, 100,
  478. &ptr_tmp));
  479. /* can't test like that since shrink size optimization will be applied */
  480. /* EXPECT_EQ(false,
  481. wasm_enlarge_memory((WASMModuleInstance *)wasm_module_inst, 1));
  482. */
  483. offset_tmp = wasm_runtime_module_dup_data(wasm_module_inst, str_test,
  484. sizeof(str_test));
  485. EXPECT_EQ(0, strcmp(str_test, (char *)wasm_runtime_addr_app_to_native(
  486. wasm_module_inst, offset_tmp)));
  487. EXPECT_EQ(true,
  488. wasm_runtime_validate_app_str_addr(wasm_module_inst, offset_tmp));
  489. ((WASMModuleInstance *)wasm_module_inst)->exec_env_singleton = nullptr;
  490. EXPECT_NE(nullptr, wasm_runtime_get_exec_env_singleton(wasm_module_inst));
  491. // Destroy.
  492. wasm_runtime_module_free(wasm_module_inst, offset_tmp);
  493. wasm_runtime_destroy_exec_env(exec_env);
  494. wasm_runtime_deinstantiate(wasm_module_inst);
  495. wasm_runtime_unload(wasm_module);
  496. if (wasm_file_buf) {
  497. wasm_runtime_free(wasm_file_buf);
  498. }
  499. }
  500. TEST_F(wasm_runtime_common_test_suite, functions_on_module_type_unknown)
  501. {
  502. const char *wasm_file = AOT_FILE_1;
  503. wasm_module_inst_t wasm_module_inst = nullptr;
  504. wasm_module_t wasm_module = nullptr;
  505. wasm_exec_env_t exec_env = nullptr;
  506. wasm_exec_env_t exec_env_1 = nullptr;
  507. unsigned char *wasm_file_buf = nullptr;
  508. WASMFunctionInstanceCommon *func = nullptr;
  509. const char *user_data = "test";
  510. unsigned int wasm_file_size = 0;
  511. unsigned int stack_size = 16 * 1024, heap_size = 16 * 1024;
  512. char error_buf[128] = { 0 };
  513. unsigned int argv[2] = { 0 };
  514. WASMType *func_type = nullptr;
  515. wasm_val_t arguments[1];
  516. char str_test[] = "This is a test.";
  517. char str_exception[] = "Exception: ";
  518. char str_tmp[60] = { 0 };
  519. void *ptr_tmp = nullptr;
  520. unsigned int offset_tmp = 0;
  521. unsigned int tmp = 0;
  522. unsigned char *p_native_start_addr = nullptr;
  523. unsigned char *p_native_end_addr = nullptr;
  524. const char *exception_test = nullptr;
  525. arguments[0].kind = WASM_I32;
  526. arguments[0].of.i32 = 0;
  527. // Create exec_env.
  528. wasm_runtime_unregister_module(wasm_module);
  529. wasm_file_buf =
  530. (unsigned char *)bh_read_file_to_buffer(wasm_file, &wasm_file_size);
  531. EXPECT_NE(wasm_file_buf, nullptr);
  532. wasm_module = wasm_runtime_load(wasm_file_buf, wasm_file_size, error_buf,
  533. sizeof(error_buf));
  534. EXPECT_NE(wasm_module, nullptr);
  535. wasm_module_inst = wasm_runtime_instantiate(
  536. wasm_module, stack_size, heap_size, error_buf, sizeof(error_buf));
  537. EXPECT_NE(wasm_module_inst, nullptr);
  538. exec_env = wasm_runtime_create_exec_env(wasm_module_inst, stack_size);
  539. EXPECT_NE(exec_env, nullptr);
  540. // wasm_module_inst->module_type = Package_Type_Unknown.
  541. wasm_module_inst->module_type = Package_Type_Unknown;
  542. EXPECT_DEATH(wasm_exec_env_get_module(exec_env), "");
  543. EXPECT_DEATH(
  544. wasm_runtime_validate_app_str_addr(wasm_module_inst, offset_tmp), "");
  545. // wasm_module->module_type = Package_Type_Unknown.
  546. wasm_module->module_type = Package_Type_Unknown;
  547. EXPECT_EQ(nullptr,
  548. wasm_runtime_instantiate(wasm_module, stack_size, heap_size,
  549. error_buf, sizeof(error_buf)));
  550. wasm_module = wasm_runtime_load(wasm_file_buf, wasm_file_size, error_buf,
  551. sizeof(error_buf));
  552. /* Reload unmodified buffer should be valid now */
  553. EXPECT_NE(wasm_module, nullptr);
  554. wasm_file_buf[3] = -1;
  555. wasm_file_buf[2] = -1;
  556. wasm_file_buf[1] = -1;
  557. wasm_file_buf[0] = -1;
  558. wasm_module =
  559. wasm_runtime_load(wasm_file_buf, 0, error_buf, sizeof(error_buf));
  560. EXPECT_EQ(wasm_module, nullptr);
  561. wasm_module = wasm_runtime_load(wasm_file_buf, wasm_file_size, error_buf,
  562. sizeof(error_buf));
  563. EXPECT_EQ(wasm_module, nullptr);
  564. // Destroy.
  565. wasm_runtime_module_free(wasm_module_inst, offset_tmp);
  566. wasm_runtime_destroy_exec_env(exec_env);
  567. wasm_runtime_deinstantiate(wasm_module_inst);
  568. wasm_runtime_unload(wasm_module);
  569. if (wasm_file_buf) {
  570. wasm_runtime_free(wasm_file_buf);
  571. }
  572. }