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