mirror of
https://github.com/bytecodealliance/wasm-micro-runtime.git
synced 2025-02-06 23:15:16 +00:00
269 lines
8.8 KiB
C++
269 lines
8.8 KiB
C++
/*
|
|
* Copyright (C) 2019 Intel Corporation. All rights reserved.
|
|
* SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
*/
|
|
|
|
#include "test_helper.h"
|
|
#include "gtest/gtest.h"
|
|
#include "bh_platform.h"
|
|
|
|
#include <future>
|
|
|
|
class bh_vector_test_suite : public testing::Test
|
|
{
|
|
protected:
|
|
// You should make the members protected s.t. they can be
|
|
// accessed from sub-classes.
|
|
|
|
// virtual void SetUp() will be called before each test is run. You
|
|
// should define it if you need to initialize the varaibles.
|
|
// Otherwise, this can be skipped.
|
|
virtual void SetUp() {}
|
|
|
|
// virtual void TearDown() will be called after each test is run.
|
|
// You should define it if there is cleanup work to do. Otherwise,
|
|
// you don't have to provide it.
|
|
//
|
|
virtual void TearDown() {}
|
|
|
|
public:
|
|
WAMRRuntimeRAII<512 * 1024> runtime;
|
|
};
|
|
|
|
static inline void *
|
|
malloc_internal(uint64 size);
|
|
|
|
TEST_F(bh_vector_test_suite, bh_vector_init)
|
|
{
|
|
Vector *vector_ptr = nullptr;
|
|
|
|
// Normally. use_lock is true.
|
|
vector_ptr = (Vector *)wasm_runtime_malloc(sizeof(Vector));
|
|
memset(vector_ptr, 0, sizeof(Vector));
|
|
EXPECT_EQ(true, bh_vector_init(vector_ptr, 6, sizeof(Vector *), true));
|
|
// use_lock is false.
|
|
EXPECT_EQ(true, bh_vector_init(vector_ptr, 6, sizeof(Vector *), false));
|
|
// init_length == 0.
|
|
EXPECT_EQ(true, bh_vector_init(vector_ptr, 0, sizeof(Vector *), false));
|
|
// size_elem > UINT32_MAX.
|
|
EXPECT_EQ(true, bh_vector_init(vector_ptr, 6, UINT32_MAX + 1, false));
|
|
// init_length > UINT32_MAX.
|
|
EXPECT_EQ(true, bh_vector_init(vector_ptr, UINT32_MAX + 1, sizeof(Vector *),
|
|
false));
|
|
|
|
// Illegal parameters.
|
|
EXPECT_EQ(false, bh_vector_init(nullptr, 6, sizeof(Vector *), true));
|
|
}
|
|
|
|
TEST_F(bh_vector_test_suite, bh_vector_set)
|
|
{
|
|
Vector *vector_ptr = nullptr;
|
|
char elem_buf[] = "test_vector";
|
|
|
|
vector_ptr = (Vector *)wasm_runtime_malloc(sizeof(Vector));
|
|
memset(vector_ptr, 0, sizeof(Vector));
|
|
bh_vector_init(vector_ptr, 6, sizeof(elem_buf), true);
|
|
bh_vector_append(vector_ptr, "test");
|
|
|
|
// Normally. use_lock is true.
|
|
EXPECT_EQ(true, bh_vector_set(vector_ptr, 0, elem_buf));
|
|
|
|
// Illegal parameters: nullptr.
|
|
EXPECT_EQ(false, bh_vector_set(nullptr, 0, nullptr));
|
|
EXPECT_EQ(false, bh_vector_set(vector_ptr, 0, nullptr));
|
|
// Illegal parameters: index >= vector->num_elems.
|
|
EXPECT_EQ(false, bh_vector_set(vector_ptr, 1, elem_buf));
|
|
|
|
// Normally. use_lock is false.
|
|
bh_vector_init(vector_ptr, 6, sizeof(elem_buf), false);
|
|
bh_vector_append(vector_ptr, "test");
|
|
EXPECT_EQ(true, bh_vector_set(vector_ptr, 0, elem_buf));
|
|
}
|
|
|
|
TEST_F(bh_vector_test_suite, bh_vector_get)
|
|
{
|
|
Vector *vector_ptr = nullptr;
|
|
char elem_buf[] = "test_vector";
|
|
char get_elem[12] = { 0 };
|
|
|
|
vector_ptr = (Vector *)wasm_runtime_malloc(sizeof(Vector));
|
|
memset(vector_ptr, 0, sizeof(Vector));
|
|
bh_vector_init(vector_ptr, 6, sizeof(elem_buf), true);
|
|
bh_vector_append(vector_ptr, elem_buf);
|
|
|
|
// Normally. use_lock is true.
|
|
EXPECT_EQ(true, bh_vector_get(vector_ptr, 0, get_elem));
|
|
EXPECT_EQ(0, strncmp(elem_buf, get_elem, 11));
|
|
|
|
// Illegal parameters: nullptr.
|
|
EXPECT_EQ(false, bh_vector_get(nullptr, 0, nullptr));
|
|
EXPECT_EQ(false, bh_vector_get(vector_ptr, 0, nullptr));
|
|
// Illegal parameters: index >= vector->num_elems.
|
|
EXPECT_EQ(false, bh_vector_get(vector_ptr, 1, get_elem));
|
|
|
|
// Normally. use_lock is false.
|
|
bh_vector_init(vector_ptr, 6, sizeof(elem_buf), false);
|
|
bh_vector_append(vector_ptr, elem_buf);
|
|
EXPECT_EQ(true, bh_vector_get(vector_ptr, 0, get_elem));
|
|
EXPECT_EQ(0, strncmp(elem_buf, get_elem, 11));
|
|
}
|
|
|
|
TEST_F(bh_vector_test_suite, bh_vector_insert)
|
|
{
|
|
Vector *vector_ptr = nullptr;
|
|
char elem_buf[] = "test_vector";
|
|
char get_elem[12] = { 0 };
|
|
|
|
vector_ptr = (Vector *)wasm_runtime_malloc(sizeof(Vector));
|
|
memset(vector_ptr, 0, sizeof(Vector));
|
|
bh_vector_init(vector_ptr, 6, sizeof(elem_buf), true);
|
|
bh_vector_append(vector_ptr, "test");
|
|
bh_vector_append(vector_ptr, "test");
|
|
bh_vector_append(vector_ptr, "test");
|
|
bh_vector_append(vector_ptr, "test");
|
|
|
|
// Normally.
|
|
EXPECT_EQ(true, bh_vector_insert(vector_ptr, 0, elem_buf));
|
|
bh_vector_get(vector_ptr, 1, get_elem);
|
|
EXPECT_EQ(0, strncmp(elem_buf, get_elem, 11));
|
|
|
|
EXPECT_EQ(true, bh_vector_insert(vector_ptr, 2, elem_buf));
|
|
EXPECT_EQ(true, bh_vector_insert(vector_ptr, 5, elem_buf));
|
|
|
|
// Illegal parameters: nullptr.
|
|
EXPECT_EQ(false, bh_vector_insert(nullptr, 0, nullptr));
|
|
EXPECT_EQ(false, bh_vector_insert(vector_ptr, 0, nullptr));
|
|
EXPECT_EQ(0, strncmp(elem_buf, get_elem, 0));
|
|
// Illegal parameters: index >= vector->num_elems.
|
|
EXPECT_EQ(false, bh_vector_insert(vector_ptr, 10, elem_buf));
|
|
|
|
// "if (!extend_vector(vector, vector->num_elems + 1))" == true.
|
|
vector_ptr->num_elems = UINT32_MAX + 1;
|
|
EXPECT_EQ(false, bh_vector_insert(vector_ptr, 2, elem_buf));
|
|
|
|
// use_lock is false.
|
|
bh_vector_init(vector_ptr, 6, sizeof(elem_buf), false);
|
|
bh_vector_append(vector_ptr, "test");
|
|
EXPECT_EQ(true, bh_vector_insert(vector_ptr, 0, elem_buf));
|
|
}
|
|
|
|
TEST_F(bh_vector_test_suite, bh_vector_append)
|
|
{
|
|
Vector *vector_ptr = nullptr;
|
|
char elem_buf[] = "test_vector";
|
|
char get_elem[12] = { 0 };
|
|
|
|
vector_ptr = (Vector *)wasm_runtime_malloc(sizeof(Vector));
|
|
memset(vector_ptr, 0, sizeof(Vector));
|
|
bh_vector_init(vector_ptr, 6, sizeof(elem_buf), true);
|
|
|
|
// Normally.
|
|
EXPECT_EQ(true, bh_vector_append(vector_ptr, elem_buf));
|
|
bh_vector_get(vector_ptr, 0, get_elem);
|
|
EXPECT_EQ(0, strncmp(elem_buf, get_elem, 11));
|
|
|
|
// Illegal parameters: nullptr.
|
|
EXPECT_EQ(false, bh_vector_append(nullptr, nullptr));
|
|
EXPECT_EQ(false, bh_vector_append(vector_ptr, nullptr));
|
|
}
|
|
|
|
TEST_F(bh_vector_test_suite, bh_vector_remove)
|
|
{
|
|
Vector *vector_ptr = nullptr;
|
|
char elem_buf[] = "test_vector";
|
|
char old_elem[12] = { 0 };
|
|
|
|
vector_ptr = (Vector *)wasm_runtime_malloc(sizeof(Vector));
|
|
memset(vector_ptr, 0, sizeof(Vector));
|
|
bh_vector_init(vector_ptr, 6, sizeof(elem_buf), true);
|
|
bh_vector_append(vector_ptr, elem_buf);
|
|
bh_vector_append(vector_ptr, elem_buf);
|
|
bh_vector_append(vector_ptr, elem_buf);
|
|
bh_vector_append(vector_ptr, elem_buf);
|
|
|
|
// Normally.
|
|
// Remove the first one.
|
|
EXPECT_EQ(true, bh_vector_remove(vector_ptr, 0, old_elem));
|
|
// Remove the middle one.
|
|
EXPECT_EQ(true, bh_vector_remove(vector_ptr, 2, old_elem));
|
|
// Remove the last one.
|
|
EXPECT_EQ(true, bh_vector_remove(vector_ptr, 1, old_elem));
|
|
|
|
EXPECT_EQ(true, bh_vector_remove(vector_ptr, 0, nullptr));
|
|
|
|
// Illegal parameters: nullptr.
|
|
EXPECT_EQ(false, bh_vector_remove(nullptr, 0, nullptr));
|
|
EXPECT_EQ(false, bh_vector_remove(vector_ptr, 0, nullptr));
|
|
// Illegal parameters: index >= vector->num_elems.
|
|
EXPECT_EQ(false, bh_vector_remove(vector_ptr, 1, old_elem));
|
|
|
|
// use_lock is false.
|
|
bh_vector_init(vector_ptr, 6, sizeof(elem_buf), false);
|
|
bh_vector_append(vector_ptr, elem_buf);
|
|
EXPECT_EQ(true, bh_vector_remove(vector_ptr, 0, old_elem));
|
|
}
|
|
|
|
TEST_F(bh_vector_test_suite, bh_vector_size)
|
|
{
|
|
Vector *vector_ptr = nullptr;
|
|
char elem_buf[] = "test_vector";
|
|
|
|
vector_ptr = (Vector *)wasm_runtime_malloc(sizeof(Vector));
|
|
memset(vector_ptr, 0, sizeof(Vector));
|
|
bh_vector_init(vector_ptr, 6, sizeof(elem_buf), true);
|
|
bh_vector_append(vector_ptr, elem_buf);
|
|
|
|
EXPECT_EQ(1, bh_vector_size(vector_ptr));
|
|
EXPECT_EQ(0, bh_vector_size(nullptr));
|
|
}
|
|
|
|
TEST_F(bh_vector_test_suite, bh_vector_destroy)
|
|
{
|
|
Vector *vector_ptr = nullptr;
|
|
char elem_buf[] = "test_vector";
|
|
|
|
vector_ptr = (Vector *)wasm_runtime_malloc(sizeof(Vector));
|
|
memset(vector_ptr, 0, sizeof(Vector));
|
|
bh_vector_init(vector_ptr, 6, sizeof(elem_buf), true);
|
|
bh_vector_append(vector_ptr, elem_buf);
|
|
|
|
// Normally.
|
|
EXPECT_EQ(true, bh_vector_destroy(vector_ptr));
|
|
// Illegal parameters: nullptr.
|
|
EXPECT_EQ(false, bh_vector_destroy(nullptr));
|
|
|
|
// use_lock is false.
|
|
bh_vector_init(vector_ptr, 6, sizeof(elem_buf), false);
|
|
bh_vector_append(vector_ptr, elem_buf);
|
|
EXPECT_EQ(true, bh_vector_destroy(vector_ptr));
|
|
}
|
|
|
|
TEST_F(bh_vector_test_suite, bh_vector_thread_safety)
|
|
{
|
|
Vector *vector_ptr = nullptr;
|
|
char elem;
|
|
int32_t i = 0;
|
|
std::vector<std::future<void>> threads;
|
|
|
|
vector_ptr = (Vector *)wasm_runtime_malloc(sizeof(Vector));
|
|
memset(vector_ptr, 0, sizeof(Vector));
|
|
bh_vector_init(vector_ptr, 6, sizeof(elem), true);
|
|
|
|
for (i = 0; i < 8; i++) {
|
|
threads.push_back(std::async([&] {
|
|
for (int j = 0; j < 25; j++) {
|
|
bh_vector_append(vector_ptr, (void *)&elem);
|
|
}
|
|
}));
|
|
}
|
|
|
|
for (auto &t : threads) {
|
|
t.wait();
|
|
}
|
|
|
|
EXPECT_EQ(bh_vector_size(vector_ptr), 200);
|
|
|
|
// Normally.
|
|
EXPECT_EQ(true, bh_vector_destroy(vector_ptr));
|
|
}
|