Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause
2 : : * Copyright (C) 2024 Intel Corporation.
3 : : * All rights reserved.
4 : : */
5 : :
6 : : #include "spdk/stdinc.h"
7 : :
8 : : #include "spdk_internal/cunit.h"
9 : :
10 : : #include "init/rpc.c"
11 : : #include "common/lib/test_env.c"
12 : :
13 [ # # ]: 0 : DEFINE_STUB(spdk_rpc_listen, int, (const char *listen_addr), 0);
14 [ # # ]: 0 : DEFINE_STUB(spdk_rpc_server_listen, struct spdk_rpc_server *, (const char *listen_addr),
15 : : (struct spdk_rpc_server *)0xdeadbeef);
16 [ # # # # ]: 0 : DEFINE_STUB(spdk_rpc_verify_methods, bool, (void), true);
17 : 0 : DEFINE_STUB_V(spdk_rpc_accept, (void));
18 : 0 : DEFINE_STUB_V(spdk_rpc_close, (void));
19 : 0 : DEFINE_STUB_V(spdk_rpc_server_accept, (struct spdk_rpc_server *server));
20 : 0 : DEFINE_STUB_V(spdk_rpc_server_close, (struct spdk_rpc_server *server));
21 : 0 : DEFINE_STUB_V(spdk_rpc_set_state, (uint32_t state));
22 : :
23 : : enum spdk_log_level g_test_log_level = SPDK_LOG_DISABLED;
24 : : FILE *g_test_log_file = NULL;
25 : : uint8_t g_test_log_level_set_count = 0;
26 : : uint8_t g_test_log_file_set_count = 0;
27 : :
28 : : const char *g_test_addr1 = "/var/tmp/test_addr1.sock";
29 : : const char *g_test_addr2 = "/var/tmp/test_addr2.sock";
30 : :
31 : : void
32 : 0 : spdk_jsonrpc_set_log_level(enum spdk_log_level level)
33 : : {
34 : 0 : g_test_log_level = level;
35 : 0 : g_test_log_level_set_count++;
36 : 0 : }
37 : :
38 : : void
39 : 0 : spdk_jsonrpc_set_log_file(FILE *file)
40 : : {
41 : 0 : g_test_log_file = file;
42 : 0 : g_test_log_file_set_count++;
43 : 0 : }
44 : :
45 : : static void
46 : 0 : reset_global_counters(void)
47 : : {
48 : 0 : g_test_log_level_set_count = 0;
49 : 0 : g_test_log_file_set_count = 0;
50 : 0 : }
51 : :
52 : : static bool
53 : 0 : server_exists(const char *addr)
54 : : {
55 : : struct init_rpc_server *server;
56 : :
57 [ # # ]: 0 : STAILQ_FOREACH(server, &g_init_rpc_servers, link) {
58 [ # # # # : 0 : if (strcmp(addr, server->listen_addr) == 0) {
# # ]
59 : 0 : return true;
60 : : }
61 : : }
62 : :
63 : 0 : return false;
64 : : }
65 : :
66 : : static bool
67 : 0 : server_paused(const char *addr)
68 : : {
69 : : struct init_rpc_server *server;
70 : :
71 [ # # ]: 0 : STAILQ_FOREACH(server, &g_init_rpc_servers, link) {
72 [ # # # # : 0 : if (strcmp(addr, server->listen_addr) == 0 && !server->active) {
# # # # #
# ]
73 : 0 : return true;
74 : : }
75 : : }
76 : :
77 : 0 : return false;
78 : : }
79 : :
80 : : static void
81 : 0 : initialize_servers(void)
82 : : {
83 : : int rc;
84 : :
85 : 0 : CU_ASSERT(STAILQ_EMPTY(&g_init_rpc_servers));
86 : :
87 : 0 : rc = spdk_rpc_initialize(g_test_addr1, NULL);
88 : 0 : CU_ASSERT(rc == 0);
89 : 0 : CU_ASSERT(server_exists(g_test_addr1));
90 : 0 : CU_ASSERT(server_paused(g_test_addr1) == false);
91 : :
92 : 0 : rc = spdk_rpc_initialize(g_test_addr2, NULL);
93 : 0 : CU_ASSERT(rc == 0);
94 : 0 : CU_ASSERT(server_exists(g_test_addr2));
95 : 0 : CU_ASSERT(server_paused(g_test_addr2) == false);
96 : 0 : }
97 : :
98 : : static void
99 : 0 : test_run_multiple_servers_stop_all(void)
100 : : {
101 : 0 : initialize_servers();
102 : 0 : CU_ASSERT(!STAILQ_EMPTY(&g_init_rpc_servers));
103 : :
104 : 0 : spdk_rpc_finish();
105 : 0 : CU_ASSERT(STAILQ_EMPTY(&g_init_rpc_servers));
106 : 0 : }
107 : :
108 : : static void
109 : 0 : test_run_multiple_servers_stop_singles(void)
110 : : {
111 : 0 : initialize_servers();
112 : 0 : CU_ASSERT(!STAILQ_EMPTY(&g_init_rpc_servers));
113 : :
114 : 0 : spdk_rpc_server_finish(g_test_addr1);
115 : 0 : CU_ASSERT(!server_exists(g_test_addr1));
116 : 0 : CU_ASSERT(!STAILQ_EMPTY(&g_init_rpc_servers));
117 : :
118 : 0 : spdk_rpc_server_finish(g_test_addr2);
119 : 0 : CU_ASSERT(!server_exists(g_test_addr2));
120 : 0 : CU_ASSERT(STAILQ_EMPTY(&g_init_rpc_servers));
121 : 0 : }
122 : :
123 : : static void
124 : 0 : test_rpc_set_spdk_log_opts(void)
125 : : {
126 : 0 : struct spdk_rpc_opts server1_opts = {};
127 : 0 : struct spdk_rpc_opts server2_opts = {};
128 : 0 : FILE *test_log_file1 = (void *)0xDEADDEAD;
129 : 0 : FILE *test_log_file2 = (void *)0xBEEFBEEF;
130 : :
131 : 0 : reset_global_counters();
132 : :
133 : 0 : server1_opts.log_file = test_log_file1;
134 : 0 : server1_opts.log_level = SPDK_LOG_DEBUG;
135 : 0 : server1_opts.size = sizeof(server1_opts);
136 : 0 : server2_opts.log_file = test_log_file2;
137 : 0 : server2_opts.log_level = SPDK_LOG_ERROR;
138 : 0 : server2_opts.size = sizeof(server2_opts);
139 : :
140 : 0 : spdk_rpc_initialize(g_test_addr1, &server1_opts);
141 : 0 : CU_ASSERT(g_test_log_file == server1_opts.log_file);
142 : 0 : CU_ASSERT(g_test_log_level == server1_opts.log_level);
143 : 0 : CU_ASSERT(g_test_log_file_set_count == 1);
144 : 0 : CU_ASSERT(g_test_log_level_set_count == 1);
145 : :
146 : 0 : spdk_rpc_initialize(g_test_addr2, &server2_opts);
147 : 0 : CU_ASSERT(g_test_log_file == server2_opts.log_file);
148 : 0 : CU_ASSERT(g_test_log_level == server2_opts.log_level);
149 : 0 : CU_ASSERT(g_test_log_file_set_count == 2);
150 : 0 : CU_ASSERT(g_test_log_level_set_count == 2);
151 : :
152 : 0 : spdk_rpc_finish();
153 : 0 : }
154 : :
155 : : static void
156 : 0 : test_rpc_set_spdk_log_default_opts(void)
157 : : {
158 : 0 : FILE *test_log_file_default = NULL;
159 : 0 : enum spdk_log_level test_log_level_default = SPDK_LOG_DISABLED;
160 : :
161 : 0 : reset_global_counters();
162 : :
163 : 0 : spdk_rpc_initialize(g_test_addr1, NULL);
164 : 0 : CU_ASSERT(g_test_log_file == test_log_file_default);
165 : 0 : CU_ASSERT(g_test_log_level == test_log_level_default);
166 : 0 : CU_ASSERT(g_test_log_file_set_count == 1);
167 : 0 : CU_ASSERT(g_test_log_level_set_count == 1);
168 : :
169 : 0 : spdk_rpc_initialize(g_test_addr2, NULL);
170 : 0 : CU_ASSERT(g_test_log_file == test_log_file_default);
171 : 0 : CU_ASSERT(g_test_log_level == test_log_level_default);
172 : 0 : CU_ASSERT(g_test_log_file_set_count == 1);
173 : 0 : CU_ASSERT(g_test_log_level_set_count == 1);
174 : :
175 : 0 : spdk_rpc_finish();
176 : 0 : }
177 : :
178 : : static void
179 : 0 : test_pause_resume_servers(void)
180 : : {
181 : 0 : initialize_servers();
182 : :
183 : 0 : spdk_rpc_server_pause(g_test_addr1);
184 : 0 : CU_ASSERT(server_exists(g_test_addr1));
185 : 0 : CU_ASSERT(server_paused(g_test_addr1));
186 : :
187 : 0 : spdk_rpc_server_pause(g_test_addr2);
188 : 0 : CU_ASSERT(server_exists(g_test_addr2));
189 : 0 : CU_ASSERT(server_paused(g_test_addr2));
190 : :
191 : 0 : spdk_rpc_server_resume(g_test_addr2);
192 : 0 : CU_ASSERT(!server_paused(g_test_addr2));
193 : :
194 : 0 : spdk_rpc_server_resume(g_test_addr1);
195 : 0 : CU_ASSERT(!server_paused(g_test_addr1));
196 : :
197 : 0 : spdk_rpc_finish();
198 : 0 : }
199 : :
200 : : static void
201 : 0 : test_remove_paused_servers(void)
202 : : {
203 : 0 : initialize_servers();
204 : :
205 : 0 : spdk_rpc_server_pause(g_test_addr1);
206 : 0 : spdk_rpc_server_pause(g_test_addr2);
207 : :
208 : 0 : spdk_rpc_server_finish(g_test_addr2);
209 : 0 : CU_ASSERT(!server_exists(g_test_addr2));
210 : :
211 : 0 : CU_ASSERT(server_exists(g_test_addr1));
212 : 0 : CU_ASSERT(server_paused(g_test_addr1));
213 : :
214 : 0 : spdk_rpc_server_finish(g_test_addr1);
215 : 0 : }
216 : :
217 : : int
218 : 0 : main(int argc, char **argv)
219 : : {
220 : 0 : CU_pSuite suite = NULL;
221 : : unsigned int num_failures;
222 : : struct spdk_thread *thread;
223 : :
224 : 0 : CU_initialize_registry();
225 : 0 : suite = CU_add_suite("rpc_suite", NULL, NULL);
226 : :
227 : 0 : spdk_thread_lib_init(NULL, 0);
228 : 0 : thread = spdk_thread_create(NULL, NULL);
229 : 0 : spdk_set_thread(thread);
230 : :
231 : 0 : CU_ADD_TEST(suite, test_run_multiple_servers_stop_all);
232 : 0 : CU_ADD_TEST(suite, test_run_multiple_servers_stop_singles);
233 : 0 : CU_ADD_TEST(suite, test_rpc_set_spdk_log_opts);
234 : 0 : CU_ADD_TEST(suite, test_rpc_set_spdk_log_default_opts);
235 : 0 : CU_ADD_TEST(suite, test_pause_resume_servers);
236 : 0 : CU_ADD_TEST(suite, test_remove_paused_servers);
237 : :
238 : 0 : num_failures = spdk_ut_run_tests(argc, argv, NULL);
239 : 0 : CU_cleanup_registry();
240 : :
241 : 0 : return num_failures;
242 : : }
|