basic.cc 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. /*
  2. * Copyright (C) 2019 Intel Corporation. All rights reserved.
  3. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. */
  5. #include <gtest/gtest.h>
  6. #include "bh_platform.h"
  7. #include "wasm_c_api.h"
  8. #include "wasm_c_api_internal.h"
  9. #ifndef own
  10. #define own
  11. #endif
  12. class CApiTests : public ::testing::Test
  13. {
  14. protected:
  15. void SetUp()
  16. {
  17. bh_log_set_verbose_level(5);
  18. engine = nullptr;
  19. engine = wasm_engine_new();
  20. ASSERT_NE(nullptr, engine);
  21. }
  22. void TearDown() { wasm_engine_delete(engine); }
  23. wasm_engine_t *engine;
  24. };
  25. TEST_F(CApiTests, empty) {}
  26. TEST_F(CApiTests, wasm_engine_t)
  27. {
  28. wasm_engine_t *engine1 = wasm_engine_new();
  29. wasm_engine_t *engine2 = wasm_engine_new();
  30. EXPECT_EQ(engine1, engine2);
  31. /* TearDown() will delete it */
  32. }
  33. TEST_F(CApiTests, wasm_store_t)
  34. {
  35. wasm_engine_t *engine = wasm_engine_new();
  36. wasm_store_t *store1 = wasm_store_new(engine);
  37. EXPECT_NE(nullptr, store1);
  38. EXPECT_NE(nullptr, store1->modules->data);
  39. wasm_store_t *store2 = wasm_store_new(engine);
  40. EXPECT_NE(store1, store2);
  41. EXPECT_NE(store1->modules->data, store2->modules->data);
  42. wasm_store_delete(store1);
  43. wasm_store_delete(store2);
  44. store1 = wasm_store_new(engine);
  45. EXPECT_NE(nullptr, store1);
  46. wasm_store_delete(store1);
  47. }
  48. TEST_F(CApiTests, wasm_byte_vec_t)
  49. {
  50. wasm_byte_vec_t byte_vec = { 0 };
  51. wasm_byte_vec_new_uninitialized(&byte_vec, 10);
  52. EXPECT_NE(nullptr, byte_vec.data);
  53. EXPECT_EQ(10, byte_vec.size);
  54. byte_vec.data[0] = (wasm_byte_t)'a';
  55. byte_vec.data[1] = (wasm_byte_t)'b';
  56. byte_vec.data[2] = (wasm_byte_t)'c';
  57. EXPECT_STREQ("abc", (char *)byte_vec.data);
  58. byte_vec.data[5] = (wasm_byte_t)'d';
  59. byte_vec.data[6] = (wasm_byte_t)'e';
  60. byte_vec.data[7] = (wasm_byte_t)'f';
  61. EXPECT_STREQ("def", (char *)(byte_vec.data + 5));
  62. wasm_byte_vec_delete(&byte_vec);
  63. EXPECT_EQ(nullptr, byte_vec.data);
  64. EXPECT_EQ(0, byte_vec.size);
  65. }
  66. TEST_F(CApiTests, wasm_valtype_vec_t)
  67. {
  68. wasm_valtype_vec_t tuple1 = { 0 };
  69. wasm_valtype_vec_new_uninitialized(&tuple1, 128);
  70. EXPECT_NE(nullptr, tuple1.data);
  71. EXPECT_EQ(128, tuple1.size);
  72. wasm_valtype_t *val_type_1 = wasm_valtype_new_i32();
  73. tuple1.data[0] = val_type_1;
  74. EXPECT_EQ(WASM_I32, wasm_valtype_kind(*(tuple1.data + 0)));
  75. wasm_valtype_vec_delete(&tuple1);
  76. wasm_valtype_delete(val_type_1);
  77. wasm_valtype_t *val_types[5] = {
  78. wasm_valtype_new_i32(), wasm_valtype_new_i64(), wasm_valtype_new_f32(),
  79. wasm_valtype_new_f64(), wasm_valtype_new_funcref()
  80. };
  81. wasm_valtype_vec_t tuple2 = { 0 };
  82. wasm_valtype_vec_new(&tuple2, 5, val_types);
  83. EXPECT_NE(nullptr, tuple2.data);
  84. EXPECT_EQ(WASM_F32, wasm_valtype_kind(*(tuple2.data + 2)));
  85. EXPECT_EQ(WASM_FUNCREF, wasm_valtype_kind(*(tuple2.data + 4)));
  86. wasm_valtype_vec_t tuple3 = { 0 };
  87. wasm_valtype_vec_copy(&tuple3, &tuple2);
  88. wasm_valtype_vec_delete(&tuple2);
  89. EXPECT_EQ(WASM_I64, wasm_valtype_kind(*(tuple3.data + 1)));
  90. EXPECT_EQ(WASM_F64, wasm_valtype_kind(*(tuple3.data + 3)));
  91. wasm_valtype_vec_delete(&tuple3);
  92. }
  93. TEST_F(CApiTests, wasm_functype_t)
  94. {
  95. wasm_functype_t *callback_type = wasm_functype_new_1_1(
  96. wasm_valtype_new(WASM_EXTERNREF), wasm_valtype_new(WASM_FUNCREF));
  97. EXPECT_EQ(WASM_EXTERNREF,
  98. wasm_valtype_kind(*(wasm_functype_params(callback_type)->data)));
  99. wasm_functype_delete(callback_type);
  100. callback_type = wasm_functype_new_0_0();
  101. wasm_functype_delete(callback_type);
  102. callback_type = wasm_functype_new_0_1(wasm_valtype_new(WASM_EXTERNREF));
  103. const wasm_valtype_vec_t *results = wasm_functype_results(callback_type);
  104. EXPECT_EQ(WASM_EXTERNREF, wasm_valtype_kind(*(results->data)));
  105. wasm_functype_delete(callback_type);
  106. callback_type = wasm_functype_new_1_0(wasm_valtype_new(WASM_EXTERNREF));
  107. EXPECT_EQ(WASM_EXTERNREF,
  108. wasm_valtype_kind(*(wasm_functype_params(callback_type)->data)));
  109. wasm_functype_delete(callback_type);
  110. wasm_functype_t *func_type1 = wasm_functype_new_2_2(
  111. wasm_valtype_new(WASM_I32), wasm_valtype_new(WASM_I64),
  112. wasm_valtype_new(WASM_I32), wasm_valtype_new(WASM_I64));
  113. wasm_functype_t *func_type2 = wasm_functype_copy(func_type1);
  114. wasm_functype_delete(func_type1);
  115. EXPECT_EQ(WASM_I64, wasm_valtype_kind(
  116. *(wasm_functype_results(func_type2)->data + 1)));
  117. wasm_functype_delete(func_type2);
  118. }
  119. TEST_F(CApiTests, wasm_globaltype_t)
  120. {
  121. wasm_globaltype_t *const_f32_type =
  122. wasm_globaltype_new(wasm_valtype_new(WASM_F32), WASM_CONST);
  123. EXPECT_EQ(WASM_F32,
  124. wasm_valtype_kind(wasm_globaltype_content(const_f32_type)));
  125. wasm_globaltype_t *cloned = wasm_globaltype_copy(const_f32_type);
  126. wasm_globaltype_delete(const_f32_type);
  127. EXPECT_EQ(WASM_F32, wasm_valtype_kind(wasm_globaltype_content(cloned)));
  128. wasm_globaltype_delete(cloned);
  129. }
  130. static wasm_trap_t *
  131. test_func(const wasm_val_vec_t *args, own wasm_val_vec_t *results)
  132. {
  133. return NULL;
  134. }
  135. TEST_F(CApiTests, wasm_func_t)
  136. {
  137. wasm_valtype_t *types[4] = { wasm_valtype_new_i32(), wasm_valtype_new_i64(),
  138. wasm_valtype_new_i64(),
  139. wasm_valtype_new_i32() };
  140. wasm_valtype_vec_t tuple1 = { 0 }, tuple2 = { 0 };
  141. wasm_valtype_vec_new(&tuple1, 4, types);
  142. wasm_valtype_vec_copy(&tuple2, &tuple1);
  143. wasm_functype_t *callback_type = wasm_functype_new(&tuple1, &tuple2);
  144. wasm_store_t *store = wasm_store_new(engine);
  145. wasm_func_t *callback_func = wasm_func_new(store, callback_type, test_func);
  146. wasm_functype_delete(callback_type);
  147. callback_type = callback_func->type;
  148. EXPECT_EQ(WASM_I32, wasm_valtype_kind(
  149. *(wasm_functype_params(callback_type)->data + 0)));
  150. EXPECT_EQ(WASM_I32, wasm_valtype_kind(
  151. *(wasm_functype_results(callback_type)->data + 3)));
  152. wasm_func_delete(callback_func);
  153. wasm_store_delete(store);
  154. }