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 : : }