diff --git a/0003-add-testcase-for-clibcni.patch b/0003-add-testcase-for-clibcni.patch new file mode 100644 index 0000000..306982a --- /dev/null +++ b/0003-add-testcase-for-clibcni.patch @@ -0,0 +1,397 @@ +From 678baec08a80c65950180dd0e4c403c03d628693 Mon Sep 17 00:00:00 2001 +From: haozi007 +Date: Thu, 16 Sep 2021 04:57:01 +0100 +Subject: [PATCH] add testcase for clibcni + +Signed-off-by: haozi007 +--- + CMakeLists.txt | 5 + + clibcni.spec | 8 +- + tests/CMakeLists.txt | 48 ++++++++++ + tests/api_llt.cpp | 185 +++++++++++++++++++++++++++++++++++++ + tests/main.cpp | 22 +++++ + tests/utils/CMakeLists.txt | 7 ++ + tests/utils/constants.h | 37 ++++++++ + 7 files changed, 310 insertions(+), 2 deletions(-) + create mode 100644 tests/CMakeLists.txt + create mode 100644 tests/api_llt.cpp + create mode 100644 tests/main.cpp + create mode 100644 tests/utils/CMakeLists.txt + create mode 100644 tests/utils/constants.h + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index a5c7fec..fad4472 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -58,6 +58,11 @@ endif() + + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src) + ++option(ENABLE_UT "enble ut testcase" OFF) ++if (ENABLE_UT STREQUAL "ON") ++ add_subdirectory(tests) ++endif() ++ + # install all files + install(FILES ${CMAKE_BINARY_DIR}/conf/clibcni.pc + DESTINATION ${LIB_INSTALL_DIR_DEFAULT}/pkgconfig PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ GROUP_WRITE) +diff --git a/clibcni.spec b/clibcni.spec +index fa2046b..784538a 100644 +--- a/clibcni.spec ++++ b/clibcni.spec +@@ -12,7 +12,7 @@ BuildRoot: %{_tmppath}/%{name}-%{version} + + BuildRequires: gcc + BuildRequires: cmake +-BuildRequires: lcr-devel yajl-devel ++BuildRequires: lcr-devel yajl-devel gtest-devel + + Requires: lcr + +@@ -44,9 +44,13 @@ the %{name}-libs package contains libraries for running %{name} applications. + %build + mkdir -p build + cd build +-%cmake -DDEBUG=ON -DLIB_INSTALL_DIR=%{_libdir} ../ ++%cmake -DDEBUG=ON -DENABLE_UT=ON -DLIB_INSTALL_DIR=%{_libdir} ../ + %make_build + ++pushd tests ++ctest -V ++popd ++ + %install + rm -rf %{buildroot} + cd build +diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt +new file mode 100644 +index 0000000..6cb2c7b +--- /dev/null ++++ b/tests/CMakeLists.txt +@@ -0,0 +1,48 @@ ++enable_testing() ++find_package(GTest REQUIRED) ++ ++set(CMAKE_C_COMPILER "g++" CACHE PATH "c compiler") ++set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x") ++ ++include_directories( ++ ${GTEST_INCLUDE_DIR} ++ PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ++ PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/utils ++ PUBLIC ${CMAKE_SOURCE_DIR}/src ++ PUBLIC ${CMAKE_SOURCE_DIR}/src/version/ ++ PUBLIC ${CMAKE_SOURCE_DIR}/src/types/ ++ PUBLIC ${CMAKE_SOURCE_DIR}/src/invoke/ ++ PUBLIC ${CMAKE_SOURCE_DIR}/src/json ++ PUBLIC ${CMAKE_SOURCE_DIR}/src/json/schema/src ++ PUBLIC ${CMAKE_BINARY_DIR}/json ++ PUBLIC ${CMAKE_BINARY_DIR}/conf ++ ) ++ ++add_subdirectory(utils) ++ ++macro(_DEFINE_NEW_TEST) ++ add_executable(${ARGV0} ++ ${TESTS_UTILS_SRCS} ++ main.cpp ++ ${ARGV0}.cpp ++ ) ++ ++ target_link_libraries(${ARGV0} ++ clibcni ++ gtest ++ -lyajl ++ pthread ++ ) ++ ++ add_test( ++ NAME ${ARGV1} ++ COMMAND ${ARGV0} ++ ) ++endmacro() ++ ++# --------------- testcase add here ----------------- ++# api testcase ++_DEFINE_NEW_TEST(api_llt api_testcase) ++ ++# --------------- testcase add finish ----------------- ++ +diff --git a/tests/api_llt.cpp b/tests/api_llt.cpp +new file mode 100644 +index 0000000..d21ec01 +--- /dev/null ++++ b/tests/api_llt.cpp +@@ -0,0 +1,185 @@ ++/* ++ * Copyright (c) Huawei Technologies Co., Ltd. 2019. All rights reserved. ++ * clibcni licensed under the Mulan PSL v2. ++ * You can use this software according to the terms and conditions of the Mulan PSL v2. ++ * You may obtain a copy of Mulan PSL v2 at: ++ * http://license.coscl.org.cn/MulanPSL2 ++ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR ++ * PURPOSE. ++ * See the Mulan PSL v2 for more details. ++ * Author: haozi007 ++ * Create: 2021-09-16 ++ * Description: provide cni api functions ++ */ ++#include ++ ++#include ++ ++#include ++#include ++ ++#include "api.h" ++#include "version.h" ++#include "conf.h" ++#include "constants.h" ++ ++ ++void api_check_network_config_list(struct cni_network_list_conf *conf, const char *target_name, bool check_plugin_name) ++{ ++ /* check network_config_list */ ++ ASSERT_NE(conf, nullptr); ++ ASSERT_NE(conf->first_plugin_name, nullptr); ++ ASSERT_NE(conf->first_plugin_type, nullptr); ++ EXPECT_STREQ(target_name, conf->name); ++ ASSERT_NE(conf->bytes, nullptr); ++ ++ struct network_config_list *tmp = NULL; ++ char *err = NULL; ++ int ret = conflist_from_bytes(conf->bytes, &tmp, &err); ++ if (ret != 0) { ++ std::cout << "conflist parse failed:" << err << std::endl; ++ } ++ free(err); ++ ASSERT_EQ(ret , 0); ++ ++ /* check net_conf_list */ ++ EXPECT_STREQ("0.3.0", tmp->list->cni_version); ++ EXPECT_STREQ(target_name, tmp->list->name); ++ ASSERT_NE(tmp->list->plugins, nullptr); ++ ASSERT_EQ(tmp->list->plugins_len, 2); ++ EXPECT_STREQ("0.3.0", tmp->list->plugins[0]->cni_version); ++ if (check_plugin_name) { ++ EXPECT_STREQ(target_name, tmp->list->plugins[0]->name); ++ } ++ EXPECT_STREQ("bridge", tmp->list->plugins[0]->type); ++ ASSERT_EQ(tmp->list->plugins[0]->dns, nullptr); ++ ASSERT_EQ(tmp->list->plugins[0]->runtime_config, nullptr); ++ ASSERT_EQ(tmp->list->plugins[0]->capabilities, nullptr); ++ ASSERT_EQ(tmp->list->plugins[0]->prev_result, nullptr); ++ EXPECT_STREQ("10.1.0.1", tmp->list->plugins[1]->dns->nameservers[0]); ++ EXPECT_STREQ("bridge", tmp->list->plugins[1]->type); ++ ++ free_network_config_list(tmp); ++} ++ ++TEST(api_testcases, cni_conflist_from_bytes) ++{ ++ int ret; ++ struct cni_network_list_conf *new_list = NULL; ++ char *err = NULL; ++ ++ ret = cni_conflist_from_bytes(COMMON_CONF_LIST, &new_list, &err); ++ if (ret != 0) { ++ std::cout << "conflist parse failed:" << err << std::endl; ++ } ++ free(err); ++ std::cout << new_list->bytes << std::endl; ++ ++ api_check_network_config_list(new_list, "default", true); ++ ++ free(err); ++ free_cni_network_list_conf(new_list); ++} ++ ++void api_check_network_config_list_from_conf(struct cni_network_list_conf *conf, const char *target_name, bool check_plugin_name) ++{ ++ /* check network_config_list */ ++ ASSERT_NE(conf, nullptr); ++ ASSERT_NE(conf->first_plugin_name, nullptr); ++ ASSERT_NE(conf->first_plugin_type, nullptr); ++ EXPECT_STREQ(target_name, conf->name); ++ ASSERT_NE(conf->bytes, nullptr); ++ ++ struct network_config_list *tmp = NULL; ++ char *err = NULL; ++ int ret = conflist_from_bytes(conf->bytes, &tmp, &err); ++ if (ret != 0) { ++ std::cout << "conflist parse failed:" << err << std::endl; ++ } ++ free(err); ++ ASSERT_EQ(ret , 0); ++ ++ /* check net_conf_list */ ++ EXPECT_STREQ("0.3.0", tmp->list->cni_version); ++ EXPECT_STREQ(target_name, tmp->list->name); ++ ASSERT_NE(tmp->list->plugins, nullptr); ++ ASSERT_EQ(tmp->list->plugins_len, 1); ++ EXPECT_STREQ("0.3.0", tmp->list->plugins[0]->cni_version); ++ if (check_plugin_name) { ++ EXPECT_STREQ(target_name, tmp->list->plugins[0]->name); ++ } ++ EXPECT_STREQ("bridge", tmp->list->plugins[0]->type); ++ ASSERT_NE(tmp->list->plugins[0]->dns, nullptr); ++ EXPECT_STREQ("10.1.0.1", tmp->list->plugins[0]->dns->nameservers[0]); ++ EXPECT_STREQ("bridge", tmp->list->plugins[0]->type); ++ ASSERT_EQ(tmp->list->plugins[0]->runtime_config, nullptr); ++ ASSERT_EQ(tmp->list->plugins[0]->capabilities, nullptr); ++ ASSERT_EQ(tmp->list->plugins[0]->prev_result, nullptr); ++ ASSERT_NE(tmp->list->plugins[0]->ipam, nullptr); ++ EXPECT_STREQ("host-local", tmp->list->plugins[0]->ipam->type); ++ EXPECT_STREQ("10.1.0.0/16", tmp->list->plugins[0]->ipam->subnet); ++ EXPECT_STREQ("10.1.0.1", tmp->list->plugins[0]->ipam->gateway); ++ ++ free_network_config_list(tmp); ++} ++ ++TEST(api_testcases, cni_conflist_from_conf) ++{ ++ int ret; ++ struct cni_network_list_conf *new_list = NULL; ++ char *err = NULL; ++ struct cni_network_conf test = { ++ .name = "default", ++ .type = "bridge", ++ .bytes = COMMON_CONF, ++ }; ++ ++ ret = cni_conflist_from_conf(&test, &new_list, &err); ++ if (ret != 0) { ++ std::cout << "conflist parse failed:" << err << std::endl; ++ } ++ free(err); ++ std::cout << new_list->bytes << std::endl; ++ ++ api_check_network_config_list_from_conf(new_list, "default", true); ++ ++ free(err); ++ free_cni_network_list_conf(new_list); ++} ++ ++TEST(api_testcases, get_version_info) ++{ ++ const std::string CNI_PLUGIN_PATH = "/opt/cni/bin/"; ++ char *err = nullptr; ++ struct plugin_info *pinfo = nullptr; ++ size_t i = 0; ++ int ret = 0; ++ char *paths[] = {strdup(CNI_PLUGIN_PATH.c_str()), nullptr}; ++ const std::string bridge_name = "bridge"; ++ ++ ret = cni_get_version_info(bridge_name.c_str(), paths, &pinfo, &err); ++ if (ret != 0) { ++ if (strstr(err, "No such file or directory") != nullptr) { ++ std::cout << "Skip: cni_get_version_info api cause by no bridge plugin found" << std::endl; ++ return; ++ } ++ std::cout << "Get version failed:" << err << std::endl; ++ } ++ ASSERT_EQ(ret, 0); ++ ++ /* check plugin info */ ++ EXPECT_STREQ("0.4.0", pinfo->cniversion); ++ ASSERT_LE(0, pinfo->supported_versions_len); ++ for (i = 0; i < pinfo->supported_versions_len; i++) { ++ if (strcmp(pinfo->supported_versions[i], CURRENT_VERSION) == 0) { ++ break; ++ } ++ } ++ ASSERT_LE(i, pinfo->supported_versions_len); ++ ++ free_plugin_info(pinfo); ++ free(paths[0]); ++ paths[0] = nullptr; ++} ++ +diff --git a/tests/main.cpp b/tests/main.cpp +new file mode 100644 +index 0000000..7a4bc09 +--- /dev/null ++++ b/tests/main.cpp +@@ -0,0 +1,22 @@ ++/* ++ * Copyright (c) Huawei Technologies Co., Ltd. 2019. All rights reserved. ++ * clibcni licensed under the Mulan PSL v2. ++ * You can use this software according to the terms and conditions of the Mulan PSL v2. ++ * You may obtain a copy of Mulan PSL v2 at: ++ * http://license.coscl.org.cn/MulanPSL2 ++ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR ++ * PURPOSE. ++ * See the Mulan PSL v2 for more details. ++ * Author: haozi007 ++ * Create: 2021-09-16 ++ * Description: provide cni api functions ++ */ ++ ++#include "gtest/gtest.h" ++ ++int main(int argc, char **argv) { ++ testing::InitGoogleTest(&argc, argv); ++ ++ return RUN_ALL_TESTS(); ++} +diff --git a/tests/utils/CMakeLists.txt b/tests/utils/CMakeLists.txt +new file mode 100644 +index 0000000..9b01eb6 +--- /dev/null ++++ b/tests/utils/CMakeLists.txt +@@ -0,0 +1,7 @@ ++# get current directory sources files ++aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR} local_cutils_srcs) ++ ++set(TESTS_UTILS_SRCS ++ ${local_cutils_srcs} ++ PARENT_SCOPE ++ ) +diff --git a/tests/utils/constants.h b/tests/utils/constants.h +new file mode 100644 +index 0000000..1f06bfc +--- /dev/null ++++ b/tests/utils/constants.h +@@ -0,0 +1,37 @@ ++/* ++ * Copyright (c) Huawei Technologies Co., Ltd. 2019. All rights reserved. ++ * clibcni licensed under the Mulan PSL v2. ++ * You can use this software according to the terms and conditions of the Mulan PSL v2. ++ * You may obtain a copy of Mulan PSL v2 at: ++ * http://license.coscl.org.cn/MulanPSL2 ++ * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR ++ * IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR ++ * PURPOSE. ++ * See the Mulan PSL v2 for more details. ++ * Author: haozi007 ++ * Create: 2021-09-16 ++ * Description: provide cni api functions ++ */ ++#ifndef _TESTS_CONSTANTS_H ++#define _TESTS_CONSTANTS_H ++ ++#ifdef __cplusplus ++extern "C" { ++#endif ++ ++#define DEFAULT_CNI_BIN_PATH "/opt/cni/bin" ++ ++#define COMMON_CONF_LIST "{\"cniVersion\":\"0.3.0\",\"name\":\"default\", \ ++ \"plugins\":[{\"cniVersion\":\"0.3.0\", \"name\":\"default\",\"type\":\"bridge\"}, \ ++ {\"name\": \"exist\",\"type\": \"bridge\", \"dns\": {\"nameservers\": [\"10.1.0.1\"]}}]}" ++ ++#define COMMON_CONF "{\"cniVersion\":\"0.3.0\",\"name\":\"default\", \ ++ \"type\": \"bridge\", \"bridge\": \"cni0\", \"isGateway\": \"true\", \ ++ \"ipam\": {\"type\": \"host-local\", \"subnet\": \"10.1.0.0/16\", \"gateway\": \"10.1.0.1\"},\ ++ \"dns\": {\"nameservers\": [\"10.1.0.1\"]}}" ++ ++#ifdef __cplusplus ++} ++#endif ++ ++#endif +-- +2.20.1 + diff --git a/clibcni.spec b/clibcni.spec index 99379b8..b7b9ca9 100644 --- a/clibcni.spec +++ b/clibcni.spec @@ -1,5 +1,5 @@ %global _version 2.0.4 -%global _release 20210628.190359.git14c104bc +%global _release 20210916.073015.gitf0a2cb38 Name: clibcni Version: %{_version} Release: %{_release} @@ -12,10 +12,11 @@ BuildRoot: %{_tmppath}/%{name}-%{version} Patch0001: 0001-fix-CNI_ARGS-value-when-there-is-no-args.patch Patch0002: 0002-add-error-info-for-failed-run-cni-plugin.patch +Patch0003: 0003-add-testcase-for-clibcni.patch BuildRequires: gcc git gcc-c++ BuildRequires: cmake -BuildRequires: lcr-devel yajl-devel +BuildRequires: lcr-devel yajl-devel gtest-devel Requires: lcr @@ -46,9 +47,13 @@ the %{name}-libs package contains libraries for running %{name} applications. %build mkdir -p build cd build -%cmake -DDEBUG=ON -DLIB_INSTALL_DIR=%{_libdir} ../ +%cmake -DDEBUG=ON -DENABLE_UT=ON -DLIB_INSTALL_DIR=%{_libdir} ../ %make_build +pushd tests +ctest -V +popd + %install rm -rf %{buildroot} cd build