From 22c8ea8fddd43669a436226d1dce954b198ef12c Mon Sep 17 00:00:00 2001 From: lixiumei123 <82565631+lixiumei123@users.noreply.github.com> Date: Thu, 16 Sep 2021 11:04:41 +0800 Subject: [PATCH] add plugin manager test (#77) * add plugin manager test * Plugin manager test add a check if the plugin_info is equal to param_update --- include/neu_vector.h | 2 + src/core/plugin_manager.h | 9 + tests/CMakeLists.txt | 11 + tests/plugin_manager_test.cc | 427 +++++++++++++++++++++++++++++++++++ 4 files changed, 449 insertions(+) create mode 100644 tests/plugin_manager_test.cc diff --git a/include/neu_vector.h b/include/neu_vector.h index 3498bd27..cc0b6121 100644 --- a/include/neu_vector.h +++ b/include/neu_vector.h @@ -24,6 +24,8 @@ extern "C" { #endif +#include + #include "vector.h" typedef struct Vector vector_t; diff --git a/src/core/plugin_manager.h b/src/core/plugin_manager.h index ea942064..c939406e 100644 --- a/src/core/plugin_manager.h +++ b/src/core/plugin_manager.h @@ -20,6 +20,10 @@ #ifndef _PLUGIN_MANAGER_H #define _PLUGIN_MANAGER_H +#ifdef __cplusplus +extern "C" { +#endif + #include #include "adapter/adapter_internal.h" @@ -75,4 +79,9 @@ void plugin_manager_dump(plugin_manager_t *plugin_mng); void *load_plugin_library(char *plugin_lib_name, plugin_kind_e plugin_kind, neu_plugin_module_t **p_plugin_module); int unload_plugin_library(void *lib_handle, plugin_kind_e plugin_kind); + +#ifdef __cplusplus +} +#endif + #endif diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index a7f2e27f..5d23efcb 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -81,6 +81,16 @@ target_include_directories(data_val_test PRIVATE ) target_link_libraries(data_val_test neuron-base gtest_main gtest pthread jansson) +aux_source_directory(${CMAKE_SOURCE_DIR}/plugins/restful SRC_RESTFUL) +add_executable(plugin_manager_test plugin_manager_test.cc ${CMAKE_SOURCE_DIR}/src/core/plugin_manager.c ${SRC_RESTFUL} ${SRC_PARSER} ${CMAKE_SOURCE_DIR}/src/config.c) +target_include_directories(plugin_manager_test PRIVATE + ${CMAKE_SOURCE_DIR}/src + ${CMAKE_SOURCE_DIR}/include + ${CMAKE_SOURCE_DIR}/plugins +) +target_link_libraries(plugin_manager_test neuron-base gtest_main gtest pthread jansson dl nng yaml) +target_link_directories(plugin_manager_test PRIVATE /usr/local/lib) + include(GoogleTest) gtest_discover_tests(json_test) gtest_discover_tests(api_json_test) @@ -93,3 +103,4 @@ gtest_discover_tests(json_nodes_test) gtest_discover_tests(json_plugin_test) gtest_discover_tests(config_test) gtest_discover_tests(data_val_test) +gtest_discover_tests(plugin_manager_test) diff --git a/tests/plugin_manager_test.cc b/tests/plugin_manager_test.cc new file mode 100644 index 00000000..cbb138b5 --- /dev/null +++ b/tests/plugin_manager_test.cc @@ -0,0 +1,427 @@ +#include +#include + +#include "core/plugin_manager.h" + +#define NUM_DATATAGTABLE_MODIFY 100 + +TEST(PluginManagerTest, RegPluginManagerTest) +{ + plugin_manager_t *plugin_mng = plugin_manager_create(); + vector_t * plugin_info_vec = { 0 }; + + int index = 0; + plugin_reg_info_t reg_info = { 0 }; + + plugin_reg_param_t param1 = { PLUGIN_KIND_SYSTEM, ADAPTER_TYPE_WEBSERVER, + (char *) "plugin1", (char *) "lib1" }; + plugin_reg_param_t param2 = { PLUGIN_KIND_SYSTEM, ADAPTER_TYPE_WEBSERVER, + (char *) "plugin2", (char *) "lib2" }; + plugin_reg_param_t param3 = { PLUGIN_KIND_SYSTEM, ADAPTER_TYPE_WEBSERVER, + (char *) "plugin3", (char *) "lib3" }; + plugin_id_t p_plugin_id = { 0 }; + + plugin_id_t plugin_id1 = { 0 }; + plugin_id_t plugin_id2 = { 0 }; + plugin_id_t plugin_id3 = { 0 }; + + EXPECT_EQ(0, plugin_manager_reg_plugin(plugin_mng, ¶m1, &p_plugin_id)); + EXPECT_EQ(0, plugin_manager_reg_plugin(plugin_mng, ¶m2, &p_plugin_id)); + EXPECT_EQ(0, plugin_manager_reg_plugin(plugin_mng, ¶m3, &p_plugin_id)); + + /**plugin_manager_get_all_plugins**/ + plugin_info_vec = plugin_manager_get_all_plugins(plugin_mng); + VECTOR_FOR_EACH(plugin_info_vec, iter) + { + plugin_reg_info_t *info = (plugin_reg_info_t *) iterator_get(&iter); + + switch (index) { + case 1: + plugin_id1 = info->plugin_id; + + EXPECT_EQ(1, info->adapter_type); + EXPECT_EQ(1, info->plugin_kind); + EXPECT_STREQ("plugin1", info->plugin_name); + EXPECT_STREQ("lib1", info->plugin_lib_name); + break; + case 2: + plugin_id2 = info->plugin_id; + + EXPECT_EQ(1, info->adapter_type); + EXPECT_EQ(1, info->plugin_kind); + EXPECT_STREQ("plugin2", info->plugin_name); + EXPECT_STREQ("lib2", info->plugin_lib_name); + break; + case 3: + plugin_id3 = info->plugin_id; + + EXPECT_EQ(1, info->adapter_type); + EXPECT_EQ(1, info->plugin_kind); + EXPECT_STREQ("plugin3", info->plugin_name); + EXPECT_STREQ("lib3", info->plugin_lib_name); + break; + default: + break; + } + index += 1; + } + + /**plugin_manager_get_reg_info by plugin_id**/ + EXPECT_EQ(0, + plugin_manager_get_reg_info(plugin_mng, plugin_id1, ®_info)); + EXPECT_EQ(0, + plugin_manager_get_reg_info(plugin_mng, plugin_id2, ®_info)); + EXPECT_EQ(0, + plugin_manager_get_reg_info(plugin_mng, plugin_id3, ®_info)); + + /**plugin_manager_get_reg_info_by_name**/ + EXPECT_EQ(0, + plugin_manager_get_reg_info_by_name( + plugin_mng, (char *) "plugin1", ®_info)); + EXPECT_EQ(0, + plugin_manager_get_reg_info_by_name( + plugin_mng, (char *) "plugin2", ®_info)); + EXPECT_EQ(0, + plugin_manager_get_reg_info_by_name( + plugin_mng, (char *) "plugin3", ®_info)); + + vector_free(plugin_info_vec); + plugin_manager_unreg_all_plugins(plugin_mng); + plugin_manager_destroy(plugin_mng); +} + +TEST(PluginManagerTest, UnregPluginManagerTest) +{ + plugin_manager_t *plugin_mng = plugin_manager_create(); + vector_t * plugin_info_vec = { 0 }; + + int index = 0; + + plugin_id_t plugin_id1 = { 0 }; + plugin_id_t plugin_id2 = { 0 }; + plugin_id_t plugin_id3 = { 0 }; + + plugin_reg_info_t reg_info = { 0 }; + + plugin_reg_param_t param1 = { PLUGIN_KIND_SYSTEM, ADAPTER_TYPE_WEBSERVER, + (char *) "plugin1", (char *) "lib1" }; + plugin_reg_param_t param2 = { PLUGIN_KIND_SYSTEM, ADAPTER_TYPE_WEBSERVER, + (char *) "plugin2", (char *) "lib2" }; + plugin_reg_param_t param3 = { PLUGIN_KIND_SYSTEM, ADAPTER_TYPE_WEBSERVER, + (char *) "plugin3", (char *) "lib3" }; + plugin_id_t p_plugin_id = { 0 }; + + EXPECT_EQ(0, plugin_manager_reg_plugin(plugin_mng, ¶m1, &p_plugin_id)); + EXPECT_EQ(0, plugin_manager_reg_plugin(plugin_mng, ¶m2, &p_plugin_id)); + EXPECT_EQ(0, plugin_manager_reg_plugin(plugin_mng, ¶m3, &p_plugin_id)); + + plugin_info_vec = plugin_manager_get_all_plugins(plugin_mng); + VECTOR_FOR_EACH(plugin_info_vec, iter) + { + plugin_reg_info_t *info = (plugin_reg_info_t *) iterator_get(&iter); + + switch (index) { + case 1: + plugin_id1 = info->plugin_id; + break; + case 2: + plugin_id2 = info->plugin_id; + break; + case 3: + plugin_id3 = info->plugin_id; + break; + default: + break; + } + index += 1; + } + + plugin_manager_unreg_plugin(plugin_mng, plugin_id1); + EXPECT_EQ(-1, + plugin_manager_get_reg_info(plugin_mng, plugin_id1, ®_info)); + + /***plugin_manager_unreg_all_plugins***/ + plugin_manager_unreg_all_plugins(plugin_mng); + EXPECT_EQ(-1, + plugin_manager_get_reg_info(plugin_mng, plugin_id1, ®_info)); + EXPECT_EQ(-1, + plugin_manager_get_reg_info(plugin_mng, plugin_id2, ®_info)); + EXPECT_EQ(-1, + plugin_manager_get_reg_info(plugin_mng, plugin_id3, ®_info)); + + vector_free(plugin_info_vec); + plugin_manager_unreg_all_plugins(plugin_mng); + plugin_manager_destroy(plugin_mng); +} + +TEST(PluginManagerTest, UpdatePluginManagerTest) +{ + plugin_manager_t *plugin_mng = plugin_manager_create(); + vector_t * plugin_info_vec = { 0 }; + + int index = 0; + plugin_reg_info_t reg_info = { 0 }; + + plugin_reg_param_t param1 = { PLUGIN_KIND_SYSTEM, ADAPTER_TYPE_WEBSERVER, + (char *) "plugin1", (char *) "lib1" }; + plugin_reg_param_t param2 = { PLUGIN_KIND_SYSTEM, ADAPTER_TYPE_WEBSERVER, + (char *) "plugin2", (char *) "lib2" }; + plugin_reg_param_t param3 = { PLUGIN_KIND_SYSTEM, ADAPTER_TYPE_WEBSERVER, + (char *) "plugin3", (char *) "lib3" }; + plugin_reg_param_t param_update = { PLUGIN_KIND_SYSTEM, + ADAPTER_TYPE_WEBSERVER, + (char *) "plugin3", (char *) "lib4" }; + + plugin_id_t p_plugin_id = { 0 }; + + EXPECT_EQ(0, plugin_manager_reg_plugin(plugin_mng, ¶m1, &p_plugin_id)); + EXPECT_EQ(0, plugin_manager_reg_plugin(plugin_mng, ¶m2, &p_plugin_id)); + EXPECT_EQ(0, plugin_manager_reg_plugin(plugin_mng, ¶m3, &p_plugin_id)); + + EXPECT_EQ(0, plugin_manager_update_plugin(plugin_mng, ¶m_update)); + + plugin_info_vec = plugin_manager_get_all_plugins(plugin_mng); + VECTOR_FOR_EACH(plugin_info_vec, iter) + { + plugin_reg_info_t *info = (plugin_reg_info_t *) iterator_get(&iter); + + switch (index) { + case 3: + EXPECT_EQ(param_update.adapter_type, info->adapter_type); + EXPECT_EQ(param_update.plugin_kind, info->plugin_kind); + EXPECT_STREQ(param_update.plugin_name, info->plugin_name); + EXPECT_STREQ(param_update.plugin_lib_name, info->plugin_lib_name); + break; + default: + break; + } + index += 1; + } + + vector_free(plugin_info_vec); + plugin_manager_unreg_all_plugins(plugin_mng); + plugin_manager_destroy(plugin_mng); +} + +void *plugin_manager_thread(void *arg) +{ + plugin_manager_t *plugin_mng = (plugin_manager_t *) arg; + vector_t * plugin_info_vec = { 0 }; + + int index = 0; + + plugin_reg_info_t reg_info = { 0 }; + + plugin_reg_param_t param1 = { PLUGIN_KIND_SYSTEM, ADAPTER_TYPE_WEBSERVER, + (char *) "plugin1", (char *) "lib1" }; + plugin_reg_param_t param2 = { PLUGIN_KIND_SYSTEM, ADAPTER_TYPE_WEBSERVER, + (char *) "plugin2", (char *) "lib2" }; + plugin_reg_param_t param3 = { PLUGIN_KIND_SYSTEM, ADAPTER_TYPE_WEBSERVER, + (char *) "plugin3", (char *) "lib3" }; + plugin_reg_param_t param_update = { PLUGIN_KIND_SYSTEM, + ADAPTER_TYPE_WEBSERVER, + (char *) "plugin3", (char *) "lib4" }; + + plugin_id_t p_plugin_id = { 0 }; + + plugin_id_t plugin_id1 = { 0 }; + plugin_id_t plugin_id2 = { 0 }; + plugin_id_t plugin_id3 = { 0 }; + + /***plugin_manager_reg_plugin**/ + EXPECT_EQ(0, plugin_manager_reg_plugin(plugin_mng, ¶m1, &p_plugin_id)); + EXPECT_EQ(0, plugin_manager_reg_plugin(plugin_mng, ¶m2, &p_plugin_id)); + EXPECT_EQ(0, plugin_manager_reg_plugin(plugin_mng, ¶m3, &p_plugin_id)); + + /**plugin_manager_update_plugin**/ + EXPECT_EQ(0, plugin_manager_update_plugin(plugin_mng, ¶m_update)); + + /**plugin_manager_get_all_plugins**/ + plugin_info_vec = plugin_manager_get_all_plugins(plugin_mng); + VECTOR_FOR_EACH(plugin_info_vec, iter) + { + plugin_reg_info_t *info = (plugin_reg_info_t *) iterator_get(&iter); + + switch (index) { + case 1: + plugin_id1 = info->plugin_id; + + EXPECT_EQ(1, info->adapter_type); + EXPECT_EQ(1, info->plugin_kind); + EXPECT_STREQ("plugin1", info->plugin_name); + EXPECT_STREQ("lib1", info->plugin_lib_name); + + break; + case 2: + plugin_id2 = info->plugin_id; + + EXPECT_EQ(1, info->adapter_type); + EXPECT_EQ(1, info->plugin_kind); + EXPECT_STREQ("plugin2", info->plugin_name); + EXPECT_STREQ("lib2", info->plugin_lib_name); + break; + case 3: + plugin_id3 = info->plugin_id; + + EXPECT_EQ(param_update.adapter_type, info->adapter_type); + EXPECT_EQ(param_update.plugin_kind, info->plugin_kind); + EXPECT_STREQ(param_update.plugin_name, info->plugin_name); + EXPECT_STREQ(param_update.plugin_lib_name, info->plugin_lib_name); + break; + default: + break; + } + index += 1; + } + + /**plugin_manager_get_reg_info by plugin_id**/ + EXPECT_EQ(0, + plugin_manager_get_reg_info(plugin_mng, plugin_id1, ®_info)); + EXPECT_EQ(0, + plugin_manager_get_reg_info(plugin_mng, plugin_id2, ®_info)); + EXPECT_EQ(0, + plugin_manager_get_reg_info(plugin_mng, plugin_id3, ®_info)); + + /**plugin_manager_get_reg_info_by_name**/ + EXPECT_EQ(0, + plugin_manager_get_reg_info_by_name( + plugin_mng, (char *) "plugin1", ®_info)); + EXPECT_EQ(0, + plugin_manager_get_reg_info_by_name( + plugin_mng, (char *) "plugin2", ®_info)); + EXPECT_EQ(0, + plugin_manager_get_reg_info_by_name( + plugin_mng, (char *) "plugin3", ®_info)); + + /**plugin_manager_unreg_plugin**/ + plugin_manager_unreg_plugin(plugin_mng, plugin_id1); + EXPECT_EQ(-1, + plugin_manager_get_reg_info(plugin_mng, plugin_id1, ®_info)); + + vector_free(plugin_info_vec); + plugin_manager_unreg_all_plugins(plugin_mng); + plugin_manager_destroy(plugin_mng); + + return 0; +} + +void *plugin_manager_thread2(void *arg) +{ + plugin_manager_t *plugin_mng2 = (plugin_manager_t *) arg; + vector_t * plugin_info_vec = { 0 }; + + int index = 0; + + plugin_reg_info_t reg_info = { 0 }; + + plugin_reg_param_t param4 = { PLUGIN_KIND_SYSTEM, ADAPTER_TYPE_WEBSERVER, + (char *) "plugin4", (char *) "lib4" }; + plugin_reg_param_t param5 = { PLUGIN_KIND_SYSTEM, ADAPTER_TYPE_WEBSERVER, + (char *) "plugin5", (char *) "lib5" }; + plugin_reg_param_t param6 = { PLUGIN_KIND_SYSTEM, ADAPTER_TYPE_WEBSERVER, + (char *) "plugin6", (char *) "lib6" }; + plugin_reg_param_t param_update2 = { PLUGIN_KIND_SYSTEM, + ADAPTER_TYPE_WEBSERVER, + (char *) "plugin5", (char *) "lib7" }; + + plugin_id_t p_plugin_id = { 0 }; + + plugin_id_t plugin_id4 = { 0 }; + plugin_id_t plugin_id5 = { 0 }; + plugin_id_t plugin_id6 = { 0 }; + + /***plugin_manager_reg_plugin**/ + EXPECT_EQ(0, plugin_manager_reg_plugin(plugin_mng2, ¶m4, &p_plugin_id)); + EXPECT_EQ(0, plugin_manager_reg_plugin(plugin_mng2, ¶m5, &p_plugin_id)); + EXPECT_EQ(0, plugin_manager_reg_plugin(plugin_mng2, ¶m6, &p_plugin_id)); + + /**plugin_manager_get_all_plugins**/ + plugin_info_vec = plugin_manager_get_all_plugins(plugin_mng2); + VECTOR_FOR_EACH(plugin_info_vec, iter) + { + plugin_reg_info_t *info = (plugin_reg_info_t *) iterator_get(&iter); + + switch (index) { + case 1: + plugin_id4 = info->plugin_id; + + EXPECT_EQ(1, info->adapter_type); + EXPECT_EQ(1, info->plugin_kind); + EXPECT_STREQ("plugin4", info->plugin_name); + EXPECT_STREQ("lib4", info->plugin_lib_name); + + break; + case 2: + plugin_id5 = info->plugin_id; + + EXPECT_EQ(1, info->adapter_type); + EXPECT_EQ(1, info->plugin_kind); + EXPECT_STREQ("plugin5", info->plugin_name); + EXPECT_STREQ("lib5", info->plugin_lib_name); + break; + case 3: + plugin_id6 = info->plugin_id; + + EXPECT_EQ(1, info->adapter_type); + EXPECT_EQ(1, info->plugin_kind); + EXPECT_STREQ("plugin6", info->plugin_name); + EXPECT_STREQ("lib6", info->plugin_lib_name); + break; + default: + break; + } + index += 1; + } + + /**plugin_manager_get_reg_info by plugin_id**/ + EXPECT_EQ(0, + plugin_manager_get_reg_info(plugin_mng2, plugin_id4, ®_info)); + EXPECT_EQ(0, + plugin_manager_get_reg_info(plugin_mng2, plugin_id5, ®_info)); + EXPECT_EQ(0, + plugin_manager_get_reg_info(plugin_mng2, plugin_id6, ®_info)); + + /**plugin_manager_get_reg_info_by_name**/ + EXPECT_EQ(0, + plugin_manager_get_reg_info_by_name( + plugin_mng2, (char *) "plugin4", ®_info)); + EXPECT_EQ(0, + plugin_manager_get_reg_info_by_name( + plugin_mng2, (char *) "plugin5", ®_info)); + EXPECT_EQ(0, + plugin_manager_get_reg_info_by_name( + plugin_mng2, (char *) "plugin6", ®_info)); + + /**plugin_manager_update_plugin**/ + EXPECT_EQ(0, plugin_manager_update_plugin(plugin_mng2, ¶m_update2)); + + /**plugin_manager_unreg_plugin**/ + plugin_manager_unreg_plugin(plugin_mng2, plugin_id4); + EXPECT_EQ(-1, + plugin_manager_get_reg_info(plugin_mng2, plugin_id4, ®_info)); + + vector_free(plugin_info_vec); + plugin_manager_unreg_all_plugins(plugin_mng2); + plugin_manager_destroy(plugin_mng2); + + return 0; +} + +TEST(PluginManagerTest, PluginManagerPthread) +{ + pthread_t tids[2]; + int ret1, ret2; + plugin_manager_t *plugin_mng = plugin_manager_create(); + plugin_manager_t *plugin_mng2 = plugin_manager_create(); + + ret1 = pthread_create(&tids[0], NULL, plugin_manager_thread, + (void *) plugin_mng); + ret2 = pthread_create(&tids[1], NULL, plugin_manager_thread2, + (void *) plugin_mng2); + + pthread_join(tids[0], NULL); + pthread_join(tids[1], NULL); + + EXPECT_EQ(0, ret1); + EXPECT_EQ(0, ret2); +}