/** * Test RP processing of an invalid messages. */ static void rp_msg_neg_test(void **state) { int rc = 0; rp_session_t *session = NULL; Sr__Msg *msg = NULL; rp_ctx_t *rp_ctx = *state; assert_non_null(rp_ctx); ac_ucred_t credentials = { 0 }; credentials.e_uid = getuid(); credentials.e_gid = getgid(); /* generate some request */ rc = sr_gpb_req_alloc(SR__OPERATION__GET_ITEM, 123456, &msg); assert_int_equal(rc, SR_ERR_OK); assert_non_null(msg); /* process the message with NULL session */ rc = rp_msg_process(rp_ctx, NULL, msg); assert_int_equal(rc, SR_ERR_OK); /* create a session */ rc = rp_session_start(rp_ctx, 123456, &credentials, SR_DS_STARTUP, false, &session); assert_int_equal(rc, SR_ERR_OK); assert_non_null(session); /* RP does not implement session start request */ rc = sr_gpb_req_alloc(SR__OPERATION__SESSION_START, 123456, &msg); assert_int_equal(rc, SR_ERR_OK); assert_non_null(msg); /* process the message */ rc = rp_msg_process(rp_ctx, session, msg); assert_int_equal(rc, SR_ERR_OK); /* RP does not implement session start response */ rc = sr_gpb_resp_alloc(SR__OPERATION__SESSION_START, 123456, &msg); assert_int_equal(rc, SR_ERR_OK); assert_non_null(msg); /* process the message */ rc = rp_msg_process(rp_ctx, session, msg); assert_int_equal(rc, SR_ERR_OK); /* stop the session */ rc = rp_session_stop(rp_ctx, session); assert_int_equal(rc, SR_ERR_OK); }
/** * 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); }