| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- /*
- * 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 variables.
- // 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));
- }
|