109895428SKrzysztof Karas /* SPDX-License-Identifier: BSD-3-Clause
209895428SKrzysztof Karas * Copyright (C) 2024 Intel Corporation.
309895428SKrzysztof Karas * All rights reserved.
409895428SKrzysztof Karas */
509895428SKrzysztof Karas
609895428SKrzysztof Karas #include "spdk/stdinc.h"
709895428SKrzysztof Karas
809895428SKrzysztof Karas #include "spdk_internal/cunit.h"
909895428SKrzysztof Karas
1009895428SKrzysztof Karas #include "init/rpc.c"
1109895428SKrzysztof Karas #include "common/lib/test_env.c"
1209895428SKrzysztof Karas
1309895428SKrzysztof Karas DEFINE_STUB(spdk_rpc_listen, int, (const char *listen_addr), 0);
1409895428SKrzysztof Karas DEFINE_STUB(spdk_rpc_server_listen, struct spdk_rpc_server *, (const char *listen_addr),
1509895428SKrzysztof Karas (struct spdk_rpc_server *)0xdeadbeef);
1609895428SKrzysztof Karas DEFINE_STUB(spdk_rpc_verify_methods, bool, (void), true);
1709895428SKrzysztof Karas DEFINE_STUB_V(spdk_rpc_accept, (void));
1809895428SKrzysztof Karas DEFINE_STUB_V(spdk_rpc_close, (void));
1909895428SKrzysztof Karas DEFINE_STUB_V(spdk_rpc_server_accept, (struct spdk_rpc_server *server));
2009895428SKrzysztof Karas DEFINE_STUB_V(spdk_rpc_server_close, (struct spdk_rpc_server *server));
2109895428SKrzysztof Karas DEFINE_STUB_V(spdk_rpc_set_state, (uint32_t state));
2209895428SKrzysztof Karas
2309895428SKrzysztof Karas enum spdk_log_level g_test_log_level = SPDK_LOG_DISABLED;
2409895428SKrzysztof Karas FILE *g_test_log_file = NULL;
2509895428SKrzysztof Karas uint8_t g_test_log_level_set_count = 0;
2609895428SKrzysztof Karas uint8_t g_test_log_file_set_count = 0;
2709895428SKrzysztof Karas
2809895428SKrzysztof Karas const char *g_test_addr1 = "/var/tmp/test_addr1.sock";
2909895428SKrzysztof Karas const char *g_test_addr2 = "/var/tmp/test_addr2.sock";
3009895428SKrzysztof Karas
3109895428SKrzysztof Karas void
spdk_jsonrpc_set_log_level(enum spdk_log_level level)3209895428SKrzysztof Karas spdk_jsonrpc_set_log_level(enum spdk_log_level level)
3309895428SKrzysztof Karas {
3409895428SKrzysztof Karas g_test_log_level = level;
3509895428SKrzysztof Karas g_test_log_level_set_count++;
3609895428SKrzysztof Karas }
3709895428SKrzysztof Karas
3809895428SKrzysztof Karas void
spdk_jsonrpc_set_log_file(FILE * file)3909895428SKrzysztof Karas spdk_jsonrpc_set_log_file(FILE *file)
4009895428SKrzysztof Karas {
4109895428SKrzysztof Karas g_test_log_file = file;
4209895428SKrzysztof Karas g_test_log_file_set_count++;
4309895428SKrzysztof Karas }
4409895428SKrzysztof Karas
4509895428SKrzysztof Karas static void
reset_global_counters(void)4609895428SKrzysztof Karas reset_global_counters(void)
4709895428SKrzysztof Karas {
4809895428SKrzysztof Karas g_test_log_level_set_count = 0;
4909895428SKrzysztof Karas g_test_log_file_set_count = 0;
5009895428SKrzysztof Karas }
5109895428SKrzysztof Karas
5209895428SKrzysztof Karas static bool
server_exists(const char * addr)5309895428SKrzysztof Karas server_exists(const char *addr)
5409895428SKrzysztof Karas {
5509895428SKrzysztof Karas struct init_rpc_server *server;
5609895428SKrzysztof Karas
5709895428SKrzysztof Karas STAILQ_FOREACH(server, &g_init_rpc_servers, link) {
5809895428SKrzysztof Karas if (strcmp(addr, server->listen_addr) == 0) {
5909895428SKrzysztof Karas return true;
6009895428SKrzysztof Karas }
6109895428SKrzysztof Karas }
6209895428SKrzysztof Karas
6309895428SKrzysztof Karas return false;
6409895428SKrzysztof Karas }
6509895428SKrzysztof Karas
66*9e3241a1SKrzysztof Karas static bool
server_paused(const char * addr)67*9e3241a1SKrzysztof Karas server_paused(const char *addr)
68*9e3241a1SKrzysztof Karas {
69*9e3241a1SKrzysztof Karas struct init_rpc_server *server;
70*9e3241a1SKrzysztof Karas
71*9e3241a1SKrzysztof Karas STAILQ_FOREACH(server, &g_init_rpc_servers, link) {
72*9e3241a1SKrzysztof Karas if (strcmp(addr, server->listen_addr) == 0 && !server->active) {
73*9e3241a1SKrzysztof Karas return true;
74*9e3241a1SKrzysztof Karas }
75*9e3241a1SKrzysztof Karas }
76*9e3241a1SKrzysztof Karas
77*9e3241a1SKrzysztof Karas return false;
78*9e3241a1SKrzysztof Karas }
79*9e3241a1SKrzysztof Karas
8009895428SKrzysztof Karas static void
initialize_servers(void)8109895428SKrzysztof Karas initialize_servers(void)
8209895428SKrzysztof Karas {
8309895428SKrzysztof Karas int rc;
8409895428SKrzysztof Karas
8509895428SKrzysztof Karas CU_ASSERT(STAILQ_EMPTY(&g_init_rpc_servers));
8609895428SKrzysztof Karas
8709895428SKrzysztof Karas rc = spdk_rpc_initialize(g_test_addr1, NULL);
8809895428SKrzysztof Karas CU_ASSERT(rc == 0);
8909895428SKrzysztof Karas CU_ASSERT(server_exists(g_test_addr1));
90*9e3241a1SKrzysztof Karas CU_ASSERT(server_paused(g_test_addr1) == false);
9109895428SKrzysztof Karas
9209895428SKrzysztof Karas rc = spdk_rpc_initialize(g_test_addr2, NULL);
9309895428SKrzysztof Karas CU_ASSERT(rc == 0);
9409895428SKrzysztof Karas CU_ASSERT(server_exists(g_test_addr2));
95*9e3241a1SKrzysztof Karas CU_ASSERT(server_paused(g_test_addr2) == false);
9609895428SKrzysztof Karas }
9709895428SKrzysztof Karas
9809895428SKrzysztof Karas static void
test_run_multiple_servers_stop_all(void)9909895428SKrzysztof Karas test_run_multiple_servers_stop_all(void)
10009895428SKrzysztof Karas {
10109895428SKrzysztof Karas initialize_servers();
10209895428SKrzysztof Karas CU_ASSERT(!STAILQ_EMPTY(&g_init_rpc_servers));
10309895428SKrzysztof Karas
10409895428SKrzysztof Karas spdk_rpc_finish();
10509895428SKrzysztof Karas CU_ASSERT(STAILQ_EMPTY(&g_init_rpc_servers));
10609895428SKrzysztof Karas }
10709895428SKrzysztof Karas
10809895428SKrzysztof Karas static void
test_run_multiple_servers_stop_singles(void)10909895428SKrzysztof Karas test_run_multiple_servers_stop_singles(void)
11009895428SKrzysztof Karas {
11109895428SKrzysztof Karas initialize_servers();
11209895428SKrzysztof Karas CU_ASSERT(!STAILQ_EMPTY(&g_init_rpc_servers));
11309895428SKrzysztof Karas
11409895428SKrzysztof Karas spdk_rpc_server_finish(g_test_addr1);
11509895428SKrzysztof Karas CU_ASSERT(!server_exists(g_test_addr1));
11609895428SKrzysztof Karas CU_ASSERT(!STAILQ_EMPTY(&g_init_rpc_servers));
11709895428SKrzysztof Karas
11809895428SKrzysztof Karas spdk_rpc_server_finish(g_test_addr2);
11909895428SKrzysztof Karas CU_ASSERT(!server_exists(g_test_addr2));
12009895428SKrzysztof Karas CU_ASSERT(STAILQ_EMPTY(&g_init_rpc_servers));
12109895428SKrzysztof Karas }
12209895428SKrzysztof Karas
12309895428SKrzysztof Karas static void
test_rpc_set_spdk_log_opts(void)12409895428SKrzysztof Karas test_rpc_set_spdk_log_opts(void)
12509895428SKrzysztof Karas {
12609895428SKrzysztof Karas struct spdk_rpc_opts server1_opts = {};
12709895428SKrzysztof Karas struct spdk_rpc_opts server2_opts = {};
12809895428SKrzysztof Karas FILE *test_log_file1 = (void *)0xDEADDEAD;
12909895428SKrzysztof Karas FILE *test_log_file2 = (void *)0xBEEFBEEF;
13009895428SKrzysztof Karas
13109895428SKrzysztof Karas reset_global_counters();
13209895428SKrzysztof Karas
13309895428SKrzysztof Karas server1_opts.log_file = test_log_file1;
13409895428SKrzysztof Karas server1_opts.log_level = SPDK_LOG_DEBUG;
13509895428SKrzysztof Karas server1_opts.size = sizeof(server1_opts);
13609895428SKrzysztof Karas server2_opts.log_file = test_log_file2;
13709895428SKrzysztof Karas server2_opts.log_level = SPDK_LOG_ERROR;
13809895428SKrzysztof Karas server2_opts.size = sizeof(server2_opts);
13909895428SKrzysztof Karas
14009895428SKrzysztof Karas spdk_rpc_initialize(g_test_addr1, &server1_opts);
14109895428SKrzysztof Karas CU_ASSERT(g_test_log_file == server1_opts.log_file);
14209895428SKrzysztof Karas CU_ASSERT(g_test_log_level == server1_opts.log_level);
14309895428SKrzysztof Karas CU_ASSERT(g_test_log_file_set_count == 1);
14409895428SKrzysztof Karas CU_ASSERT(g_test_log_level_set_count == 1);
14509895428SKrzysztof Karas
14609895428SKrzysztof Karas spdk_rpc_initialize(g_test_addr2, &server2_opts);
14709895428SKrzysztof Karas CU_ASSERT(g_test_log_file == server2_opts.log_file);
14809895428SKrzysztof Karas CU_ASSERT(g_test_log_level == server2_opts.log_level);
14909895428SKrzysztof Karas CU_ASSERT(g_test_log_file_set_count == 2);
15009895428SKrzysztof Karas CU_ASSERT(g_test_log_level_set_count == 2);
15109895428SKrzysztof Karas
15209895428SKrzysztof Karas spdk_rpc_finish();
15309895428SKrzysztof Karas }
15409895428SKrzysztof Karas
15509895428SKrzysztof Karas static void
test_rpc_set_spdk_log_default_opts(void)15609895428SKrzysztof Karas test_rpc_set_spdk_log_default_opts(void)
15709895428SKrzysztof Karas {
15809895428SKrzysztof Karas FILE *test_log_file_default = NULL;
15909895428SKrzysztof Karas enum spdk_log_level test_log_level_default = SPDK_LOG_DISABLED;
16009895428SKrzysztof Karas
16109895428SKrzysztof Karas reset_global_counters();
16209895428SKrzysztof Karas
16309895428SKrzysztof Karas spdk_rpc_initialize(g_test_addr1, NULL);
16409895428SKrzysztof Karas CU_ASSERT(g_test_log_file == test_log_file_default);
16509895428SKrzysztof Karas CU_ASSERT(g_test_log_level == test_log_level_default);
16609895428SKrzysztof Karas CU_ASSERT(g_test_log_file_set_count == 1);
16709895428SKrzysztof Karas CU_ASSERT(g_test_log_level_set_count == 1);
16809895428SKrzysztof Karas
16909895428SKrzysztof Karas spdk_rpc_initialize(g_test_addr2, NULL);
17009895428SKrzysztof Karas CU_ASSERT(g_test_log_file == test_log_file_default);
17109895428SKrzysztof Karas CU_ASSERT(g_test_log_level == test_log_level_default);
17209895428SKrzysztof Karas CU_ASSERT(g_test_log_file_set_count == 1);
17309895428SKrzysztof Karas CU_ASSERT(g_test_log_level_set_count == 1);
17409895428SKrzysztof Karas
17509895428SKrzysztof Karas spdk_rpc_finish();
17609895428SKrzysztof Karas }
17709895428SKrzysztof Karas
178*9e3241a1SKrzysztof Karas static void
test_pause_resume_servers(void)179*9e3241a1SKrzysztof Karas test_pause_resume_servers(void)
180*9e3241a1SKrzysztof Karas {
181*9e3241a1SKrzysztof Karas initialize_servers();
182*9e3241a1SKrzysztof Karas
183*9e3241a1SKrzysztof Karas spdk_rpc_server_pause(g_test_addr1);
184*9e3241a1SKrzysztof Karas CU_ASSERT(server_exists(g_test_addr1));
185*9e3241a1SKrzysztof Karas CU_ASSERT(server_paused(g_test_addr1));
186*9e3241a1SKrzysztof Karas
187*9e3241a1SKrzysztof Karas spdk_rpc_server_pause(g_test_addr2);
188*9e3241a1SKrzysztof Karas CU_ASSERT(server_exists(g_test_addr2));
189*9e3241a1SKrzysztof Karas CU_ASSERT(server_paused(g_test_addr2));
190*9e3241a1SKrzysztof Karas
191*9e3241a1SKrzysztof Karas spdk_rpc_server_resume(g_test_addr2);
192*9e3241a1SKrzysztof Karas CU_ASSERT(!server_paused(g_test_addr2));
193*9e3241a1SKrzysztof Karas
194*9e3241a1SKrzysztof Karas spdk_rpc_server_resume(g_test_addr1);
195*9e3241a1SKrzysztof Karas CU_ASSERT(!server_paused(g_test_addr1));
196*9e3241a1SKrzysztof Karas
197*9e3241a1SKrzysztof Karas spdk_rpc_finish();
198*9e3241a1SKrzysztof Karas }
199*9e3241a1SKrzysztof Karas
200*9e3241a1SKrzysztof Karas static void
test_remove_paused_servers(void)201*9e3241a1SKrzysztof Karas test_remove_paused_servers(void)
202*9e3241a1SKrzysztof Karas {
203*9e3241a1SKrzysztof Karas initialize_servers();
204*9e3241a1SKrzysztof Karas
205*9e3241a1SKrzysztof Karas spdk_rpc_server_pause(g_test_addr1);
206*9e3241a1SKrzysztof Karas spdk_rpc_server_pause(g_test_addr2);
207*9e3241a1SKrzysztof Karas
208*9e3241a1SKrzysztof Karas spdk_rpc_server_finish(g_test_addr2);
209*9e3241a1SKrzysztof Karas CU_ASSERT(!server_exists(g_test_addr2));
210*9e3241a1SKrzysztof Karas
211*9e3241a1SKrzysztof Karas CU_ASSERT(server_exists(g_test_addr1));
212*9e3241a1SKrzysztof Karas CU_ASSERT(server_paused(g_test_addr1));
213*9e3241a1SKrzysztof Karas
214*9e3241a1SKrzysztof Karas spdk_rpc_server_finish(g_test_addr1);
215*9e3241a1SKrzysztof Karas }
216*9e3241a1SKrzysztof Karas
21709895428SKrzysztof Karas int
main(int argc,char ** argv)21809895428SKrzysztof Karas main(int argc, char **argv)
21909895428SKrzysztof Karas {
22009895428SKrzysztof Karas CU_pSuite suite = NULL;
22109895428SKrzysztof Karas unsigned int num_failures;
22209895428SKrzysztof Karas struct spdk_thread *thread;
22309895428SKrzysztof Karas
22409895428SKrzysztof Karas CU_initialize_registry();
22509895428SKrzysztof Karas suite = CU_add_suite("rpc_suite", NULL, NULL);
22609895428SKrzysztof Karas
22709895428SKrzysztof Karas spdk_thread_lib_init(NULL, 0);
22809895428SKrzysztof Karas thread = spdk_thread_create(NULL, NULL);
22909895428SKrzysztof Karas spdk_set_thread(thread);
23009895428SKrzysztof Karas
23109895428SKrzysztof Karas CU_ADD_TEST(suite, test_run_multiple_servers_stop_all);
23209895428SKrzysztof Karas CU_ADD_TEST(suite, test_run_multiple_servers_stop_singles);
23309895428SKrzysztof Karas CU_ADD_TEST(suite, test_rpc_set_spdk_log_opts);
23409895428SKrzysztof Karas CU_ADD_TEST(suite, test_rpc_set_spdk_log_default_opts);
235*9e3241a1SKrzysztof Karas CU_ADD_TEST(suite, test_pause_resume_servers);
236*9e3241a1SKrzysztof Karas CU_ADD_TEST(suite, test_remove_paused_servers);
23709895428SKrzysztof Karas
23809895428SKrzysztof Karas num_failures = spdk_ut_run_tests(argc, argv, NULL);
23909895428SKrzysztof Karas CU_cleanup_registry();
24009895428SKrzysztof Karas
24109895428SKrzysztof Karas return num_failures;
24209895428SKrzysztof Karas }
243