| /* |
| * SPDX-License-Identifier: BSD-2-Clause |
| * Copyright 2019, Intel Corporation |
| */ |
| |
| #include <inttypes.h> |
| #include <limits.h> |
| #include <stdarg.h> |
| #include <stdbool.h> |
| #include <stdlib.h> |
| #include <stdio.h> |
| #include <string.h> |
| |
| #include <setjmp.h> |
| #include <cmocka.h> |
| |
| #include "tss2_tcti.h" |
| #include "tss2_tctildr.h" |
| |
| #include "tss2-tcti/tctildr.h" |
| #include "tss2-tcti/tcti-common.h" |
| |
| static char* name_dup = "name_dup"; |
| static char* description_dup = "description_dup"; |
| static char* config_help_dup = "config_help_dup"; |
| |
| static TSS2_TCTI_INFO info_src = { |
| .version = 1, |
| .name = "name", |
| .description = "description", |
| .config_help = "config_help", |
| }; |
| static TSS2_TCTI_INFO info_dst = { 0, }; |
| |
| char* |
| __real_strndup (const char *s, size_t n); |
| char* |
| __wrap_strndup (const char *s, |
| size_t n) |
| { |
| if (s == info_src.name || \ |
| s == info_src.description || \ |
| s == info_src.config_help) |
| { |
| printf("%s: got known string\n", __func__); |
| errno = mock_type (int); |
| return mock_type (char*); |
| } else { |
| return __real_strndup (s, n); |
| } |
| } |
| |
| void __real_free (void *ptr); |
| void |
| __wrap_free (void *ptr) |
| { |
| printf("%s: %p\n", __func__, ptr); |
| if (ptr == name_dup || \ |
| ptr == description_dup || \ |
| ptr == config_help_dup || \ |
| ptr == &info_dst) |
| { |
| printf("%s: got known memory\n", __func__); |
| return; |
| } else { |
| printf("%s: real free\n", __func__); |
| return __real_free (ptr); |
| } |
| } |
| TSS2_RC |
| __wrap_tctildr_get_info (const char *name, |
| const TSS2_TCTI_INFO **info, |
| void **data) |
| { |
| TSS2_RC rc = mock_type (TSS2_RC); |
| if (rc == TSS2_RC_SUCCESS) { |
| *info = mock_type (TSS2_TCTI_INFO*); |
| *data = mock_type (void*); |
| } |
| return rc; |
| } |
| |
| TSS2_RC |
| __wrap_tctildr_get_tcti (const char *name, |
| const char* conf, |
| TSS2_TCTI_CONTEXT **tcti, |
| void **data) |
| { |
| TSS2_RC rc = mock_type (TSS2_RC); |
| if (rc == TSS2_RC_SUCCESS) { |
| *tcti= mock_type (TSS2_TCTI_CONTEXT*); |
| *data = mock_type (void*); |
| } |
| return rc; |
| } |
| void __wrap_tctildr_finalize_data (void **data) {} |
| |
| static void |
| copyinfo_null_params (void **state) |
| { |
| TSS2_RC rc = copy_info (NULL, NULL); |
| assert_int_equal (rc, TSS2_TCTI_RC_BAD_REFERENCE); |
| } |
| static void |
| copyinfo_strndup1_fail (void **state) |
| { |
| TSS2_TCTI_INFO info_dst = { 0, }; |
| will_return (__wrap_strndup, ENOMEM); |
| will_return (__wrap_strndup, NULL); |
| TSS2_RC rc = copy_info (&info_src, &info_dst); |
| assert_int_equal (rc, TSS2_TCTI_RC_GENERAL_FAILURE); |
| } |
| static void |
| copyinfo_strndup2_fail (void **state) |
| { |
| TSS2_TCTI_INFO info_dst = { 0, }; |
| will_return (__wrap_strndup, 0); |
| will_return (__wrap_strndup, name_dup); |
| will_return (__wrap_strndup, ENOMEM); |
| will_return (__wrap_strndup, NULL); |
| TSS2_RC rc = copy_info (&info_src, &info_dst); |
| assert_int_equal (rc, TSS2_TCTI_RC_GENERAL_FAILURE); |
| } |
| static void |
| copyinfo_strndup3_fail (void **state) |
| { |
| TSS2_TCTI_INFO info_dst = { 0, }; |
| will_return (__wrap_strndup, 0); |
| will_return (__wrap_strndup, name_dup); |
| will_return (__wrap_strndup, 0); |
| will_return (__wrap_strndup, description_dup); |
| will_return (__wrap_strndup, ENOMEM); |
| will_return (__wrap_strndup, NULL); |
| TSS2_RC rc = copy_info (&info_src, &info_dst); |
| assert_int_equal (rc, TSS2_TCTI_RC_GENERAL_FAILURE); |
| } |
| static void |
| copyinfo_success (void **state) |
| { |
| TSS2_TCTI_INFO info_dst = { 0, }; |
| will_return (__wrap_strndup, 0); |
| will_return (__wrap_strndup, name_dup); |
| will_return (__wrap_strndup, 0); |
| will_return (__wrap_strndup, description_dup); |
| will_return (__wrap_strndup, 0); |
| will_return (__wrap_strndup, config_help_dup); |
| TSS2_RC rc = copy_info (&info_src, &info_dst); |
| assert_int_equal (rc, TSS2_RC_SUCCESS); |
| assert_string_equal (info_dst.name, name_dup); |
| assert_string_equal (info_dst.description, description_dup); |
| assert_string_equal (info_dst.config_help, config_help_dup); |
| } |
| static void |
| getinfo_null_info (void **state) |
| { |
| TSS2_RC rc = Tss2_TctiLdr_GetInfo (NULL, NULL); |
| assert_int_equal (rc, TSS2_TCTI_RC_BAD_REFERENCE); |
| } |
| TSS2_RC |
| __wrap_handle_from_name(const char *file, |
| void **handle) |
| { |
| printf ("%s\n", __func__); |
| *handle = mock_type (void*); |
| return mock_type (TSS2_RC); |
| } |
| const TSS2_TCTI_INFO* |
| __wrap_info_from_handle (void *dlhandle) |
| { |
| printf ("%s\n", __func__); |
| return mock_type (const TSS2_TCTI_INFO*); |
| } |
| TSS2_RC |
| __wrap_get_tcti_default(TSS2_TCTI_CONTEXT ** tcticontext, void **dlhandle) |
| { |
| printf ("%s\n", __func__); |
| return TSS2_RC_SUCCESS; |
| } |
| TSS2_RC |
| __wrap_tcti_from_file(const char *file, |
| const char* conf, |
| TSS2_TCTI_CONTEXT **tcti, |
| void **dlhandle) |
| { |
| printf ("%s\n", __func__); |
| return TSS2_RC_SUCCESS; |
| } |
| #define TEST_HANDLE (void*)666 |
| #define HANDLE_FROM_NAME_FAIL_RC (TSS2_RC)574567392 |
| void |
| __wrap_dlclose (void *handle) |
| { |
| if (handle == TEST_HANDLE) { |
| printf ("%s got TEST_HANDLE\n", __func__); |
| return; |
| } else { |
| printf ("%s got unexpected handle\n", __func__); |
| return; |
| } |
| } |
| TSS2_RC |
| __wrap_get_info_default (TSS2_TCTI_INFO **info, |
| void **dlhandle) |
| { |
| printf ("%s\n", __func__); |
| if (*info == &info_src) { |
| *dlhandle = mock_type (void*); |
| return mock_type (TSS2_RC); |
| } else { |
| printf ("%s: this shouldn't happen", __func__); |
| assert_true(1); |
| return 1; |
| } |
| } |
| #define TCTI_NAME "foo" |
| static void |
| getinfo_get_info_fail (void **state) |
| { |
| TSS2_TCTI_INFO *info = NULL; |
| will_return (__wrap_tctildr_get_info, HANDLE_FROM_NAME_FAIL_RC); |
| TSS2_RC rc = Tss2_TctiLdr_GetInfo (TCTI_NAME, &info); |
| assert_int_equal (rc, HANDLE_FROM_NAME_FAIL_RC); |
| } |
| void* |
| __wrap_calloc(size_t nmemb, size_t size) |
| { |
| printf("%s\n", __func__); |
| return mock_type (void*); |
| } |
| #define TEST_DATA (void*)0xabcdef999 |
| static void |
| getinfo_calloc_fail (void **state) |
| { |
| TSS2_TCTI_INFO *info = NULL; |
| will_return (__wrap_tctildr_get_info, TSS2_RC_SUCCESS); |
| will_return (__wrap_tctildr_get_info, &info_src); |
| will_return (__wrap_tctildr_get_info, TEST_DATA); |
| will_return (__wrap_calloc, NULL); |
| TSS2_RC rc = Tss2_TctiLdr_GetInfo (TCTI_NAME, &info); |
| assert_int_equal (rc, TSS2_TCTI_RC_GENERAL_FAILURE); |
| } |
| static void |
| getinfo_copy_info_fail (void **state) |
| { |
| TSS2_TCTI_INFO *info = NULL; |
| printf ("%s: pointer %p\n", __func__, &info_dst); |
| will_return (__wrap_tctildr_get_info, TSS2_RC_SUCCESS); |
| will_return (__wrap_tctildr_get_info, &info_src); |
| will_return (__wrap_tctildr_get_info, TEST_DATA); |
| will_return (__wrap_calloc, &info_dst); |
| will_return (__wrap_strndup, ENOMEM); |
| will_return (__wrap_strndup, NULL); |
| TSS2_RC rc = Tss2_TctiLdr_GetInfo (TCTI_NAME, &info); |
| assert_int_equal (rc, TSS2_TCTI_RC_GENERAL_FAILURE); |
| } |
| static void |
| getinfo_success (void **state) |
| { |
| TSS2_TCTI_INFO *info = NULL; |
| will_return (__wrap_tctildr_get_info, TSS2_RC_SUCCESS); |
| will_return (__wrap_tctildr_get_info, &info_src); |
| will_return (__wrap_tctildr_get_info, TEST_DATA); |
| will_return (__wrap_calloc, &info_dst); |
| will_return (__wrap_strndup, 0); |
| will_return (__wrap_strndup, name_dup); |
| will_return (__wrap_strndup, 0); |
| will_return (__wrap_strndup, description_dup); |
| will_return (__wrap_strndup, 0); |
| will_return (__wrap_strndup, config_help_dup); |
| TSS2_RC rc = Tss2_TctiLdr_GetInfo (TCTI_NAME, &info); |
| assert_int_equal (rc, TSS2_RC_SUCCESS); |
| } |
| static void |
| freeinfo_null (void **state) |
| { |
| TSS2_TCTI_INFO *info = NULL; |
| Tss2_TctiLdr_FreeInfo (&info); |
| assert_null (info); |
| } |
| static void |
| freeinfo_success (void **state) |
| { |
| TSS2_TCTI_INFO *info = &info_dst; |
| Tss2_TctiLdr_FreeInfo (&info); |
| assert_null (info); |
| } |
| int |
| main (int argc, char* arvg[]) |
| { |
| const struct CMUnitTest tests[] = { |
| cmocka_unit_test (copyinfo_null_params), |
| cmocka_unit_test (copyinfo_strndup1_fail), |
| cmocka_unit_test (copyinfo_strndup2_fail), |
| cmocka_unit_test (copyinfo_strndup3_fail), |
| cmocka_unit_test (copyinfo_success), |
| cmocka_unit_test (getinfo_null_info), |
| cmocka_unit_test (getinfo_get_info_fail), |
| cmocka_unit_test (getinfo_calloc_fail), |
| cmocka_unit_test (getinfo_copy_info_fail), |
| cmocka_unit_test (getinfo_success), |
| cmocka_unit_test (freeinfo_null), |
| cmocka_unit_test (freeinfo_success), |
| }; |
| return cmocka_run_group_tests (tests, NULL, NULL); |
| } |