Projects
Eulaceura:Factory
iSulad
_service:obs_scm:0076-cdi-add-UT.patch
Sign Up
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File _service:obs_scm:0076-cdi-add-UT.patch of Package iSulad
From 0cd088174c94c56ee86506dab9a6a33f6e8fdaa4 Mon Sep 17 00:00:00 2001 From: liuxu <liuxu156@huawei.com> Date: Thu, 25 Apr 2024 10:52:20 +0800 Subject: [PATCH 76/78] cdi:add UT Signed-off-by: liuxu <liuxu156@huawei.com> --- CI/make-and-install.sh | 4 +- test/cutils/CMakeLists.txt | 1 + test/cutils/utils_array/utils_array_ut.cc | 128 ++++++++++ test/cutils/utils_utils/utils_utils_ut.cc | 12 + test/cutils/utils_version/CMakeLists.txt | 17 ++ test/cutils/utils_version/utils_version_ut.cc | 71 ++++++ .../image/oci/oci_config_merge/CMakeLists.txt | 1 + test/mocks/cdi_operate_api_mock.cc | 58 +++++ test/mocks/cdi_operate_api_mock.h | 35 +++ test/sandbox/controller/shim/CMakeLists.txt | 1 + test/specs/specs/CMakeLists.txt | 1 + test/specs/specs/specs_ut.cc | 241 ++++++++++++++++++ test/specs/specs_extend/CMakeLists.txt | 1 + 13 files changed, 569 insertions(+), 2 deletions(-) create mode 100644 test/cutils/utils_version/CMakeLists.txt create mode 100644 test/cutils/utils_version/utils_version_ut.cc create mode 100644 test/mocks/cdi_operate_api_mock.cc create mode 100644 test/mocks/cdi_operate_api_mock.h diff --git a/CI/make-and-install.sh b/CI/make-and-install.sh index 9bb984cd..9d4c5533 100755 --- a/CI/make-and-install.sh +++ b/CI/make-and-install.sh @@ -72,7 +72,7 @@ cd $ISULAD_COPY_PATH sed -i 's/fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO/fd == 0 || fd == 1 || fd == 2 || fd >= 1000/g' ./src/utils/cutils/utils.c rm -rf build mkdir build && cd build -cmake -DCMAKE_BUILD_TYPE=Debug -DENABLE_UT=ON -DENABLE_CRI_API_V1=ON -DENABLE_SHIM_V2=ON -DENABLE_METRICS=ON .. +cmake -DCMAKE_BUILD_TYPE=Debug -DENABLE_UT=ON -DENABLE_CRI_API_V1=ON -DENABLE_CDI=ON -DENABLE_SHIM_V2=ON -DENABLE_METRICS=ON .. make -j $(nproc) make install ctest -E "driver_devmapper_ut" -T memcheck --output-on-failure @@ -103,7 +103,7 @@ rm -rf build mkdir build cd build if [[ ${enable_gcov} -ne 0 ]]; then - cmake -DLIB_INSTALL_DIR=${builddir}/lib -DCMAKE_INSTALL_PREFIX=${builddir} -DCMAKE_INSTALL_SYSCONFDIR=${builddir}/etc -DCMAKE_BUILD_TYPE=Debug -DGCOV=ON -DENABLE_EMBEDDED=ON -DENABLE_COVERAGE=ON -DENABLE_CRI_API_V1=ON -DENABLE_UT=ON -DENABLE_METRICS=ON -DENABLE_REMOTE_LAYER_STORE=ON -DENABLE_GRPC_REMOTE_CONNECT=ON .. + cmake -DLIB_INSTALL_DIR=${builddir}/lib -DCMAKE_INSTALL_PREFIX=${builddir} -DCMAKE_INSTALL_SYSCONFDIR=${builddir}/etc -DCMAKE_BUILD_TYPE=Debug -DGCOV=ON -DENABLE_EMBEDDED=ON -DENABLE_COVERAGE=ON -DENABLE_CRI_API_V1=ON -DENABLE_CDI=ON -DENABLE_UT=ON -DENABLE_METRICS=ON -DENABLE_REMOTE_LAYER_STORE=ON -DENABLE_GRPC_REMOTE_CONNECT=ON .. else cmake -DLIB_INSTALL_DIR=${builddir}/lib -DCMAKE_INSTALL_PREFIX=${builddir} -DCMAKE_INSTALL_SYSCONFDIR=${builddir}/etc -DENABLE_EMBEDDED=ON -DENABLE_METRICS=ON -DENABLE_REMOTE_LAYER_STORE=ON -DENABLE_CRI_API_V1=ON -DENABLE_GRPC_REMOTE_CONNECT=ON .. fi diff --git a/test/cutils/CMakeLists.txt b/test/cutils/CMakeLists.txt index 9e681cc9..bd9def02 100644 --- a/test/cutils/CMakeLists.txt +++ b/test/cutils/CMakeLists.txt @@ -34,4 +34,5 @@ add_subdirectory(utils_utils) add_subdirectory(utils_verify) add_subdirectory(utils_network) add_subdirectory(utils_transform) +add_subdirectory(utils_version) add_subdirectory(map) diff --git a/test/cutils/utils_array/utils_array_ut.cc b/test/cutils/utils_array/utils_array_ut.cc index 7bd13c25..6c6e76fa 100644 --- a/test/cutils/utils_array/utils_array_ut.cc +++ b/test/cutils/utils_array/utils_array_ut.cc @@ -50,6 +50,33 @@ TEST(utils_array, test_util_free_array) util_free_array(array); } +TEST(utils_array, test_util_copy_array_by_len) +{ + char **array = nullptr; + char **array_copy = nullptr; + size_t len = 3; + + array = (char **)util_common_calloc_s(4 * sizeof(char *)); + ASSERT_NE(array, nullptr); + array[0] = util_strdup_s("test1"); + array[1] = util_strdup_s("test2"); + array[2] = util_strdup_s("test3"); + + array_copy = util_copy_array_by_len(array, len); + ASSERT_NE(array_copy, nullptr); + for (size_t i = 0; i < len; i++) { + ASSERT_EQ(strcmp(array_copy[i], array[i]), 0); + free(array[i]); + free(array_copy[i]); + } + + ASSERT_EQ(util_copy_array_by_len(array, 0), nullptr); + ASSERT_EQ(util_copy_array_by_len(nullptr, len), nullptr); + + free(array); + free(array_copy); +} + TEST(utils_array, test_util_grow_array) { char **array = nullptr; @@ -229,6 +256,34 @@ TEST(utils_array, test_util_append_string_array) sarray = nullptr; } +TEST(utils_array, test_util_copy_string_array) +{ + __isula_auto_string_array_t string_array *sarray_copy = nullptr; + __isula_auto_string_array_t string_array *sarray = (string_array *)util_common_calloc_s(sizeof(string_array)); + ASSERT_NE(sarray, nullptr); + int ret; + + ret = util_append_string_array(sarray, "1234567890"); + ASSERT_EQ(ret, 0); + ret = util_append_string_array(sarray, "abc"); + ASSERT_EQ(ret, 0); + ret = util_append_string_array(sarray, "bcd"); + ASSERT_EQ(ret, 0); + ASSERT_EQ(sarray->len, 3); + + sarray_copy = util_copy_string_array(sarray); + ASSERT_NE(sarray_copy, nullptr); + ASSERT_EQ(sarray_copy->len, sarray->len); + for (size_t i = 0; i < sarray_copy->len; i++) { + ASSERT_EQ(strcmp(sarray_copy->items[i], sarray->items[i]), 0); + } + + ASSERT_EQ(util_copy_string_array(nullptr), nullptr); + sarray->cap = 0; + ASSERT_EQ(util_copy_string_array(sarray), nullptr); + sarray->cap = sarray->len; +} + TEST(utils_array, test_util_string_array_contain) { string_array *sarray = (string_array *)util_common_calloc_s(sizeof(string_array)); @@ -299,3 +354,76 @@ TEST(utils_array, test_util_common_array_append_pointer) delete element1; delete element2; } + +static void common_array_free_mock(void *ptr) +{ + (void)ptr; + return; +} + +TEST(utils_array, test_util_append_common_array) +{ + __isula_auto_common_array_t common_array *carray = nullptr; + int ret; + int value1 = 1; + int value2 = 2; + int value3 = 3; + + carray = util_common_array_new(1, common_array_free_mock, util_clone_ptr); + ASSERT_NE(carray, nullptr); + + ret = util_append_common_array(carray, &value1); + ASSERT_EQ(ret, 0); + ASSERT_EQ(carray->items[0], &value1); + ASSERT_EQ(carray->len, 1); + + ret = util_append_common_array(carray, &value2); + ASSERT_EQ(ret, 0); + ret = util_append_common_array(carray, &value3); + ASSERT_EQ(ret, 0); + ASSERT_EQ(carray->items[1], &value2); + ASSERT_EQ(carray->items[2], &value3); + ASSERT_EQ(carray->len, 3); + + carray->clone_item_cb = nullptr; + ASSERT_EQ(util_append_common_array(carray, &value1), -1); + carray->clone_item_cb = util_clone_ptr; + ASSERT_EQ(util_append_common_array(carray, nullptr), 0); +} + +TEST(utils_array, test_util_merge_common_array) +{ + __isula_auto_common_array_t common_array *carray1 = nullptr; + __isula_auto_common_array_t common_array *carray2 = nullptr; + int ret; + int value1 = 1; + int value2 = 2; + + carray1 = util_common_array_new(1, common_array_free_mock, util_clone_ptr); + ASSERT_NE(carray1, nullptr); + carray2 = util_common_array_new(1, common_array_free_mock, util_clone_ptr); + ASSERT_NE(carray2, nullptr); + + ret = util_append_common_array(carray1, &value1); + ASSERT_EQ(ret, 0); + ASSERT_EQ(carray1->items[0], &value1); + ASSERT_EQ(carray1->len, 1); + ret = util_append_common_array(carray2, &value2); + ASSERT_EQ(ret, 0); + ASSERT_EQ(carray2->items[0], &value2); + ASSERT_EQ(carray2->len, 1); + + ret = util_merge_common_array(carray1, carray2); + ASSERT_EQ(ret, 0); + ASSERT_EQ(carray1->items[1], &value2); + ASSERT_EQ(carray1->len, 2); + + ASSERT_EQ(util_merge_common_array(nullptr, carray2), -1); + ASSERT_EQ(util_merge_common_array(carray1, nullptr), -1); + carray1->clone_item_cb = nullptr; + ASSERT_EQ(util_merge_common_array(carray1, carray2), -1); + carray1->clone_item_cb = util_clone_ptr; + carray2->clone_item_cb = nullptr; + ASSERT_EQ(util_merge_common_array(carray1, carray2), -1); + carray2->clone_item_cb = util_clone_ptr; +} \ No newline at end of file diff --git a/test/cutils/utils_utils/utils_utils_ut.cc b/test/cutils/utils_utils/utils_utils_ut.cc index 0720d1b1..a61e5a21 100644 --- a/test/cutils/utils_utils/utils_utils_ut.cc +++ b/test/cutils/utils_utils/utils_utils_ut.cc @@ -54,6 +54,18 @@ static int status_to_exit_code(int status) return exit_code; } +TEST(utils_utils, test_util_swap_ptr) +{ + int val1 = 1; + int val2 = 2; + int *ptr1 = &val1; + int *ptr2 = &val2; + + util_swap_ptr((void **)&ptr1, (void **)&ptr2); + ASSERT_EQ(*ptr1, val2); + ASSERT_EQ(*ptr2, val1); +} + TEST(utils_utils, test_util_mem_realloc) { char *old = nullptr; diff --git a/test/cutils/utils_version/CMakeLists.txt b/test/cutils/utils_version/CMakeLists.txt new file mode 100644 index 00000000..1ada8e93 --- /dev/null +++ b/test/cutils/utils_version/CMakeLists.txt @@ -0,0 +1,17 @@ +project(iSulad_UT) + +SET(EXE utils_version_ut) + +add_executable(${EXE} + utils_version_ut.cc) + +target_include_directories(${EXE} PUBLIC + ${GTEST_INCLUDE_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/../../include + ${CMAKE_CURRENT_SOURCE_DIR}/../../../src/common + ${CMAKE_CURRENT_SOURCE_DIR}/../../../src/utils/cutils + ) + +target_link_libraries(${EXE} ${GTEST_BOTH_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT} ${ISULA_LIBUTILS_LIBRARY} libutils_ut -lcrypto -lyajl -lz) +add_test(NAME ${EXE} COMMAND ${EXE} --gtest_output=xml:${EXE}-Results.xml) +set_tests_properties(${EXE} PROPERTIES TIMEOUT 120) diff --git a/test/cutils/utils_version/utils_version_ut.cc b/test/cutils/utils_version/utils_version_ut.cc new file mode 100644 index 00000000..d1fc0932 --- /dev/null +++ b/test/cutils/utils_version/utils_version_ut.cc @@ -0,0 +1,71 @@ +/****************************************************************************** + * Copyright (c) Huawei Technologies Co., Ltd. 2024. All rights reserved. + * iSulad 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: liuxu + * Create: 2024-04-25 + * Description: utils version unit test + *******************************************************************************/ + +#include <stdlib.h> +#include <stdio.h> +#include <climits> +#include <gtest/gtest.h> +#include "mock.h" +#include "utils_version.h" +#include "utils.h" + +TEST(utils_version, test_util_version_compare) +{ + const char *version1 = "1.1.1"; + const char *version2 = "1.1.2"; + int diff_value = 0; + + ASSERT_EQ(util_version_compare(version1, version2, &diff_value), 0); + ASSERT_TRUE(diff_value < 0); + ASSERT_EQ(util_version_compare(version1, version1, &diff_value), 0); + ASSERT_TRUE(diff_value == 0); + ASSERT_EQ(util_version_compare(version2, version1, &diff_value), 0); + ASSERT_TRUE(diff_value > 0); + + ASSERT_EQ(util_version_compare(version1, nullptr, &diff_value), -1); + ASSERT_EQ(util_version_compare(nullptr, version2, &diff_value), -1); + ASSERT_EQ(util_version_compare(version1, version2, nullptr), -1); + ASSERT_EQ(util_version_compare("1.1.1.1", version2, nullptr), -1); + ASSERT_EQ(util_version_compare(version1, "a.b.1.1", nullptr), -1); +} + +TEST(utils_version, test_util_version_greater_than) +{ + const char *version1 = "0.6.0"; + const char *version2 = "1.0.0"; + bool result = true; + + ASSERT_EQ(util_version_greater_than(version1, version2, &result), 0); + ASSERT_FALSE(result); + ASSERT_EQ(util_version_greater_than(version1, version1, &result), 0); + ASSERT_FALSE(result); + ASSERT_EQ(util_version_greater_than(version2, version1, &result), 0); + ASSERT_TRUE(result); +} + +TEST(utils_version, test_util_version_greater_than_or_equal_to) +{ + const char *version1 = "0.6.0"; + const char *version2 = "1.0.0"; + bool result = true; + + ASSERT_EQ(util_version_greater_than_or_equal_to(version1, version2, &result), 0); + ASSERT_FALSE(result); + ASSERT_EQ(util_version_greater_than_or_equal_to(version1, version1, &result), 0); + ASSERT_TRUE(result); + ASSERT_EQ(util_version_greater_than_or_equal_to(version2, version1, &result), 0); + ASSERT_TRUE(result); +} + diff --git a/test/image/oci/oci_config_merge/CMakeLists.txt b/test/image/oci/oci_config_merge/CMakeLists.txt index ffd3999d..38ade4ec 100644 --- a/test/image/oci/oci_config_merge/CMakeLists.txt +++ b/test/image/oci/oci_config_merge/CMakeLists.txt @@ -47,6 +47,7 @@ add_executable(${EXE} ${CMAKE_CURRENT_SOURCE_DIR}/../../../../test/mocks/selinux_label_mock.cc ${CMAKE_CURRENT_SOURCE_DIR}/../../../../test/mocks/storage_mock.cc ${CMAKE_CURRENT_SOURCE_DIR}/../../../../test/mocks/image_mock.cc + ${CMAKE_CURRENT_SOURCE_DIR}/../../../../test/mocks/cdi_operate_api_mock.cc oci_config_merge_ut.cc) target_include_directories(${EXE} PUBLIC diff --git a/test/mocks/cdi_operate_api_mock.cc b/test/mocks/cdi_operate_api_mock.cc new file mode 100644 index 00000000..d8f9f9d4 --- /dev/null +++ b/test/mocks/cdi_operate_api_mock.cc @@ -0,0 +1,58 @@ +/****************************************************************************** + * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved. + * iSulad 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: jikai + * Create: 2023-10-20 + * Description: provide image api mock + ******************************************************************************/ + +#include "cdi_operate_api_mock.h" + +namespace { +std::shared_ptr<MockCdiOperateApi> g_cdi_operate_api_mock = nullptr; +} + +void MockCdiOperateApi_SetMock(std::shared_ptr<MockCdiOperateApi> mock) +{ + g_cdi_operate_api_mock = mock; +} + +int cdi_operate_registry_init(char **specs_dirs, size_t specs_dirs_len) +{ + if (g_cdi_operate_api_mock != nullptr) { + return g_cdi_operate_api_mock->CdiOperateRegistryInit(specs_dirs, specs_dirs_len); + } + return 0; +} + +int cdi_operate_refresh(void) +{ + if (g_cdi_operate_api_mock != nullptr) { + return g_cdi_operate_api_mock->CdiOperateRefresh(); + } + return 0; +} + +int cdi_operate_inject_devices(oci_runtime_spec *spec, string_array *devices) +{ + if (g_cdi_operate_api_mock != nullptr) { + return g_cdi_operate_api_mock->CdiOperateInjectDevices(spec, devices); + } + return 0; +} + +int cdi_operate_parse_annotations(json_map_string_string *annotations, string_array **keys, + string_array **devices, char **error) +{ + if (g_cdi_operate_api_mock != nullptr) { + return g_cdi_operate_api_mock->CdiOperateParseAnnotations(annotations, keys, devices, error); + } + return 0; +} \ No newline at end of file diff --git a/test/mocks/cdi_operate_api_mock.h b/test/mocks/cdi_operate_api_mock.h new file mode 100644 index 00000000..c118ee7a --- /dev/null +++ b/test/mocks/cdi_operate_api_mock.h @@ -0,0 +1,35 @@ +/****************************************************************************** + * Copyright (c) Huawei Technologies Co., Ltd. 2023. All rights reserved. + * iSulad 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: liuxu + * Create: 2024-04-24 + * Description: provide cdi api mock + ******************************************************************************/ + +#ifndef ISULAD_TEST_MOCKS_CDI_OPERATE_API_MOCK_H +#define ISULAD_TEST_MOCKS_CDI_OPERATE_API_MOCK_H + +#include <gmock/gmock.h> +#include <memory> + +#include "cdi_operate_api.h" + +class MockCdiOperateApi { +public: + MOCK_METHOD2(CdiOperateRegistryInit, int(char **specs_dirs, size_t specs_dirs_len)); + MOCK_METHOD0(CdiOperateRefresh, int(void)); + MOCK_METHOD2(CdiOperateInjectDevices, int(oci_runtime_spec *spec, string_array *devices)); + MOCK_METHOD4(CdiOperateParseAnnotations, int(json_map_string_string *annotations, string_array **keys, + string_array **devices, char **error)); +}; + +void MockCdiOperateApi_SetMock(std::shared_ptr<MockCdiOperateApi> mock); + +#endif diff --git a/test/sandbox/controller/shim/CMakeLists.txt b/test/sandbox/controller/shim/CMakeLists.txt index 26a66e51..d18d1861 100644 --- a/test/sandbox/controller/shim/CMakeLists.txt +++ b/test/sandbox/controller/shim/CMakeLists.txt @@ -21,6 +21,7 @@ add_executable(${EXE} ${CMAKE_CURRENT_SOURCE_DIR}/../../../../test/mocks/callback_mock.cc ${CMAKE_CURRENT_SOURCE_DIR}/../../../../test/mocks/image_api_mock.cc ${CMAKE_CURRENT_SOURCE_DIR}/../../../../test/mocks/service_container_api_mock.cc + ${CMAKE_CURRENT_SOURCE_DIR}/../../../../test/mocks/cdi_operate_api_mock.cc ${CMAKE_CURRENT_SOURCE_DIR}/../../../../test/sandbox/controller/controller_common.cc ${CMAKE_CURRENT_SOURCE_DIR}/../../../../test/sandbox/controller/shim/shim_controller_ut.cc ) diff --git a/test/specs/specs/CMakeLists.txt b/test/specs/specs/CMakeLists.txt index 12c11f51..892d44d7 100644 --- a/test/specs/specs/CMakeLists.txt +++ b/test/specs/specs/CMakeLists.txt @@ -44,6 +44,7 @@ add_executable(${EXE} ${CMAKE_CURRENT_SOURCE_DIR}/../../../test/mocks/storage_mock.cc ${CMAKE_CURRENT_SOURCE_DIR}/../../../test/mocks/image_mock.cc ${CMAKE_CURRENT_SOURCE_DIR}/../../../test/mocks/sender_mock.cc + ${CMAKE_CURRENT_SOURCE_DIR}/../../../test/mocks/cdi_operate_api_mock.cc specs_ut.cc) target_include_directories(${EXE} PUBLIC diff --git a/test/specs/specs/specs_ut.cc b/test/specs/specs/specs_ut.cc index 6c42216d..47836e5b 100644 --- a/test/specs/specs/specs_ut.cc +++ b/test/specs/specs/specs_ut.cc @@ -564,6 +564,247 @@ TEST_F(SpecsUnitTest, test_update_devcies_for_oci_spec) free(err); } +#ifdef ENABLE_CDI +TEST_F(SpecsUnitTest, test_defs_process_add_multiple_env) +{ + size_t env_len = 2; + char **envs = (char **)util_common_calloc_s(sizeof(char *) * env_len); + ASSERT_NE(envs, nullptr); + defs_process *dp = (defs_process *)util_common_calloc_s(sizeof(defs_process)); + ASSERT_NE(dp, nullptr); + dp->env_len = 1; + dp->env = (char **)util_common_calloc_s(sizeof(char *) * dp->env_len); + ASSERT_NE(dp->env, nullptr); + + envs[0] = util_strdup_s("key0=value0"); + envs[1] = util_strdup_s("key1=value1"); + dp->env[0] = util_strdup_s("key0=value0_old"); + ASSERT_EQ(defs_process_add_multiple_env(dp, (const char **)envs, env_len), 0); + ASSERT_EQ(dp->env_len, 2); + ASSERT_EQ(strcmp(dp->env[0], envs[0]), 0); + ASSERT_EQ(strcmp(dp->env[1], envs[1]), 0); + + ASSERT_EQ(defs_process_add_multiple_env(dp, nullptr, env_len), 0); + ASSERT_EQ(defs_process_add_multiple_env(dp, (const char **)envs, 0), 0); + ASSERT_EQ(defs_process_add_multiple_env(nullptr, (const char **)envs, env_len), -1); + + free(envs[0]); + envs[0] = util_strdup_s("=value0"); + ASSERT_EQ(defs_process_add_multiple_env(dp, (const char **)envs, env_len), -1); + free(envs[0]); + envs[0] = util_strdup_s("key0="); + ASSERT_EQ(defs_process_add_multiple_env(dp, (const char **)envs, env_len), -1); + free(envs[0]); + envs[0] = util_strdup_s("key0xxxx"); + ASSERT_EQ(defs_process_add_multiple_env(dp, (const char **)envs, env_len), -1); + + free(dp->env[0]); + dp->env[0] = util_strdup_s("=value0"); + ASSERT_EQ(defs_process_add_multiple_env(dp, (const char **)envs, env_len), -1); + free(dp->env[0]); + dp->env[0] = util_strdup_s("key0="); + ASSERT_EQ(defs_process_add_multiple_env(dp, (const char **)envs, env_len), -1); + free(dp->env[0]); + dp->env[0] = util_strdup_s("key0xxxx"); + ASSERT_EQ(defs_process_add_multiple_env(dp, (const char **)envs, env_len), -1); + + free_defs_process(dp); + free(envs[0]); + free(envs[1]); + free(envs); +} + +TEST_F(SpecsUnitTest, test_spec_add_multiple_process_env) +{ + size_t env_len = 2; + char **envs = (char **)util_common_calloc_s(sizeof(char *) * env_len); + ASSERT_NE(envs, nullptr); + oci_runtime_spec *oci_spec = (oci_runtime_spec *)util_common_calloc_s(sizeof(oci_runtime_spec)); + ASSERT_NE(oci_spec, nullptr); + oci_spec->process = (defs_process *)util_common_calloc_s(sizeof(defs_process)); + ASSERT_NE(oci_spec->process, nullptr); + oci_spec->process->env_len = 1; + oci_spec->process->env = (char **)util_common_calloc_s(sizeof(char *) * oci_spec->process->env_len); + ASSERT_NE(oci_spec->process->env, nullptr); + + envs[0] = util_strdup_s("key0=value0"); + envs[1] = util_strdup_s("key1=value1"); + oci_spec->process->env[0] = util_strdup_s("key0=value0_old"); + ASSERT_EQ(spec_add_multiple_process_env(oci_spec, (const char **)envs, env_len), 0); + ASSERT_EQ(oci_spec->process->env_len, 2); + ASSERT_EQ(strcmp(oci_spec->process->env[0], envs[0]), 0); + ASSERT_EQ(strcmp(oci_spec->process->env[1], envs[1]), 0); + + ASSERT_EQ(spec_add_multiple_process_env(oci_spec, nullptr, env_len), 0); + ASSERT_EQ(spec_add_multiple_process_env(oci_spec, (const char **)envs, 0), 0); + ASSERT_EQ(spec_add_multiple_process_env(nullptr, (const char **)envs, env_len), -1); + + free(envs[0]); + envs[0] = util_strdup_s("=value0"); + ASSERT_EQ(spec_add_multiple_process_env(oci_spec, (const char **)envs, env_len), -1); + free(envs[0]); + envs[0] = util_strdup_s("key0="); + ASSERT_EQ(spec_add_multiple_process_env(oci_spec, (const char **)envs, env_len), -1); + free(envs[0]); + envs[0] = util_strdup_s("key0xxxx"); + ASSERT_EQ(spec_add_multiple_process_env(oci_spec, (const char **)envs, env_len), -1); + + free(oci_spec->process->env[0]); + oci_spec->process->env[0] = util_strdup_s("=value0"); + ASSERT_EQ(spec_add_multiple_process_env(oci_spec, (const char **)envs, env_len), -1); + free(oci_spec->process->env[0]); + oci_spec->process->env[0] = util_strdup_s("key0="); + ASSERT_EQ(spec_add_multiple_process_env(oci_spec, (const char **)envs, env_len), -1); + free(oci_spec->process->env[0]); + oci_spec->process->env[0] = util_strdup_s("key0xxxx"); + ASSERT_EQ(spec_add_multiple_process_env(oci_spec, (const char **)envs, env_len), -1); + + free_oci_runtime_spec(oci_spec); + free(envs[0]); + free(envs[1]); + free(envs); +} + +TEST_F(SpecsUnitTest, test_spec_add_device) +{ + defs_device *device = (defs_device *)util_common_calloc_s(sizeof(defs_device)); + ASSERT_NE(device, nullptr); + oci_runtime_spec *oci_spec = (oci_runtime_spec *)util_common_calloc_s(sizeof(oci_runtime_spec)); + ASSERT_NE(oci_spec, nullptr); + oci_spec->linux = (oci_runtime_config_linux *)util_common_calloc_s(sizeof(oci_runtime_config_linux)); + ASSERT_NE(oci_spec->linux, nullptr); + oci_spec->linux->devices_len = 1; + oci_spec->linux->devices = (defs_device **)util_common_calloc_s(sizeof(defs_device *) * oci_spec->linux->devices_len); + ASSERT_NE(oci_spec->linux->devices, nullptr); + + device->path = util_strdup_s("/device/path"); + oci_spec->linux->devices[0] = (defs_device *)util_common_calloc_s(sizeof(defs_device)); + ASSERT_NE(oci_spec->linux->devices[0], nullptr); + oci_spec->linux->devices[0]->path = util_strdup_s("/device/path"); + ASSERT_EQ(spec_add_device(oci_spec, device), 0); + ASSERT_EQ(oci_spec->linux->devices[0], device); + + oci_spec->linux->devices[0] = nullptr; + oci_spec->linux->devices_len = 0; + ASSERT_EQ(spec_add_device(oci_spec, device), 0); + ASSERT_EQ(oci_spec->linux->devices_len, 1); + ASSERT_EQ(oci_spec->linux->devices[0], device); + + ASSERT_EQ(spec_add_device(oci_spec, nullptr), -1); + ASSERT_EQ(spec_add_device(nullptr, device), -1); + + free_oci_runtime_spec(oci_spec); +} + +TEST_F(SpecsUnitTest, test_spec_add_linux_resources_device) +{ + oci_runtime_spec *oci_spec = (oci_runtime_spec *)util_common_calloc_s(sizeof(oci_runtime_spec)); + ASSERT_NE(oci_spec, nullptr); + oci_spec->linux = (oci_runtime_config_linux *)util_common_calloc_s(sizeof(oci_runtime_config_linux)); + ASSERT_NE(oci_spec->linux, nullptr); + oci_spec->linux->resources = (defs_resources *)util_common_calloc_s(sizeof(defs_resources)); + ASSERT_NE(oci_spec->linux->resources, nullptr); + oci_spec->linux->resources->devices_len = 1; + oci_spec->linux->resources->devices = (defs_device_cgroup **)util_common_calloc_s(sizeof(defs_device_cgroup *) * oci_spec->linux->resources->devices_len); + ASSERT_NE(oci_spec->linux->resources->devices, nullptr); + + oci_spec->linux->resources->devices[0] = (defs_device_cgroup *)util_common_calloc_s(sizeof(defs_device_cgroup)); + ASSERT_NE(oci_spec->linux->resources->devices[0], nullptr); + ASSERT_EQ(spec_add_linux_resources_device(oci_spec, true, "bind", 10, 9, "rwm"), 0); + ASSERT_EQ(oci_spec->linux->resources->devices_len, 2); + ASSERT_EQ(oci_spec->linux->resources->devices[1]->allow, true); + ASSERT_EQ(strcmp(oci_spec->linux->resources->devices[1]->type, "bind"), 0); + ASSERT_EQ(oci_spec->linux->resources->devices[1]->major, 10); + ASSERT_EQ(oci_spec->linux->resources->devices[1]->minor, 9); + ASSERT_EQ(strcmp(oci_spec->linux->resources->devices[1]->access, "rwm"), 0); + + ASSERT_EQ(spec_add_linux_resources_device(nullptr, true, "bind", 10, 9, "rwm"), -1); + + free_oci_runtime_spec(oci_spec); +} + +TEST_F(SpecsUnitTest, test_spec_remove_mount) +{ + oci_runtime_spec *oci_spec = (oci_runtime_spec *)util_common_calloc_s(sizeof(oci_runtime_spec)); + ASSERT_NE(oci_spec, nullptr); + oci_spec->mounts_len = 2; + oci_spec->mounts = (defs_mount **)util_common_calloc_s(sizeof(defs_mount *) * oci_spec->mounts_len); + ASSERT_NE(oci_spec->mounts, nullptr); + + oci_spec->mounts[0] = (defs_mount *)util_common_calloc_s(sizeof(defs_mount)); + ASSERT_NE(oci_spec->mounts[0], nullptr); + oci_spec->mounts[1] = (defs_mount *)util_common_calloc_s(sizeof(defs_mount)); + ASSERT_NE(oci_spec->mounts[1], nullptr); + oci_spec->mounts[0]->destination = util_strdup_s("/mount/path/0"); + oci_spec->mounts[1]->destination = util_strdup_s("/mount/path/1"); + spec_remove_mount(oci_spec, oci_spec->mounts[0]->destination); + ASSERT_EQ(oci_spec->mounts_len, 1); + ASSERT_EQ(strcmp(oci_spec->mounts[0]->destination, "/mount/path/1"), 0); + + free_oci_runtime_spec(oci_spec); +} + +TEST_F(SpecsUnitTest, test_spec_add_mount) +{ + defs_mount *mnt = (defs_mount *)util_common_calloc_s(sizeof(defs_mount)); + ASSERT_NE(mnt, nullptr); + oci_runtime_spec *oci_spec = (oci_runtime_spec *)util_common_calloc_s(sizeof(oci_runtime_spec)); + ASSERT_NE(oci_spec, nullptr); + oci_spec->mounts_len = 1; + oci_spec->mounts = (defs_mount **)util_common_calloc_s(sizeof(defs_mount *) * oci_spec->mounts_len ); + ASSERT_NE(oci_spec->mounts, nullptr); + + oci_spec->mounts[0] = (defs_mount *)util_common_calloc_s(sizeof(defs_mount)); + ASSERT_NE(oci_spec->mounts[0], nullptr); + oci_spec->mounts[0]->destination = util_strdup_s("/mount/path/0"); + ASSERT_EQ(spec_add_mount(oci_spec, mnt), 0); + ASSERT_EQ(oci_spec->mounts_len, 2); + ASSERT_EQ(oci_spec->mounts[1], mnt); + + ASSERT_EQ(spec_add_mount(nullptr, mnt), -1); + ASSERT_EQ(spec_add_mount(oci_spec, nullptr), -1); + + free_oci_runtime_spec(oci_spec); +} + +#define TEST_SPEC_ADD_HOOKS_ITEM_DEF(hooktype) \ + void test_spec_add_##hooktype##_hook(void) \ + { \ + defs_hook *hook = (defs_hook *)util_common_calloc_s(sizeof(defs_hook)); \ + ASSERT_NE(hook, nullptr); \ + oci_runtime_spec *oci_spec = (oci_runtime_spec *)util_common_calloc_s(sizeof(oci_runtime_spec)); \ + ASSERT_NE(oci_spec, nullptr); \ + oci_spec->hooks = (oci_runtime_spec_hooks *)util_common_calloc_s(sizeof(oci_runtime_spec_hooks)); \ + ASSERT_NE(oci_spec->hooks, nullptr); \ + oci_spec->hooks->hooktype##_len = 1; \ + oci_spec->hooks->hooktype = (defs_hook **)util_common_calloc_s(sizeof(defs_hook *) * oci_spec->hooks->hooktype##_len); \ + ASSERT_NE(oci_spec->hooks->hooktype, nullptr); \ + \ + oci_spec->hooks->hooktype[0] = (defs_hook *)util_common_calloc_s(sizeof(defs_hook)); \ + ASSERT_NE(oci_spec->hooks->hooktype[0], nullptr); \ + ASSERT_EQ(spec_add_##hooktype##_hook(oci_spec, hook), 0); \ + ASSERT_EQ(oci_spec->hooks->hooktype##_len, 2); \ + ASSERT_EQ(oci_spec->hooks->hooktype[1], hook); \ + \ + ASSERT_EQ(spec_add_##hooktype##_hook(nullptr, hook), -1); \ + ASSERT_EQ(spec_add_##hooktype##_hook(oci_spec, nullptr), -1); \ + \ + free_oci_runtime_spec(oci_spec); \ + } + +TEST_SPEC_ADD_HOOKS_ITEM_DEF(prestart) +TEST_SPEC_ADD_HOOKS_ITEM_DEF(poststart) +TEST_SPEC_ADD_HOOKS_ITEM_DEF(poststop) + +TEST_F(SpecsUnitTest, test_spec_add_hook) +{ + test_spec_add_prestart_hook(); + test_spec_add_poststart_hook(); + test_spec_add_poststop_hook(); +} + +#endif /* ENABLE_CDI */ + /********************************* UT for merge caps *******************************************/ struct capabilities_lens { size_t bounding_len; diff --git a/test/specs/specs_extend/CMakeLists.txt b/test/specs/specs_extend/CMakeLists.txt index 2fd37e1c..bd4d2dd6 100644 --- a/test/specs/specs_extend/CMakeLists.txt +++ b/test/specs/specs_extend/CMakeLists.txt @@ -44,6 +44,7 @@ add_executable(${EXE} ${CMAKE_CURRENT_SOURCE_DIR}/../../../test/mocks/storage_mock.cc ${CMAKE_CURRENT_SOURCE_DIR}/../../../test/mocks/image_mock.cc ${CMAKE_CURRENT_SOURCE_DIR}/../../../test/mocks/sender_mock.cc + ${CMAKE_CURRENT_SOURCE_DIR}/../../../test/mocks/cdi_operate_api_mock.cc specs_extend_ut.cc) target_include_directories(${EXE} PUBLIC -- 2.25.1
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.
浙ICP备2022010568号-2