This repository has been archived on 2023-11-05. You can view files and clone it, but cannot push or open issues or pull requests.
wrt/tests/dl.cpp
Paul Pan d94ec6ad13 feat: refactor dl_sym
1. refactor dl_sym
2. update test
2023-02-12 16:06:45 +08:00

164 lines
4.7 KiB
C++

#include <gtest/gtest.h>
#include <dlfcn.h>
extern "C" {
#include "utils/defs.h"
#include "wrt/lib/dl.h"
#include "wasm_exec_env.h"
}
DLContext dl_context;
WASMExecEnv exec_env;
void init() {
dl_context.mem.malloc = malloc;
dl_context.mem.free = free;
dl_init(&dl_context);
exec_env.attachment = &dl_context;
}
TEST(DLTest, InitAndFree) {
// use valgrind !
auto *context = (DLContext *)malloc(sizeof(DLContext));
ASSERT_NE(context, nullptr);
context->mem.malloc = malloc;
context->mem.free = free;
dl_init(context);
EXPECT_NE(context->symTable, nullptr);
for (auto &hnd : context->hnd) {
EXPECT_EQ(hnd.handle, nullptr);
}
for (auto &sym : context->sym) {
EXPECT_EQ(sym.symbol, nullptr);
EXPECT_EQ(sym.cif, nullptr);
EXPECT_EQ(sym.backref, 0);
}
dl_free(context);
free(context);
}
TEST(DLTest, OpenAndClose) {
init();
int handle = dl_open(&exec_env, "./SimpleLib.so", RTLD_LAZY);
ASSERT_GT(handle, 0);
int result = dl_close(&exec_env, handle);
EXPECT_EQ(result, WRT_OK);
handle = dl_open(&exec_env, "not_exists", RTLD_LAZY);
EXPECT_EQ(handle, WRT_ERROR);
handle = dl_open(&exec_env, "", RTLD_LAZY);
EXPECT_EQ(handle, WRT_ERROR);
handle = dl_open(&exec_env, nullptr, RTLD_LAZY);
EXPECT_EQ(handle, WRT_ERROR);
dl_free(&dl_context);
}
TEST(DLTest, ManyOpen) {
init();
int handles[DL_MAX_HANDLES];
for (int &handle : handles) {
handle = dl_open(&exec_env, "./SimpleLib.so", RTLD_LAZY);
ASSERT_GT(handle, 0);
}
{
int handle = dl_open(&exec_env, "./SimpleLib.so", RTLD_LAZY);
EXPECT_EQ(handle, WRT_ERROR);
}
for (int handle : handles) {
int result = dl_close(&exec_env, handle);
EXPECT_EQ(result, WRT_OK);
}
for (int i = 0; i < DL_MAX_HANDLES; i++) {
EXPECT_EQ(dl_context.hnd->handle, nullptr);
}
dl_free(&dl_context);
}
TEST(DLTest, GetCloseSym) {
init();
int hnd = dl_open(&exec_env, "./SimpleLib.so", RTLD_LAZY);
ASSERT_EQ(hnd, 1);
int sym;
sym = dl_sym(&exec_env, hnd, "fib_fast", "(i)i");
EXPECT_EQ(sym, 1);
EXPECT_NE(dl_context.sym[0].symbol, nullptr);
EXPECT_NE(dl_context.sym[0].cif, nullptr);
EXPECT_EQ(dl_context.sym[0].cif->nargs, 1);
EXPECT_EQ(dl_context.sym[0].cif->rtype, &ffi_type_sint);
EXPECT_EQ(dl_context.sym[0].cif->arg_types[0], &ffi_type_sint);
EXPECT_EQ(dl_context.sym[0].backref, 1);
sym = dl_sym(&exec_env, hnd, "fib_fast", "(v)i");
EXPECT_EQ(sym, WRT_ERROR);
dl_close_sym(&exec_env, 1);
EXPECT_EQ(dl_context.sym[0].symbol, nullptr);
EXPECT_EQ(dl_context.sym[0].cif, nullptr);
EXPECT_EQ(dl_context.sym[0].backref, 0);
dl_free(&dl_context);
}
TEST(DLTest, SignatureCheck) {
typedef struct {
const char *test;
bool result;
int arg_count;
bool has_ret;
} Case;
const static Case cases[] = {
{"", false, 0, false}, {"()", true, 0, false}, {"(i)", true, 1, false},
{"()i", true, 0, true}, {"(x)", false, 0, false}, {"()x", false, 0, false},
{"(i)f", true, 1, true}, {"(i)x", false, 0, false}, {"(x)f", false, 0, false},
{"i", false, 0, false}, {"i()", false, 0, false}, {"i(i)", false, 0, false},
{"(i)()", false, 0, false}, {"(ii", false, 0, false}, {"(iiffdd)l", true, 6, true},
{"(ffddii)ll", false, 0, false}, {"()ii", false, 0, false}, {"(i", false, 0, false},
{"(i(i))i", false, 0, false}, {"i)i", false, 0, false}, {"((i)i", false, 0, false},
{"(i))i", false, 0, false}, {"())", false, 0, false}};
init();
int hnd = dl_open(&exec_env, "./SimpleLib.so", RTLD_LAZY);
ASSERT_EQ(hnd, 1);
for (const auto &cur_case : cases) {
int sym = dl_sym(&exec_env, hnd, "fib_fast", cur_case.test);
if (cur_case.result) {
EXPECT_EQ(sym, 1);
EXPECT_NE(dl_context.sym[0].symbol, nullptr);
EXPECT_NE(dl_context.sym[0].cif, nullptr);
EXPECT_EQ(dl_context.sym[0].cif->nargs, cur_case.arg_count);
if (cur_case.has_ret) {
EXPECT_NE(dl_context.sym[0].cif->rtype, &ffi_type_void);
EXPECT_NE(dl_context.sym[0].cif->rtype, nullptr);
} else {
EXPECT_EQ(dl_context.sym[0].cif->rtype, &ffi_type_void);
}
dl_close_sym(&exec_env, 1);
EXPECT_EQ(dl_context.sym[0].symbol, nullptr);
EXPECT_EQ(dl_context.sym[0].cif, nullptr);
EXPECT_EQ(dl_context.sym[0].backref, 0);
} else {
EXPECT_EQ(sym, WRT_ERROR);
}
}
dl_free(&dl_context);
}