| /******************************************************************************* |
| * Copyright 2017-2018, Fraunhofer SIT sponsored by Infineon Technologies AG All |
| * rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * |
| * 1. Redistributions of source code must retain the above copyright notice, |
| * this list of conditions and the following disclaimer. |
| * |
| * 2. Redistributions in binary form must reproduce the above copyright notice, |
| * this list of conditions and the following disclaimer in the documentation |
| * and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
| * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF |
| * THE POSSIBILITY OF SUCH DAMAGE. |
| ******************************************************************************/ |
| |
| #include <stdarg.h> |
| #include <inttypes.h> |
| #include <string.h> |
| #include <stdlib.h> |
| |
| #include <setjmp.h> |
| #include <cmocka.h> |
| |
| #include "tss2_esys.h" |
| |
| #define LOGMODULE tests |
| #include "util/log.h" |
| |
| #define TCTI_FAKE_MAGIC 0x46414b4500000000ULL /* 'FAKE\0' */ |
| #define TCTI_FAKE_VERSION 0x1 |
| |
| typedef struct { |
| uint64_t magic; |
| uint32_t version; |
| TSS2_TCTI_TRANSMIT_FCN transmit; |
| TSS2_TCTI_RECEIVE_FCN receive; |
| TSS2_RC(*finalize) (TSS2_TCTI_CONTEXT * tctiContext); |
| TSS2_RC(*cancel) (TSS2_TCTI_CONTEXT * tctiContext); |
| TSS2_RC(*getPollHandles) (TSS2_TCTI_CONTEXT * tctiContext, |
| TSS2_TCTI_POLL_HANDLE * handles, |
| size_t * num_handles); |
| TSS2_RC(*setLocality) (TSS2_TCTI_CONTEXT * tctiContext, uint8_t locality); |
| } TSS2_TCTI_CONTEXT_FAKE; |
| |
| |
| TSS2_TCTI_POLL_HANDLE rev[] = { |
| {.fd=66, .events=1, .revents=0}, |
| {.fd=99, .events=1, .revents=0} |
| }; |
| |
| static TSS2_RC |
| tcti_fake_getpollhandles(TSS2_TCTI_CONTEXT * tctiContext, |
| TSS2_TCTI_POLL_HANDLE * handles, |
| size_t * num_handles) |
| { |
| (void) tctiContext; |
| if (handles == NULL) { |
| *num_handles = 2; |
| return TSS2_RC_SUCCESS; |
| } |
| assert_int_equal(*num_handles, 2); |
| memcpy(&handles[0], &rev[0], sizeof(rev)); |
| return TSS2_RC_SUCCESS; |
| } |
| |
| static TSS2_RC |
| tcti_fake_initialize(TSS2_TCTI_CONTEXT * tctiContext, size_t * contextSize) |
| { |
| TSS2_TCTI_CONTEXT_FAKE *tcti_fake = |
| (TSS2_TCTI_CONTEXT_FAKE *) tctiContext; |
| |
| if (tctiContext == NULL && contextSize == NULL) { |
| return TSS2_TCTI_RC_BAD_VALUE; |
| } else if (tctiContext == NULL) { |
| *contextSize = sizeof(*tcti_fake); |
| return TSS2_RC_SUCCESS; |
| } |
| |
| /* Init TCTI context */ |
| memset(tcti_fake, 0, sizeof(*tcti_fake)); |
| TSS2_TCTI_MAGIC(tctiContext) = TCTI_FAKE_MAGIC; |
| TSS2_TCTI_VERSION(tctiContext) = TCTI_FAKE_VERSION; |
| TSS2_TCTI_TRANSMIT(tctiContext) = (void*)1; |
| TSS2_TCTI_RECEIVE(tctiContext) = (void*)1; |
| TSS2_TCTI_FINALIZE(tctiContext) = NULL; |
| TSS2_TCTI_CANCEL(tctiContext) = NULL; |
| TSS2_TCTI_GET_POLL_HANDLES(tctiContext) = tcti_fake_getpollhandles; |
| TSS2_TCTI_SET_LOCALITY(tctiContext) = NULL; |
| |
| return TSS2_RC_SUCCESS; |
| } |
| |
| |
| static int |
| setup(void **state) |
| { |
| TSS2_RC r; |
| ESYS_CONTEXT *ectx; |
| size_t size = sizeof(TSS2_TCTI_CONTEXT_FAKE); |
| TSS2_TCTI_CONTEXT *tcti = malloc(size); |
| |
| r = tcti_fake_initialize(tcti, &size); |
| if (r) |
| return (int)r; |
| r = Esys_Initialize(&ectx, tcti, NULL); |
| *state = (void *)ectx; |
| return (int)r; |
| } |
| |
| static int |
| teardown(void **state) |
| { |
| TSS2_TCTI_CONTEXT *tcti; |
| ESYS_CONTEXT *ectx = (ESYS_CONTEXT *) * state; |
| Esys_GetTcti(ectx, &tcti); |
| Esys_Finalize(&ectx); |
| free(tcti); |
| return 0; |
| } |
| |
| static void |
| test_GetPollHandles(void **state) |
| { |
| TSS2_RC r; |
| ESYS_CONTEXT *ectx = (ESYS_CONTEXT *) * state; |
| |
| TSS2_TCTI_POLL_HANDLE *handles; |
| size_t count; |
| |
| r = Esys_GetPollHandles(ectx, &handles, &count); |
| assert_int_equal(r, TSS2_RC_SUCCESS); |
| |
| assert_int_equal(count, 2); |
| assert_memory_equal((void*)&handles[0], (void*)&rev[0], sizeof(rev)); |
| } |
| |
| int |
| main(int argc, char *argv[]) |
| { |
| const struct CMUnitTest tests[] = { |
| cmocka_unit_test_setup_teardown(test_GetPollHandles, setup, teardown), |
| }; |
| return cmocka_run_group_tests(tests, NULL, NULL); |
| } |