1 /* SPDX-License-Identifier: BSD-2-Clause */
2 /*
3 * Copyright (c) 2017, Intel Corporation
4 * All rights reserved.
5 */
6 #include <glib.h>
7
8 #include <errno.h>
9 #include <fcntl.h>
10 #include <stdbool.h>
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h>
14 #include <sys/select.h>
15 #include <unistd.h>
16
17 #include <setjmp.h>
18 #include <cmocka.h>
19
20 #include "connection.h"
21 #include "connection-manager.h"
22 #include "tabrmd-defaults.h"
23 #include "util.h"
24
25 static void
connection_manager_allocate_test(void ** state)26 connection_manager_allocate_test (void **state)
27 {
28 ConnectionManager *manager = NULL;
29 UNUSED_PARAM(state);
30
31 manager = connection_manager_new (TABRMD_CONNECTIONS_MAX_DEFAULT);
32 assert_non_null (manager);
33 g_object_unref (manager);
34 }
35
36 static int
connection_manager_setup(void ** state)37 connection_manager_setup (void **state)
38 {
39 ConnectionManager *manager = NULL;
40
41 manager = connection_manager_new (TABRMD_CONNECTIONS_MAX_DEFAULT);
42 assert_non_null (manager);
43 *state = manager;
44 return 0;
45 }
46
47 static int
connection_manager_teardown(void ** state)48 connection_manager_teardown (void **state)
49 {
50 ConnectionManager *manager = CONNECTION_MANAGER (*state);
51
52 g_object_unref (manager);
53 return 0;
54 }
55
56 static void
connection_manager_insert_test(void ** state)57 connection_manager_insert_test (void **state)
58 {
59 ConnectionManager *manager = CONNECTION_MANAGER (*state);
60 Connection *connection = NULL;
61 HandleMap *handle_map = NULL;
62 gint ret, client_fd;
63 GIOStream *iostream;
64
65 handle_map = handle_map_new (TPM2_HT_TRANSIENT, MAX_ENTRIES_DEFAULT);
66 iostream = create_connection_iostream (&client_fd);
67 connection = connection_new (iostream, 5, handle_map);
68 g_object_unref (handle_map);
69 g_object_unref (iostream);
70 ret = connection_manager_insert (manager, connection);
71 assert_int_equal (ret, 0);
72 }
73
74 static void
connection_manager_lookup_fd_test(void ** state)75 connection_manager_lookup_fd_test (void **state)
76 {
77 ConnectionManager *manager = CONNECTION_MANAGER (*state);
78 Connection *connection = NULL, *connection_lookup = NULL;
79 HandleMap *handle_map = NULL;
80 gint ret, client_fd;
81 GIOStream *iostream;
82
83 handle_map = handle_map_new (TPM2_HT_TRANSIENT, MAX_ENTRIES_DEFAULT);
84 iostream = create_connection_iostream (&client_fd);
85 connection = connection_new (iostream, 5, handle_map);
86 g_object_unref (handle_map);
87 g_object_unref (iostream);
88 ret = connection_manager_insert (manager, connection);
89 assert_int_equal (ret, TSS2_RC_SUCCESS);
90 connection_lookup = connection_manager_lookup_istream (manager,
91 connection_key_istream (connection));
92 assert_int_equal (connection, connection_lookup);
93 g_object_unref (connection_lookup);
94 }
95
96 static void
connection_manager_lookup_id_test(void ** state)97 connection_manager_lookup_id_test (void **state)
98 {
99 ConnectionManager *manager = CONNECTION_MANAGER (*state);
100 Connection *connection = NULL, *connection_lookup = NULL;
101 HandleMap *handle_map = NULL;
102 GIOStream *iostream;
103 gint ret, client_fd;
104
105 handle_map = handle_map_new (TPM2_HT_TRANSIENT, MAX_ENTRIES_DEFAULT);
106 iostream = create_connection_iostream (&client_fd);
107 connection = connection_new (iostream, 5, handle_map);
108 g_object_unref (handle_map);
109 g_object_unref (iostream);
110 ret = connection_manager_insert (manager, connection);
111 assert_int_equal (ret, TSS2_RC_SUCCESS);
112 connection_lookup = connection_manager_lookup_id (manager, *(gint64*)connection_key_id (connection));
113 assert_int_equal (connection, connection_lookup);
114 }
115
116 static void
connection_manager_remove_test(void ** state)117 connection_manager_remove_test (void **state)
118 {
119 ConnectionManager *manager = CONNECTION_MANAGER (*state);
120 Connection *connection = NULL;
121 GIOStream *iostream;
122 HandleMap *handle_map = NULL;
123 gint ret_int, client_fd;
124 gboolean ret_bool;
125
126 handle_map = handle_map_new (TPM2_HT_TRANSIENT, MAX_ENTRIES_DEFAULT);
127 iostream = create_connection_iostream (&client_fd);
128 connection = connection_new (iostream, 5, handle_map);
129 g_object_unref (handle_map);
130 g_object_unref (iostream);
131 ret_int = connection_manager_insert (manager, connection);
132 assert_int_equal (ret_int, 0);
133 ret_bool = connection_manager_remove (manager, connection);
134 assert_true (ret_bool);
135 }
136
137 int
main(void)138 main(void)
139 {
140 const struct CMUnitTest tests[] = {
141 cmocka_unit_test (connection_manager_allocate_test),
142 cmocka_unit_test_setup_teardown (connection_manager_insert_test,
143 connection_manager_setup,
144 connection_manager_teardown),
145 cmocka_unit_test_setup_teardown (connection_manager_lookup_fd_test,
146 connection_manager_setup,
147 connection_manager_teardown),
148 cmocka_unit_test_setup_teardown (connection_manager_lookup_id_test,
149 connection_manager_setup,
150 connection_manager_teardown),
151 cmocka_unit_test_setup_teardown (connection_manager_remove_test,
152 connection_manager_setup,
153 connection_manager_teardown),
154 };
155 return cmocka_run_group_tests(tests, NULL, NULL);
156 }
157