int __wrap_cm_msg_send(cm_ctx_t *cm_ctx, Sr__Msg *msg) { printf("'Sending' the message...\n"); sr__msg__free_unpacked(msg, NULL); return SR_ERR_OK; }
static void session_start_stop(int fd) { Sr__Msg *msg = NULL; uint8_t *msg_buf = NULL; size_t msg_size = 0; uint32_t session_id = 0; /* send session_start request */ cm_session_start_generate("nobody", &msg_buf, &msg_size); cm_message_send(fd, msg_buf, msg_size); free(msg_buf); /* receive the response */ msg = cm_message_recv(fd); assert_non_null(msg); assert_int_equal(msg->type, SR__MSG__MSG_TYPE__RESPONSE); assert_non_null(msg->response); assert_int_equal(msg->response->result, SR_ERR_OK); assert_int_equal(msg->response->operation, SR__OPERATION__SESSION_START); assert_non_null(msg->response->session_start_resp); session_id = msg->response->session_start_resp->session_id; sr__msg__free_unpacked(msg, NULL); /* send session-stop request */ cm_session_stop_generate(session_id, &msg_buf, &msg_size); cm_message_send(fd, msg_buf, msg_size); free(msg_buf); /* receive the response */ msg = cm_message_recv(fd); assert_non_null(msg); assert_int_equal(msg->type, SR__MSG__MSG_TYPE__RESPONSE); assert_non_null(msg->response); assert_int_equal(msg->response->result, SR_ERR_OK); assert_int_equal(msg->response->operation, SR__OPERATION__SESSION_STOP); assert_non_null(msg->response->session_stop_resp); assert_int_equal(msg->response->session_stop_resp->session_id, session_id); sr__msg__free_unpacked(msg, NULL); }
static void cm_msg_pack_to_buff(Sr__Msg *msg, uint8_t **msg_buf, size_t *msg_size) { assert_non_null(msg); assert_non_null(msg_buf); assert_non_null(msg_size); *msg_size = sr__msg__get_packed_size(msg); *msg_buf = calloc(*msg_size, sizeof(**msg_buf)); assert_non_null(*msg_buf); sr__msg__pack(msg, *msg_buf); sr__msg__free_unpacked(msg, NULL); }
static int cm_connect_to_server(int verify) { struct sockaddr_un addr; int fd = -1, rc = -1; Sr__Msg *msg = NULL; uint8_t *msg_buf = NULL; size_t msg_size = 0; fd = socket(AF_UNIX, SOCK_STREAM, 0); assert_int_not_equal(fd, -1); memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; strncpy(addr.sun_path, CM_AF_SOCKET_PATH, sizeof(addr.sun_path)-1); rc = connect(fd, (struct sockaddr*)&addr, sizeof(addr)); assert_int_not_equal(rc, -1); if (verify) { /* verify version */ cm_version_verify_generate(NULL, &msg_buf, &msg_size); cm_message_send(fd, msg_buf, msg_size); free(msg_buf); msg = cm_message_recv(fd); assert_non_null(msg); assert_int_equal(msg->type, SR__MSG__MSG_TYPE__RESPONSE); assert_non_null(msg->response); assert_int_equal(msg->response->result, SR_ERR_OK); assert_int_equal(msg->response->operation, SR__OPERATION__VERSION_VERIFY); assert_non_null(msg->response->version_verify_resp); sr__msg__free_unpacked(msg, NULL); } return fd; }
static void cm_buffers_test(void **state) { Sr__Msg *msg = NULL; uint8_t *msg_buf = NULL; size_t msg_size = 0; uint32_t session_id = 0; struct timespec ts = { 0 }; int fd = cm_connect_to_server(1); /* send session_start request */ cm_session_start_generate(NULL, &msg_buf, &msg_size); cm_message_send(fd, msg_buf, msg_size); free(msg_buf); /* receive the response */ msg = cm_message_recv(fd); assert_non_null(msg); assert_int_equal(msg->type, SR__MSG__MSG_TYPE__RESPONSE); assert_non_null(msg->response); assert_int_equal(msg->response->result, SR_ERR_OK); assert_int_equal(msg->response->operation, SR__OPERATION__SESSION_START); assert_non_null(msg->response->session_start_resp); session_id = msg->response->session_start_resp->session_id; sr__msg__free_unpacked(msg, NULL); /* send many get-item requests */ for (size_t i = 0; i < 1000; i++) { cm_get_item_generate(session_id, "/example-module:container/list[key1='key1'][key2='key2']/leaf", &msg_buf, &msg_size); cm_message_send(fd, msg_buf, msg_size); free(msg_buf); } /* wait for a while so that socket's output buffer will be full */ ts.tv_sec = 0; ts.tv_nsec = 100000000L; /* 100 milliseconds */ nanosleep(&ts, NULL); /* Receive all get-item responses */ for (size_t i = 0; i < 1000; i++) { msg = cm_message_recv(fd); assert_non_null(msg); assert_int_equal(msg->type, SR__MSG__MSG_TYPE__RESPONSE); assert_non_null(msg->response); assert_int_equal(msg->response->result, SR_ERR_OK); assert_int_equal(msg->response->operation, SR__OPERATION__GET_ITEM); assert_non_null(msg->response->get_item_resp); sr__msg__free_unpacked(msg, NULL); } /* send many get-item requests */ for (size_t i = 0; i < 1000; i++) { cm_get_item_generate(session_id, "/example-module:container/list[key1='key1'][key2='key2']/leaf", &msg_buf, &msg_size); cm_message_send(fd, msg_buf, msg_size); free(msg_buf); } /* send session-stop request */ cm_session_stop_generate(session_id, &msg_buf, &msg_size); cm_message_send(fd, msg_buf, msg_size); free(msg_buf); /* let the connection manager to be stopped in teardown before reading responses */ }
/** * Session start / stop negative test. */ static void cm_session_neg_test(void **state) { Sr__Msg *msg = NULL; uint8_t *msg_buf = NULL; size_t msg_size = 0; int fd1 = 0, fd2 = 0; uint32_t session_id1 = 0, session_id2 = 0; fd1 = cm_connect_to_server(0); /* try invalid version */ cm_version_verify_generate("invalid", &msg_buf, &msg_size); cm_message_send(fd1, msg_buf, msg_size); free(msg_buf); msg = cm_message_recv(fd1); assert_non_null(msg); assert_int_equal(msg->type, SR__MSG__MSG_TYPE__RESPONSE); assert_non_null(msg->response); assert_int_equal(msg->response->result, SR_ERR_VERSION_MISMATCH); assert_int_equal(msg->response->operation, SR__OPERATION__VERSION_VERIFY); assert_non_null(msg->response->version_verify_resp); assert_string_equal_bt(msg->response->version_verify_resp->soname, SR_COMPAT_VERSION); sr__msg__free_unpacked(msg, NULL); /* disconnect expected */ msg = cm_message_recv(fd1); assert_null(msg); close(fd1); fd1 = cm_connect_to_server(1); /* try a message with NULL request */ msg = calloc(1, sizeof(*msg)); assert_non_null(msg); sr__msg__init(msg); msg->type = SR__MSG__MSG_TYPE__REQUEST; /* send the message */ cm_msg_pack_to_buff(msg, &msg_buf, &msg_size); cm_message_send(fd1, msg_buf, msg_size); free(msg_buf); /* receive the response */ msg = cm_message_recv(fd1); /* disconnect expected */ assert_null(msg); close(fd1); fd1 = cm_connect_to_server(1); /* try a message with bad session id */ cm_session_stop_generate(999, &msg_buf, &msg_size); cm_message_send(fd1, msg_buf, msg_size); free(msg_buf); /* receive the response */ msg = cm_message_recv(fd1); /* disconnect expected */ assert_null(msg); close(fd1); fd1 = cm_connect_to_server(1); /* try a session_start request with non-existing username */ cm_session_start_generate("non-existing-username", &msg_buf, &msg_size); cm_message_send(fd1, msg_buf, msg_size); free(msg_buf); /* receive the response */ msg = cm_message_recv(fd1); assert_non_null(msg); assert_non_null(msg->response); assert_non_null(msg->response->session_start_resp); /* expect invalid user error */ assert_int_equal(msg->response->result, SR_ERR_INVAL_USER); sr__msg__free_unpacked(msg, NULL); close(fd1); fd1 = cm_connect_to_server(1); fd2 = cm_connect_to_server(1); /* try to stop session via another connection */ /* session_start request */ cm_session_start_generate("nobody", &msg_buf, &msg_size); cm_message_send(fd1, msg_buf, msg_size); free(msg_buf); /* receive the response */ msg = cm_message_recv(fd1); assert_non_null(msg); assert_non_null(msg->response); assert_non_null(msg->response->session_start_resp); session_id1 = msg->response->session_start_resp->session_id; sr__msg__free_unpacked(msg, NULL); /* stop via another connection */ cm_session_stop_generate(session_id1, &msg_buf, &msg_size); cm_message_send(fd2, msg_buf, msg_size); free(msg_buf); /* receive the response */ msg = cm_message_recv(fd2); /* disconnect expected */ assert_null(msg); close(fd2); fd2 = cm_connect_to_server(1); /* try sending a response */ /* session_start request */ cm_session_start_generate("nobody", &msg_buf, &msg_size); cm_message_send(fd2, msg_buf, msg_size); free(msg_buf); /* receive the response */ msg = cm_message_recv(fd2); assert_non_null(msg); assert_non_null(msg->response); assert_non_null(msg->response->session_start_resp); session_id2 = msg->response->session_start_resp->session_id; sr__msg__free_unpacked(msg, NULL); /* send BAD response */ sr_gpb_resp_alloc(NULL, SR__OPERATION__SESSION_STOP, session_id2, &msg); cm_msg_pack_to_buff(msg, &msg_buf, &msg_size); cm_message_send(fd2, msg_buf, msg_size); free(msg_buf); /* receive the response */ msg = cm_message_recv(fd2); /* disconnect expected */ assert_null(msg); close(fd2); /* try to stop another session id */ sr_gpb_req_alloc(NULL, SR__OPERATION__SESSION_STOP, session_id1, &msg); assert_non_null(msg); assert_non_null(msg->request); assert_non_null(msg->request->session_stop_req); msg->request->session_stop_req->session_id = 0; /* should be invalid */ cm_msg_pack_to_buff(msg, &msg_buf, &msg_size); cm_message_send(fd1, msg_buf, msg_size); free(msg_buf); /* receive the response - error is expected */ msg = cm_message_recv(fd1); assert_non_null(msg); assert_non_null(msg->response); assert_int_not_equal(msg->response->result, SR_ERR_OK); assert_non_null(sr_strerror(msg->response->result)); assert_non_null(msg->response->error); assert_non_null(msg->response->error->message); sr__msg__free_unpacked(msg, NULL); /* try sending a message with invalid type */ sr_gpb_resp_alloc(NULL, SR__OPERATION__SESSION_STOP, session_id1, &msg); msg->type = 53; cm_msg_pack_to_buff(msg, &msg_buf, &msg_size); cm_message_send(fd1, msg_buf, msg_size); free(msg_buf); /* receive the response */ msg = cm_message_recv(fd1); /* disconnect expected */ assert_null(msg); close(fd1); fd2 = cm_connect_to_server(1); /* try not closing a connection with an open session (auto cleanup) */ /* session_start request */ cm_session_start_generate(NULL, &msg_buf, &msg_size); cm_message_send(fd2, msg_buf, msg_size); free(msg_buf); /* receive the response */ msg = cm_message_recv(fd2); assert_non_null(msg); assert_non_null(msg->response); assert_non_null(msg->response->session_start_resp); session_id2 = msg->response->session_start_resp->session_id; sr__msg__free_unpacked(msg, NULL); cm_teardown(state); close(fd2); }