/* * server_open -- test case for open request message - server side */ void server_open(const struct test_case *tc, int argc, char *argv[]) { if (argc != 2) UT_FATAL("usage: %s <addr> <port>", tc->name); char *node = argv[0]; char *service = argv[1]; struct rpmemd_obc *rpdc; int ret; rpdc = rpmemd_obc_init(); UT_ASSERTne(rpdc, NULL); ret = rpmemd_obc_listen(rpdc, 1, node, service); UT_ASSERTeq(ret, 0); server_bad_msg(rpdc, BAD_MSG_OPEN_COUNT); server_msg_noresp(rpdc, RPMEM_MSG_TYPE_OPEN); server_msg_resp(rpdc, RPMEM_MSG_TYPE_OPEN, 0); server_msg_resp(rpdc, RPMEM_MSG_TYPE_OPEN, 1); ret = rpmemd_obc_close(rpdc); UT_ASSERTeq(ret, 0); rpmemd_obc_fini(rpdc); }
/* * server_econnreset -- test case for closing connection when operation on * server is in progress - server side */ int server_econnreset(const struct test_case *tc, int argc, char *argv[]) { struct rpmemd_obc *rpdc; int ret; rpdc = rpmemd_obc_init(STDIN_FILENO, STDOUT_FILENO); UT_ASSERTne(rpdc, NULL); ret = rpmemd_obc_status(rpdc, 0); UT_ASSERTeq(ret, 0); ret = rpmemd_obc_process(rpdc, &REQ_CB, NULL); UT_ASSERTne(ret, 0); rpmemd_obc_fini(rpdc); return 0; }
int main(int argc, char *argv[]) { util_init(); int send_status = 1; int ret = 1; struct rpmemd *rpmemd = calloc(1, sizeof(*rpmemd)); if (!rpmemd) { RPMEMD_LOG(ERR, "!calloc"); goto err_rpmemd; } rpmemd->obc = rpmemd_obc_init(STDIN_FILENO, STDOUT_FILENO); if (!rpmemd->obc) { RPMEMD_LOG(ERR, "out-of-band connection intitialization"); goto err_obc; } if (rpmemd_log_init(DAEMON_NAME, NULL, 0)) { RPMEMD_LOG(ERR, "logging subsystem initialization failed"); goto err_log_init; } if (rpmemd_config_read(&rpmemd->config, argc, argv) != 0) { RPMEMD_LOG(ERR, "reading configuration failed"); goto err_config; } rpmemd_log_close(); rpmemd_log_level = rpmemd->config.log_level; if (rpmemd_log_init(DAEMON_NAME, rpmemd->config.log_file, rpmemd->config.use_syslog)) { RPMEMD_LOG(ERR, "logging subsystem initialization" " failed (%s, %d)", rpmemd->config.log_file, rpmemd->config.use_syslog); goto err_log_init_config; } RPMEMD_LOG(INFO, "%s version %s", DAEMON_NAME, SRCVERSION); rpmemd->persist = pmem_persist; rpmemd->persist_method = rpmemd_get_pm(&rpmemd->config); rpmemd->nthreads = rpmemd_get_nthreads(); if (!rpmemd->nthreads) { RPMEMD_LOG(ERR, "invalid number of threads -- '%lu'", rpmemd->nthreads); goto err_nthreads; } rpmemd->db = rpmemd_db_init(rpmemd->config.poolset_dir, 0666); if (!rpmemd->db) { RPMEMD_LOG(ERR, "!pool set db initialization"); goto err_db_init; } if (rpmemd->config.rm_poolset) { RPMEMD_LOG(INFO, "removing '%s'", rpmemd->config.rm_poolset); if (rpmemd_db_pool_remove(rpmemd->db, rpmemd->config.rm_poolset, rpmemd->config.force)) { RPMEMD_LOG(ERR, "removing '%s' failed", rpmemd->config.rm_poolset); } else { RPMEMD_LOG(NOTICE, "removed '%s'", rpmemd->config.rm_poolset); ret = 0; } send_status = 0; goto out_rm; } ret = rpmemd_obc_status(rpmemd->obc, 0); if (ret) { RPMEMD_LOG(ERR, "writing status failed"); goto err_status; } rpmemd_print_info(rpmemd); while (!ret) { ret = rpmemd_obc_process(rpmemd->obc, &rpmemd_req, rpmemd); if (ret) { RPMEMD_LOG(ERR, "out-of-band connection" " process failed"); goto err; } if (rpmemd->closing) break; } rpmemd_db_fini(rpmemd->db); rpmemd_config_free(&rpmemd->config); rpmemd_log_close(); rpmemd_obc_fini(rpmemd->obc); free(rpmemd); return 0; err: rpmemd_req_cleanup(rpmemd); err_status: out_rm: rpmemd_db_fini(rpmemd->db); err_db_init: err_nthreads: err_log_init_config: rpmemd_config_free(&rpmemd->config); err_config: rpmemd_log_close(); err_log_init: if (send_status) { if (rpmemd_obc_status(rpmemd->obc, (uint32_t)errno)) RPMEMD_LOG(ERR, "writing status failed"); } rpmemd_obc_fini(rpmemd->obc); err_obc: free(rpmemd); err_rpmemd: return ret; }
/* * server_msg_resp -- process a message of specified type, response to client * with specific status value and return status of sending response function */ int server_msg_resp(const struct test_case *tc, int argc, char *argv[]) { if (argc < 2) UT_FATAL("usage: %s msg_type status", tc->name); int type = atoi(argv[0]); int status = atoi(argv[1]); int ret; struct rpmemd_obc *rpdc; rpdc = rpmemd_obc_init(STDIN_FILENO, STDOUT_FILENO); UT_ASSERTne(rpdc, NULL); ret = rpmemd_obc_status(rpdc, 0); UT_ASSERTeq(ret, 0); struct req_cb_arg args = { .ret = 0, .force_ret = 0, .resp = 1, .types = (1 << type), .status = status, }; server_msg_args(rpdc, CONN_WAIT_CLOSE, &args); return 2; } /* * server_msg_noresp -- process a message of specified type, do not response to * client and return specific value from process callback */ int server_msg_noresp(const struct test_case *tc, int argc, char *argv[]) { if (argc < 1) UT_FATAL("usage: %s msg_type", tc->name); int type = atoi(argv[0]); int ret; struct rpmemd_obc *rpdc; rpdc = rpmemd_obc_init(STDIN_FILENO, STDOUT_FILENO); UT_ASSERTne(rpdc, NULL); ret = rpmemd_obc_status(rpdc, 0); UT_ASSERTeq(ret, 0); struct req_cb_arg args = { .ret = -1, .force_ret = 1, .resp = 0, .types = (1 << type), .status = 0, }; server_msg_args(rpdc, CONN_CLOSE, &args); return 1; } /* * server_bad_msg -- process a message and expect * error returned from rpmemd_obc_process function */ int server_bad_msg(const struct test_case *tc, int argc, char *argv[]) { int ret; struct rpmemd_obc *rpdc; rpdc = rpmemd_obc_init(STDIN_FILENO, STDOUT_FILENO); UT_ASSERTne(rpdc, NULL); ret = rpmemd_obc_status(rpdc, 0); UT_ASSERTeq(ret, 0); ret = rpmemd_obc_process(rpdc, &REQ_CB, NULL); UT_ASSERTne(ret, 0); rpmemd_obc_fini(rpdc); return 0; }
/* * server -- run server and process clients requests */ int server(const struct test_case *tc, int argc, char *argv[]) { int ret; struct req_arg arg = { .resp = RESP_ATTR_INIT, .pool_attr = POOL_ATTR_INIT, .closing = 0, }; struct rpmemd_obc *obc; obc = rpmemd_obc_init(0, 1); UT_ASSERTne(obc, NULL); ret = rpmemd_obc_status(obc, 0); UT_ASSERTeq(ret, 0); while (1) { ret = rpmemd_obc_process(obc, &REQ, &arg); if (arg.closing) { break; } else { UT_ASSERTeq(ret, 0); } } ret = rpmemd_obc_process(obc, &REQ, &arg); UT_ASSERTeq(ret, 1); rpmemd_obc_fini(obc); return 0; } /* * test_cases -- available test cases */ static struct test_case test_cases[] = { TEST_CASE(server), TEST_CASE(client_create), TEST_CASE(client_open), }; #define NTESTS (sizeof(test_cases) / sizeof(test_cases[0])) int main(int argc, char *argv[]) { START(argc, argv, "rpmem_obc"); common_init("rpmem_fip", "RPMEM_LOG_LEVEL", "RPMEM_LOG_FILE", 0, 0); rpmemd_log_init("rpmemd", getenv("RPMEMD_LOG_FILE"), 0); rpmemd_log_level = rpmemd_log_level_from_str( getenv("RPMEMD_LOG_LEVEL")); TEST_CASE_PROCESS(argc, argv, test_cases, NTESTS); common_fini(); rpmemd_log_close(); DONE(NULL); }
int main(int argc, char *argv[]) { int ret; util_init(); struct rpmemd_config config; rpmemd_log_init(DAEMON_NAME, NULL, 0); if (rpmemd_config_read(&config, argc, argv) != 0) { ret = 1; goto err_config; } rpmemd_log_level = config.log_level; rpmemd_log_init(DAEMON_NAME, config.log_file, config.use_syslog); RPMEMD_LOG(INFO, "%s version %s", DAEMON_NAME, SRCVERSION); struct rpmemd_obc *obc = rpmemd_obc_init(STDIN_FILENO, STDOUT_FILENO); if (!obc) { RPMEMD_LOG(ERR, "out-of-band connection intitialization"); ret = 1; goto err_obc; } struct rpmemd *rpmemd = calloc(1, sizeof(*rpmemd)); if (!rpmemd) { RPMEMD_LOG(ERR, "!calloc"); ret = rpmemd_obc_status(obc, (uint32_t)errno); if (ret) RPMEMD_LOG(ERR, "writing status failed"); goto err_rpmemd; } rpmemd->persist = pmem_persist; rpmemd->persist_method = rpmemd_get_pm(&config); rpmemd->nthreads = rpmemd_get_nthreads(); if (!rpmemd->nthreads) { RPMEMD_LOG(ERR, "invalid number of threads -- '%lu'", rpmemd->nthreads); ret = rpmemd_obc_status(obc, (uint32_t)errno); if (ret) RPMEMD_LOG(ERR, "writing status failed"); goto err_nthreads; } rpmemd->db = rpmemd_db_init(config.poolset_dir, 0666); if (!rpmemd->db) { RPMEMD_LOG(ERR, "!pool set db initialization"); ret = rpmemd_obc_status(obc, (uint32_t)errno); if (ret) RPMEMD_LOG(ERR, "writing status failed"); goto err_db_init; } rpmemd->obc = obc; ret = rpmemd_obc_status(obc, 0); if (ret) { RPMEMD_LOG(ERR, "writing status failed"); goto err_status; } while (!ret) { ret = rpmemd_obc_process(obc, &rpmemd_req, rpmemd); if (ret) { RPMEMD_LOG(ERR, "out-of-band connection" " process failed"); goto err; } if (rpmemd->closing) break; } rpmemd_obc_fini(rpmemd->obc); rpmemd_db_fini(rpmemd->db); free(rpmemd); rpmemd_log_close(); rpmemd_config_free(&config); return 0; err: err_status: err_db_init: err_nthreads: free(rpmemd); err_rpmemd: rpmemd_obc_fini(obc); err_obc: rpmemd_log_close(); rpmemd_config_free(&config); err_config: return ret; }