mirror of
				https://github.com/bytecodealliance/wasm-micro-runtime.git
				synced 2025-10-30 21:02:27 +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));
 | |
| }
 | 
