1*758e9fbaSOystein Eftevaag /* SPDX-License-Identifier: BSD-2-Clause */
2*758e9fbaSOystein Eftevaag /*******************************************************************************
3*758e9fbaSOystein Eftevaag * Copyright 2017-2018, Fraunhofer SIT sponsored by Infineon Technologies AG All
4*758e9fbaSOystein Eftevaag * rights reserved.
5*758e9fbaSOystein Eftevaag ******************************************************************************/
6*758e9fbaSOystein Eftevaag
7*758e9fbaSOystein Eftevaag #ifdef HAVE_CONFIG_H
8*758e9fbaSOystein Eftevaag #include <config.h>
9*758e9fbaSOystein Eftevaag #endif
10*758e9fbaSOystein Eftevaag
11*758e9fbaSOystein Eftevaag #include <stdarg.h>
12*758e9fbaSOystein Eftevaag #include <inttypes.h>
13*758e9fbaSOystein Eftevaag #include <string.h>
14*758e9fbaSOystein Eftevaag #include <stdlib.h>
15*758e9fbaSOystein Eftevaag
16*758e9fbaSOystein Eftevaag #include <setjmp.h>
17*758e9fbaSOystein Eftevaag #include <cmocka.h>
18*758e9fbaSOystein Eftevaag
19*758e9fbaSOystein Eftevaag #include "tss2_esys.h"
20*758e9fbaSOystein Eftevaag
21*758e9fbaSOystein Eftevaag #define LOGMODULE tests
22*758e9fbaSOystein Eftevaag #include "util/log.h"
23*758e9fbaSOystein Eftevaag
24*758e9fbaSOystein Eftevaag #define TCTI_FAKE_MAGIC 0x46414b4500000000ULL /* 'FAKE\0' */
25*758e9fbaSOystein Eftevaag #define TCTI_FAKE_VERSION 0x1
26*758e9fbaSOystein Eftevaag
27*758e9fbaSOystein Eftevaag typedef struct {
28*758e9fbaSOystein Eftevaag uint64_t magic;
29*758e9fbaSOystein Eftevaag uint32_t version;
30*758e9fbaSOystein Eftevaag TSS2_TCTI_TRANSMIT_FCN transmit;
31*758e9fbaSOystein Eftevaag TSS2_TCTI_RECEIVE_FCN receive;
32*758e9fbaSOystein Eftevaag TSS2_RC(*finalize) (TSS2_TCTI_CONTEXT * tctiContext);
33*758e9fbaSOystein Eftevaag TSS2_RC(*cancel) (TSS2_TCTI_CONTEXT * tctiContext);
34*758e9fbaSOystein Eftevaag TSS2_RC(*getPollHandles) (TSS2_TCTI_CONTEXT * tctiContext,
35*758e9fbaSOystein Eftevaag TSS2_TCTI_POLL_HANDLE * handles,
36*758e9fbaSOystein Eftevaag size_t * num_handles);
37*758e9fbaSOystein Eftevaag TSS2_RC(*setLocality) (TSS2_TCTI_CONTEXT * tctiContext, uint8_t locality);
38*758e9fbaSOystein Eftevaag } TSS2_TCTI_CONTEXT_FAKE;
39*758e9fbaSOystein Eftevaag
40*758e9fbaSOystein Eftevaag
41*758e9fbaSOystein Eftevaag TSS2_TCTI_POLL_HANDLE rev[] = {
42*758e9fbaSOystein Eftevaag {.fd=66, .events=1, .revents=0},
43*758e9fbaSOystein Eftevaag {.fd=99, .events=1, .revents=0}
44*758e9fbaSOystein Eftevaag };
45*758e9fbaSOystein Eftevaag
46*758e9fbaSOystein Eftevaag static TSS2_RC
tcti_fake_getpollhandles(TSS2_TCTI_CONTEXT * tctiContext,TSS2_TCTI_POLL_HANDLE * handles,size_t * num_handles)47*758e9fbaSOystein Eftevaag tcti_fake_getpollhandles(TSS2_TCTI_CONTEXT * tctiContext,
48*758e9fbaSOystein Eftevaag TSS2_TCTI_POLL_HANDLE * handles,
49*758e9fbaSOystein Eftevaag size_t * num_handles)
50*758e9fbaSOystein Eftevaag {
51*758e9fbaSOystein Eftevaag (void) tctiContext;
52*758e9fbaSOystein Eftevaag if (handles == NULL) {
53*758e9fbaSOystein Eftevaag *num_handles = 2;
54*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
55*758e9fbaSOystein Eftevaag }
56*758e9fbaSOystein Eftevaag assert_int_equal(*num_handles, 2);
57*758e9fbaSOystein Eftevaag memcpy(&handles[0], &rev[0], sizeof(rev));
58*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
59*758e9fbaSOystein Eftevaag }
60*758e9fbaSOystein Eftevaag
61*758e9fbaSOystein Eftevaag static TSS2_RC
tcti_fake_initialize(TSS2_TCTI_CONTEXT * tctiContext,size_t * contextSize)62*758e9fbaSOystein Eftevaag tcti_fake_initialize(TSS2_TCTI_CONTEXT * tctiContext, size_t * contextSize)
63*758e9fbaSOystein Eftevaag {
64*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT_FAKE *tcti_fake =
65*758e9fbaSOystein Eftevaag (TSS2_TCTI_CONTEXT_FAKE *) tctiContext;
66*758e9fbaSOystein Eftevaag
67*758e9fbaSOystein Eftevaag if (tctiContext == NULL && contextSize == NULL) {
68*758e9fbaSOystein Eftevaag return TSS2_TCTI_RC_BAD_VALUE;
69*758e9fbaSOystein Eftevaag } else if (tctiContext == NULL) {
70*758e9fbaSOystein Eftevaag *contextSize = sizeof(*tcti_fake);
71*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
72*758e9fbaSOystein Eftevaag }
73*758e9fbaSOystein Eftevaag
74*758e9fbaSOystein Eftevaag /* Init TCTI context */
75*758e9fbaSOystein Eftevaag memset(tcti_fake, 0, sizeof(*tcti_fake));
76*758e9fbaSOystein Eftevaag TSS2_TCTI_MAGIC(tctiContext) = TCTI_FAKE_MAGIC;
77*758e9fbaSOystein Eftevaag TSS2_TCTI_VERSION(tctiContext) = TCTI_FAKE_VERSION;
78*758e9fbaSOystein Eftevaag TSS2_TCTI_TRANSMIT(tctiContext) = (void*)1;
79*758e9fbaSOystein Eftevaag TSS2_TCTI_RECEIVE(tctiContext) = (void*)1;
80*758e9fbaSOystein Eftevaag TSS2_TCTI_FINALIZE(tctiContext) = NULL;
81*758e9fbaSOystein Eftevaag TSS2_TCTI_CANCEL(tctiContext) = NULL;
82*758e9fbaSOystein Eftevaag TSS2_TCTI_GET_POLL_HANDLES(tctiContext) = tcti_fake_getpollhandles;
83*758e9fbaSOystein Eftevaag TSS2_TCTI_SET_LOCALITY(tctiContext) = NULL;
84*758e9fbaSOystein Eftevaag
85*758e9fbaSOystein Eftevaag return TSS2_RC_SUCCESS;
86*758e9fbaSOystein Eftevaag }
87*758e9fbaSOystein Eftevaag
88*758e9fbaSOystein Eftevaag
89*758e9fbaSOystein Eftevaag static int
setup(void ** state)90*758e9fbaSOystein Eftevaag setup(void **state)
91*758e9fbaSOystein Eftevaag {
92*758e9fbaSOystein Eftevaag TSS2_RC r;
93*758e9fbaSOystein Eftevaag ESYS_CONTEXT *ectx;
94*758e9fbaSOystein Eftevaag size_t size = sizeof(TSS2_TCTI_CONTEXT_FAKE);
95*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tcti = malloc(size);
96*758e9fbaSOystein Eftevaag
97*758e9fbaSOystein Eftevaag r = tcti_fake_initialize(tcti, &size);
98*758e9fbaSOystein Eftevaag if (r)
99*758e9fbaSOystein Eftevaag return (int)r;
100*758e9fbaSOystein Eftevaag r = Esys_Initialize(&ectx, tcti, NULL);
101*758e9fbaSOystein Eftevaag *state = (void *)ectx;
102*758e9fbaSOystein Eftevaag return (int)r;
103*758e9fbaSOystein Eftevaag }
104*758e9fbaSOystein Eftevaag
105*758e9fbaSOystein Eftevaag static int
teardown(void ** state)106*758e9fbaSOystein Eftevaag teardown(void **state)
107*758e9fbaSOystein Eftevaag {
108*758e9fbaSOystein Eftevaag TSS2_TCTI_CONTEXT *tcti;
109*758e9fbaSOystein Eftevaag ESYS_CONTEXT *ectx = (ESYS_CONTEXT *) * state;
110*758e9fbaSOystein Eftevaag Esys_GetTcti(ectx, &tcti);
111*758e9fbaSOystein Eftevaag Esys_Finalize(&ectx);
112*758e9fbaSOystein Eftevaag free(tcti);
113*758e9fbaSOystein Eftevaag return 0;
114*758e9fbaSOystein Eftevaag }
115*758e9fbaSOystein Eftevaag
116*758e9fbaSOystein Eftevaag static void
test_GetPollHandles(void ** state)117*758e9fbaSOystein Eftevaag test_GetPollHandles(void **state)
118*758e9fbaSOystein Eftevaag {
119*758e9fbaSOystein Eftevaag TSS2_RC r;
120*758e9fbaSOystein Eftevaag ESYS_CONTEXT *ectx = (ESYS_CONTEXT *) * state;
121*758e9fbaSOystein Eftevaag
122*758e9fbaSOystein Eftevaag TSS2_TCTI_POLL_HANDLE *handles;
123*758e9fbaSOystein Eftevaag size_t count;
124*758e9fbaSOystein Eftevaag
125*758e9fbaSOystein Eftevaag r = Esys_GetPollHandles(ectx, &handles, &count);
126*758e9fbaSOystein Eftevaag assert_int_equal(r, TSS2_RC_SUCCESS);
127*758e9fbaSOystein Eftevaag
128*758e9fbaSOystein Eftevaag assert_int_equal(count, 2);
129*758e9fbaSOystein Eftevaag assert_memory_equal((void*)&handles[0], (void*)&rev[0], sizeof(rev));
130*758e9fbaSOystein Eftevaag free(handles);
131*758e9fbaSOystein Eftevaag }
132*758e9fbaSOystein Eftevaag
133*758e9fbaSOystein Eftevaag int
main(int argc,char * argv[])134*758e9fbaSOystein Eftevaag main(int argc, char *argv[])
135*758e9fbaSOystein Eftevaag {
136*758e9fbaSOystein Eftevaag const struct CMUnitTest tests[] = {
137*758e9fbaSOystein Eftevaag cmocka_unit_test_setup_teardown(test_GetPollHandles, setup, teardown),
138*758e9fbaSOystein Eftevaag };
139*758e9fbaSOystein Eftevaag return cmocka_run_group_tests(tests, NULL, NULL);
140*758e9fbaSOystein Eftevaag }
141