#!/usr/bin/env bash # Copyright © 2023 OpenIM. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # # OpenIM RPC Service Test Control Script # # This control script is designed to conduct various tests on the OpenIM RPC services. # It includes functions to perform smoke tests, API tests, and comprehensive service tests. # The script is intended to be used in a Linux environment with appropriate permissions and # environmental variables set. # # It provides robust error handling and logging to facilitate debugging and service monitoring. # Functions within the script can be called directly or passed as arguments to perform # systematic testing, ensuring the integrity of the RPC services. # # Test Functions: # - openim::test::smoke: Runs basic tests to ensure the fundamental functionality of the service. # - openim::test::api: Executes a series of API tests covering authentication, user, friend, # group, and message functionalities. # - openim::test::test: Performs a complete test suite, invoking utility checks and all defined # test cases, and reports on their success. # # The root of the build/dist directory OPENIM_ROOT=$(dirname "${BASH_SOURCE[0]}")/../.. [[ -z ${COMMON_SOURCED} ]] && source ${OPENIM_ROOT}/scripts/install/common.sh # API Server API Address:Port INSECURE_OPENIMAPI="http://${OPENIM_API_HOST}:${API_OPENIM_PORT}" INSECURE_OPENIMAUTO=${OPENIM_RPC_AUTH_HOST}:${OPENIM_AUTH_PORT} CCURL="curl -f -s -XPOST" # Create UCURL="curl -f -s -XPUT" # Update RCURL="curl -f -s -XGET" # Retrieve DCURL="curl -f -s -XDELETE" # Delete openim::test::check_error() { local response=$1 local err_code=$(echo "$response" | jq '.errCode') openim::log::status "Response from user registration: $response" if [[ "$err_code" != "0" ]]; then openim::log::error_exit "Error occurred: $response, You can read the error code in the API documentation https://docs.openim.io/restapi/errcode" else openim::log::success "Operation was successful." fi } # The `openim::test::auth` function serves as a test suite for authentication-related operations. function openim::test::auth() { # 1. Retrieve and set the authentication token. openim::test::get_token # 2. Force logout the test user from a specific platform. openim::test::force_logout # Log the completion of the auth test suite. openim::log::success "Auth test suite completed successfully." } #################################### Auth Module #################################### # Define a function to get a token for a specific user openim::test::get_token() { local user_id="${1:-imAdmin}" # Default user ID if not provided token_response=$( ${CCURL} "${OperationID}" "${Header}" ${INSECURE_OPENIMAPI}/auth/user_token \ -d'{"secret": "'"$SECRET"'","platformID": 1,"userID": "'$user_id'"}' ) token=$(echo $token_response | grep -Po 'token[" :]+\K[^"]+') echo "$token" } Header="-HContent-Type: application/json" OperationID="-HoperationID: 1646445464564" Token="-Htoken: $(openim::test::get_token)" # Forces a user to log out from the specified platform by user ID. openim::test::force_logout() { local request_body=$( cat <<EOF { "platformID": 2, "userID": "4950983283" } EOF ) echo "Requesting force logout for user: $request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/auth/force_logout" -d "${request_body}") openim::test::check_error "$response" } #################################### User Module #################################### # Registers a new user with provided user ID, nickname, and face URL using the API. openim::test::user_register() { # Assign the parameters to local variables, with defaults if not provided local user_id="${1:-${TEST_USER_ID}}" local nickname="${2:-cubxxw}" local face_url="${3:-https://github.com/cubxxw}" # Create the request body using the provided or default values local request_body=$( cat <<EOF { "secret": "${SECRET}", "users": [ { "userID": "${user_id}", "nickname": "${nickname}", "faceURL": "${face_url}" } ] } EOF ) echo "Request body for user registration: $request_body" # Send the registration request local user_register_response=$(${CCURL} "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/user/user_register" -d "${request_body}") # Check for errors in the response openim::test::check_error "$user_register_response" } # Checks if the provided list of user IDs exist in the system. openim::test::check_user_account() { local request_body=$( cat <<EOF { "checkUserIDs": [ "${1}" ] } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/user/account_check" -d "${request_body}") openim::test::check_error "$response" } # Retrieves a list of users with pagination, limited to a specific number per page. openim::test::get_users() { local request_body=$( cat <<EOF { "pagination": { "pageNumber": 1, "showNumber": 100 } } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/user/get_users" -d "${request_body}") openim::test::check_error "$response" } # Obtains detailed information for a list of user IDs. openim::test::get_users_info() { local request_body=$( cat <<EOF { "userIDs": [ "${1}" ] } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/user/get_users_info" -d "${request_body}") openim::test::check_error "$response" } # Retrieves the online status for a list of user IDs. openim::test::get_users_online_status() { local request_body=$( cat <<EOF { "userIDs": [ "${TEST_USER_ID}" ] } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/user/get_users_online_status" -d "${request_body}") openim::test::check_error "$response" } # Updates the information for a user, such as nickname and face URL. openim::test::update_user_info() { local request_body=$( cat <<EOF { "userInfo": { "userID": "${TEST_USER_ID}", "nickname": "openimbot", "faceURL": "https://github.com/openimbot" } } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/user/update_user_info" -d "${request_body}") openim::test::check_error "$response" } # Gets the online status for users that a particular user has subscribed to. openim::test::get_subscribe_users_status() { local request_body=$( cat <<EOF { "userID": "${TEST_USER_ID}" } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/user/get_subscribe_users_status" -d "${request_body}") openim::test::check_error "$response" } # Subscribes to the online status of a list of users for a particular user ID. openim::test::subscribe_users_status() { local request_body=$( cat <<EOF { "userID": "9168684795", "userIDs": [ "7475779354", "6317136453", "8450535746" ], "genre": 1 } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/user/subscribe_users_status" -d "${request_body}") openim::test::check_error "$response" } # Sets the global message receiving option for a user, determining their messaging preferences. openim::test::set_global_msg_recv_opt() { local request_body=$( cat <<EOF { "userID": "${TEST_USER_ID}", "globalRecvMsgOpt": 0 } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/user/set_global_msg_recv_opt" -d "${request_body}") openim::test::check_error "$response" } # [openim::test::user function description] # The `openim::test::user` function serves as a test suite for user-related operations. # It sequentially invokes all user-related test functions to ensure the API's user operations are functioning correctly. function openim::test::user() { # 1. Register a test user. local USER_ID=$RANDOM local TEST_USER_ID=$RANDOM openim::test::user_register "${USER_ID}" "user01" "new_face_url" openim::test::user_register "${TEST_USER_ID}" "user01" "new_face_url" # 2. Check if the test user's account exists. openim::test::check_user_account "${TEST_USER_ID}" # 3. Retrieve a list of users. openim::test::get_users # 4. Get detailed information for the test user. openim::test::get_users_info "${TEST_USER_ID}" # 5. Check the online status of the test user. openim::test::get_users_online_status # 6. Update the test user's information. openim::test::update_user_info # 7. Get the status of users subscribed by the test user. openim::test::get_subscribe_users_status # 8. Subscribe the test user to a set of user statuses. openim::test::subscribe_users_status # 9. Set the message receiving option for the test user. openim::test::set_global_msg_recv_opt # Log the completion of the user test suite. openim::log::success "User test suite completed successfully." } #################################### Friend Module #################################### # Checks if two users are friends. openim::test::is_friend() { local request_body=$( cat <<EOF { "userID1": "${1}", "userID2": "${2}" } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/friend/is_friend" -d "${request_body}") openim::test::check_error "$response" } # Deletes a friend for a user. openim::test::delete_friend() { local request_body=$( cat <<EOF { "ownerUserID":"${1}", "friendUserID":"${2}" } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/friend/delete_friend" -d "${request_body}") openim::test::check_error "$response" } # Gets the friend application list for a user. openim::test::get_friend_apply_list() { local request_body=$( cat <<EOF { "userID": "${IM_ADMIN_USERID}", "pagination": { "pageNumber": 1, "showNumber": 100 } } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/friend/get_friend_apply_list" -d "${request_body}") openim::test::check_error "$response" } # Gets the friend list for a user. openim::test::get_friend_list() { local request_body=$( cat <<EOF { "userID": "${1}", "pagination": { "pageNumber": 1, "showNumber": 100 } } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/friend/get_friend_list" -d "${request_body}") openim::test::check_error "$response" } # Sets a remark for a friend. openim::test::set_friend_remark() { local request_body=$( cat <<EOF { "ownerUserID": "${1}", "friendUserID": "${2}", "remark": "remark" } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/friend/set_friend_remark" -d "${request_body}") openim::test::check_error "$response" } # Adds a friend request. openim::test::add_friend() { local request_body=$( cat <<EOF { "fromUserID": "${1}", "toUserID": "${2}", "reqMsg": "hello!", "ex": "" } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/friend/add_friend" -d "${request_body}") openim::test::check_error "$response" } # Imports friends for a user. openim::test::import_friend() { local friend_ids=$(printf ', "%s"' "${@:2}") friend_ids=${friend_ids:2} local request_body=$( cat <<EOF { "ownerUserID": "${1}", "friendUserIDs": [${friend_ids}] } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/friend/import_friend" -d "${request_body}") openim::test::check_error "$response" } # Responds to a friend request. openim::test::add_friend_response() { local request_body=$( cat <<EOF { "fromUserID": "${1}", "toUserID": "${2}", "handleResult": 1, "handleMsg": "agree" } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/friend/add_friend_response" -d "${request_body}") openim::test::check_error "$response" } # Retrieves the friend application list that the user has applied for. openim::test::get_self_friend_apply_list() { local request_body=$( cat <<EOF { "userID": "${1}", "pagination": { "pageNumber": ${2}, "showNumber": ${3} } } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/friend/get_self_friend_apply_list" -d "${request_body}") openim::test::check_error "$response" } # Adds a user to the blacklist. openim::test::add_black() { local request_body=$( cat <<EOF { "ownerUserID": "${1}", "blackUserID": "${2}" } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/friend/add_black" -d "${request_body}") openim::test::check_error "$response" } # Removes a user from the blacklist. openim::test::remove_black() { local request_body=$( cat <<EOF { "ownerUserID": "${1}", "blackUserID": "${2}" } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/friend/remove_black" -d "${request_body}") openim::test::check_error "$response" } # Retrieves the blacklist for a user. openim::test::get_black_list() { local request_body=$( cat <<EOF { "userID": "${1}", "pagination": { "pageNumber": 1, "showNumber": 100 } } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/friend/get_black_list" -d "${request_body}") openim::test::check_error "$response" } # Updates the pin status of multiple friends. openim::test::update_pin_status() { local ownerUserID="${1}" shift # Shift the arguments to skip the first one (ownerUserID) local isPinned="${1}" shift # Shift the arguments to skip the isPinned argument # Constructing the list of friendUserIDs local friendUserIDsArray=() for friendUserID in "$@"; do friendUserIDsArray+=("\"${friendUserID}\"") done local friendUserIDs=$( IFS=, echo "${friendUserIDsArray[*]}" ) local request_body=$( cat <<EOF { "ownerUserID": "${ownerUserID}", "friendUserIDs": [${friendUserIDs}], "isPinned": ${isPinned} } EOF ) echo "Requesting to update pin status: $request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/friend/update_pin_status" -d "${request_body}") echo "Response: $response" openim::test::check_error "$response" } # [openim::test::friend function description] # The `openim::test::friend` function serves as a test suite for friend-related operations. # It sequentially invokes all friend-related test functions to ensure the API's friend operations are functioning correctly. function openim::test::friend() { local FRIEND_USER_ID=$RANDOM local BLACK_USER_ID=$RANDOM local TEST_USER_ID=$RANDOM # Assumes that TEST_USER_ID, FRIEND_USER_ID, and other necessary IDs are set as environment variables before running this suite. # 0. Register a friend user. openim::test::user_register "${TEST_USER_ID}" "user01" "new_face_url" openim::test::user_register "${FRIEND_USER_ID}" "frient01" "new_face_url" openim::test::user_register "${BLACK_USER_ID}" "frient02" "new_face_url" # 1. Check if two users are friends. openim::test::is_friend "${TEST_USER_ID}" "${FRIEND_USER_ID}" # 2. Send a friend request from one user to another. openim::test::add_friend "${TEST_USER_ID}" "${FRIEND_USER_ID}" local original_token=$Token # Switch to FRIEND_USER_ID's token local friend_token="-Htoken: $(openim::test::get_token "${FRIEND_USER_ID}")" # 3. Respond to a friend request. # TODO: # openim::test::add_friend_response "${FRIEND_USER_ID}" "${TEST_USER_ID}" Token=$original_token # 4. Retrieve the friend list of the test user. openim::test::get_friend_list "${TEST_USER_ID}" # 5. Set a remark for a friend. # TODO: # openim::test::set_friend_remark "${TEST_USER_ID}" "${FRIEND_USER_ID}" # 6. Retrieve the friend application list for the test user. openim::test::get_friend_apply_list "${TEST_USER_ID}" 1 100 # 7. Retrieve the friend application list that the user has applied for. openim::test::get_self_friend_apply_list "${TEST_USER_ID}" 1 100 # 8. Delete a friend. # TODO: # openim::test::delete_friend "${TEST_USER_ID}" "${FRIEND_USER_ID}" # 9. Add a user to the blacklist. openim::test::add_black "${TEST_USER_ID}" "${BLACK_USER_ID}" # 10. Remove a user from the blacklist. openim::test::remove_black "${TEST_USER_ID}" "${BLACK_USER_ID}" # 11. Retrieve the blacklist for the test user. openim::test::get_black_list "${TEST_USER_ID}" # 12. Import friends for the user (Optional). # TODO: # openim::test::import_friend "${TEST_USER_ID}" "11111114" "11111115" # 13. pin Friend # Add this call to your test suite where appropriate # TODO: # openim::test::update_pin_status "${TEST_USER_ID}" true "${FRIEND_USER_ID}" # # openim::test::update_pin_status "${TEST_USER_ID}" false "${FRIEND_USER_ID}" # Log the completion of the friend test suite. openim::log::success "Friend test suite completed successfully." } #################################### Group Module #################################### # Creates a new group. openim::test::create_group() { local request_body=$( cat <<EOF { "memberUserIDs": [ "${1}" ], "adminUserIDs": [ "${2}" ], "ownerUserID": "${3}", "groupInfo": { "groupID": "${4}", "groupName": "test-group", "notification": "notification", "introduction": "introduction", "faceURL": "faceURL url", "ex": "ex", "groupType": 2, "needVerification": 0, "lookMemberInfo": 0, "applyMemberFriend": 0 } } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/group/create_group" -d "${request_body}") openim::test::check_error "$response" } # Invites a user to join a group. openim::test::invite_user_to_group() { local request_body=$( cat <<EOF { "groupID": "${1}", "invitedUserIDs": [ "${2}", "${3}" ], "reason": "your reason" } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/group/invite_user_to_group" -d "${request_body}") openim::test::check_error "$response" } # Transfers the ownership of a group to another user. openim::test::transfer_group() { local request_body=$( cat <<EOF { "groupID":"${1}", "oldOwnerUserID":"${2}", "newOwnerUserID": "${3}" } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/group/transfer_group" -d "${request_body}") openim::test::check_error "$response" } # Retrieves information about multiple groups. openim::test::get_groups_info() { local request_body=$( cat <<EOF { "groupIDs": ["${1}", "${2}"] } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/group/get_groups_info" -d "${request_body}") openim::test::check_error "$response" } # Removes a user from a group. openim::test::kick_group() { local request_body=$( cat <<EOF { "groupID": "${1}", "kickedUserIDs": [ "${2}" ], "reason": "Bye!" } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/group/kick_group" -d "${request_body}") openim::test::check_error "$response" } # Retrieves information about group members. openim::test::get_group_members_info() { local request_body=$( cat <<EOF { "groupID": "${1}", "userIDs": ["${2}"] } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/group/get_group_members_info" -d "${request_body}") openim::test::check_error "$response" } # Retrieves a list of group members. openim::test::get_group_member_list() { local request_body=$( cat <<EOF { "groupID": "${1}", "pagination": { "pageNumber": ${2}, "showNumber": ${3} } } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/group/get_group_member_list" -d "${request_body}") openim::test::check_error "$response" } # Retrieves a list of groups that a user has joined. openim::test::get_joined_group_list() { local request_body=$( cat <<EOF { "fromUserID": "${1}", "pagination": { "showNumber": ${2}, "pageNumber": ${3} } } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/group/get_joined_group_list" -d "${request_body}") openim::test::check_error "$response" } # Sets group member information. openim::test::set_group_member_info() { local request_body=$( cat <<EOF { "members": [ { "groupID": "${1}", "userID": "${2}", "nickName": "${3}", "faceURL": "${4}", "roleLevel": ${5}, "ex":"${6}" } ] } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/group/set_group_member_info" -d "${request_body}") openim::test::check_error "$response" } # Mutes a group. openim::test::mute_group() { local request_body=$( cat <<EOF { "groupID": "${1}" } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/group/mute_group" -d "${request_body}") openim::test::check_error "$response" } # Cancels the muting of a group. openim::test::cancel_mute_group() { local request_body=$( cat <<EOF { "groupID": "${1}" } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/group/cancel_mute_group" -d "${request_body}") openim::test::check_error "$response" } # Dismisses a group. openim::test::dismiss_group() { local request_body=$( cat <<EOF { "groupID":"${1}" } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/group/dismiss_group" -d "${request_body}") openim::test::check_error "$response" } # Cancels muting a group member. openim::test::cancel_mute_group_member() { local request_body=$( cat <<EOF { "groupID": "${1}", "userID": "${2}" } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/group/cancel_mute_group_member" -d "${request_body}") openim::test::check_error "$response" } # Allows a user to join a group. openim::test::join_group() { local request_body=$( cat <<EOF { "groupID": "${1}", "reqMessage": "req msg join group", "joinSource": 0, "inviterUserID": "${2}" } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/group/join_group" -d "${request_body}") openim::test::check_error "$response" } # Sets group information. openim::test::set_group_info() { local request_body=$( cat <<EOF { "groupInfoForSet": { "groupID": "${1}", "groupName": "new-name", "notification": "new notification", "introduction": "new introduction", "faceURL": "www.newfaceURL.com", "ex": "new ex", "needVerification": 1, "lookMemberInfo": 1, "applyMemberFriend": 1 } } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/group/set_group_info" -d "${request_body}") openim::test::check_error "$response" } # Allows a user to quit a group. openim::test::quit_group() { local request_body=$( cat <<EOF { "groupID": "${1}", "userID": "${2}" } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/group/quit_group" -d "${request_body}") openim::test::check_error "$response" } # Retrieves the list of group applications received by the user. openim::test::get_recv_group_applicationList() { local request_body=$( cat <<EOF { "fromUserID": "${1}", "pagination": { "pageNumber": ${2}, "showNumber": ${3} } } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/group/get_recv_group_applicationList" -d "${request_body}") openim::test::check_error "$response" } # Responds to a group application. openim::test::group_application_response() { local request_body=$( cat <<EOF { "groupID": "${1}", "fromUserID": "${2}", "handledMsg": "", "handleResult": 1 } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/group/group_application_response" -d "${request_body}") openim::test::check_error "$response" } # Retrieves the list of group applications made by the user. openim::test::get_user_req_group_applicationList() { local request_body=$( cat <<EOF { "userID": "${1}", "pagination": { "pageNumber": ${2}, "showNumber": ${3} } } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/group/get_user_req_group_applicationList" -d "${request_body}") openim::test::check_error "$response" } # Mutes a group member for a specified duration. openim::test::mute_group_member() { local request_body=$( cat <<EOF { "groupID": "${1}", "userID": "${2}", "mutedSeconds": ${3} } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/group/mute_group_member" -d "${request_body}") openim::test::check_error "$response" } # Retrieves a list of group applications from specific users. openim::test::get_group_users_req_application_list() { local request_body=$( cat <<EOF { "groupID": "${1}", "userIDs": [ "${2}" ] } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/group/get_group_users_req_application_list" -d "${request_body}") openim::test::check_error "$response" } # [openim::test::group function description] # The `openim::test::group` function serves as a test suite for group-related operations. # It sequentially invokes all group-related test functions to ensure the API's group operations are functioning correctly. function openim::test::group() { local USER_ID=$RANDOM local OTHER_USER1_ID=$RANDOM local OTHER_USER2_ID=$RANDOM local OTHER_USER3_ID=$RANDOM local TEST_USER_ID=$RANDOM local GROUP_ID=$RANDOM local GROUP_ID2=$RANDOM # Assumes that TEST_GROUP_ID, USER_ID, and other necessary IDs are set as environment variables before running this suite. # 0. Register a friend user. openim::test::user_register "${USER_ID}" "group00" "new_face_url" openim::test::user_register "${OTHER_USER1_ID}" "group01" "new_face_url" openim::test::user_register "${OTHER_USER2_ID}" "group02" "new_face_url" openim::test::user_register "${OTHER_USER3_ID}" "group03" "new_face_url" # 0. Create a new group. openim::test::create_group "$OTHER_USER2_ID" "$OTHER_USER1_ID" "$USER_ID" "$GROUP_ID" # 1. Invite user to group. openim::test::invite_user_to_group "$GROUP_ID" "$IM_ADMIN_USERID" "$OTHER_USER3_ID" # 2. Transfer group ownership. openim::test::transfer_group "$GROUP_ID" "$USER_ID" "$OTHER_USER1_ID" # 3. Get group information. openim::test::get_groups_info "$GROUP_ID" "$OTHER_USER1_ID" # 4. Kick a user from the group. # TODO # openim::test::kick_group "$GROUP_ID" "$OTHER_USER2_ID" # 5. Get group members info. openim::test::get_group_members_info "$GROUP_ID" "$USER_ID" # 6. Get group member list. openim::test::get_group_member_list "$GROUP_ID" 1 100 # 7. Get joined group list. openim::test::get_joined_group_list "$USER_ID" 10 1 # 8. Set group member info. openim::test::set_group_member_info "$GROUP_ID" "$USER_ID" "New NickName" "New Face URL" 60 "Extra Info" # 9. Mute group. openim::test::mute_group "$GROUP_ID" # 10. Cancel mute group. openim::test::cancel_mute_group "$GROUP_ID" # 11. Dismiss group. openim::test::dismiss_group "$GROUP_ID" openim::test::create_group "$OTHER_USER2_ID" "$OTHER_USER1_ID" "$USER_ID" "$GROUP_ID2" # 12. Cancel mute group member. openim::test::cancel_mute_group_member "$GROUP_ID" "$USER_ID" # 13. Join group. # TODO: # openim::test::join_group "$GROUP_ID2" "$OTHER_USER2_ID" # 14. Set group info. openim::test::set_group_info "$GROUP_ID2" # 15. Quit group. # TODO # openim::test::quit_group "$GROUP_ID2" "$OTHER_USER1_ID" # 16. Get received group application list. openim::test::get_recv_group_applicationList "$USER_ID" 1 100 # 17. Group application response. # TODO: # openim::test::group_application_response "$GROUP_ID2" "$OTHER_USER2_ID" # 18. Get user requested group application list. openim::test::get_user_req_group_applicationList "$USER_ID" 1 100 # 19. Mute group member. openim::test::mute_group_member "$GROUP_ID" "$OTHER_USER1_ID" 3600 # 20. Get group users request application list. openim::test::get_group_users_req_application_list "$GROUP_ID" "$USER_ID" # Log the completion of the group test suite. openim::log::success "Group test suite completed successfully." } #################################### Register And Check Module #################################### # Define a function to register a user openim::register_user() { user_register_response=$( ${CCURL} "${Header}" ${INSECURE_OPENIMAPI}/user/user_register \ -d'{ "secret": "openIM123", "users": [{"userID": "11111112","nickname": "yourNickname","faceURL": "yourFaceURL"}] }' ) echo "$user_register_response" } # Define a function to check the account openim::test::check_account() { local token=$1 account_check_response=$( ${CCURL} "${Header}" -H"operationID: 1646445464564" -H"token: ${token}" ${INSECURE_OPENIMAPI}/user/account_check \ -d'{ "checkUserIDs": ["11111111","11111112"] }' ) echo "$account_check_response" } # Define a function to register, get a token and check the account openim::test::register_and_check() { # Register a user user_register_response=$(openim::register_user) if [[ "$user_register_response" == *"\"errCode\": 0"* ]]; then echo "User registration successful." # Get token token=$(openim::test::get_token) if [[ -n "$token" ]]; then echo "Token acquired: $token" # Check account account_check_response=$(openim::check_account "$token") if [[ "$account_check_response" == *"\"errCode\": 0"* ]]; then echo "Account check successful." else echo "Account check failed." fi else echo "Failed to acquire token." fi else echo "User registration failed." fi } #################################### Msg Module #################################### # Sends a message. openim::test::send_msg() { local sendID="${1}" local recvID="${2}" local groupID="${3}" local request_body=$( cat <<EOF { "sendID": "${sendID}", "recvID": "${recvID}", "groupID": "${groupID}", "senderNickname": "openIMAdmin-Gordon", "senderFaceURL": "http://www.head.com", "senderPlatformID": 1, "content": { "content": "hello!!" }, "contentType": 101, "sessionType": 1, "isOnlineOnly": false, "notOfflinePush": false, "sendTime": $(date +%s)000, "offlinePushInfo": { "title": "send message", "desc": "", "ex": "", "iOSPushSound": "default", "iOSBadgeCount": true } } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/msg/send_msg" -d "${request_body}") openim::test::check_error "$response" } # Searches for messages. openim::test::search_msg() { local sendID="${1}" local recvID="${2}" local msgType="${3}" local sendTime="${4}" local sessionType="${5}" local pageNumber="${6}" local showNumber="${7}" # Construct the request body local request_body=$( cat <<EOF { "sendID": "${sendID}", "recvID": "${recvID}", "msgType": ${msgType}, "sendTime": "${sendTime}", "sessionType": ${sessionType}, "pagination": { "pageNumber": ${pageNumber}, "showNumber": ${showNumber} } } EOF ) echo "$request_body" # Send the request local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/msg/search_msg" -d "${request_body}") # Check the response for errors openim::test::check_error "$response" } # Pulls messages by sequence. openim::test::pull_msg_by_seq() { local userID="${1}" local conversationID="${2}" local beginSeq="${3}" local endSeq="${4}" local num="${5}" local order="${6}" # Assuming 0 for ascending, 1 for descending # Construct the request body local request_body=$( cat <<EOF { "userID": "${userID}", "seqRanges": [ { "conversationID": "${conversationID}", "begin": ${beginSeq}, "end": ${endSeq}, "num": ${num} } ], "order": ${order} } EOF ) echo "$request_body" # Send the request local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/msg/pull_msg_by_seq" -d "${request_body}") # Check the response for errors openim::test::check_error "$response" } # Revokes a message. openim::test::revoke_msg() { local userID="${1}" local conversationID="${2}" local seq="${3}" local request_body=$( cat <<EOF { "userID": "${userID}", "conversationID": "${conversationID}", "seq": ${seq} } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/msg/revoke_msg" -d "${request_body}") openim::test::check_error "$response" } # Clears all messages for a user. openim::test::user_clear_all_msg() { local userID="${1}" local request_body=$( cat <<EOF { "userID": "${userID}" } EOF ) echo "$request_body" local response=$(${CCURL} "${Token}" "${OperationID}" "${Header}" "${INSECURE_OPENIMAPI}/msg/user_clear_all_msg" -d "${request_body}") openim::test::check_error "$response" } # [openim::test::msg function description] # The `openim::test::msg` function serves as a test suite for message-related operations. # It sequentially invokes all message-related test functions to ensure the API's message operations are functioning correctly. function openim::test::msg() { local SEND_USER_ID="${IM_ADMIN_USERID}" # This should be the sender's userID local GROUP_ID="" # GroupID if it's a group message local USER_ID="$RANDOM" openim::test::user_register "${USER_ID}" "msg00" "new_face_url" local RECV_USER_ID="${USER_ID}" # Receiver's userID # 0. Send a message. openim::test::send_msg "${SEND_USER_ID}" "${RECV_USER_ID}" "${GROUP_ID}" # Wait for a short duration to ensure message is sent # 1. Search for the message local SEARCH_TIME="2023-01-01T00:00:00Z" # You may need to adjust this local MSG_TYPE=101 local SESSION_TYPE=1 local PAGE_NUMBER=1 local SHOW_NUMBER=20 echo "Searching for messages between ${SEND_USER_ID} and ${RECV_USER_ID}..." openim::test::search_msg "${IM_ADMIN_USERID}" "${RECV_USER_ID}" "${MSG_TYPE}" "${SEARCH_TIME}" "${SESSION_TYPE}" "${PAGE_NUMBER}" "${SHOW_NUMBER}" # 3. Pull messages by sequence. local CONVERSATION_ID="ci_${SEND_USER_ID}_${RECV_USER_ID}" # Adjust as per your conversation ID format local BEGIN_SEQ=0 local END_SEQ=10 local NUM=5 local ORDER=0 # Assuming 0 for ascending order openim::test::pull_msg_by_seq "${RECV_USER_ID}" "${CONVERSATION_ID}" "${BEGIN_SEQ}" "${END_SEQ}" "${NUM}" "${ORDER}" # Assuming message sending was successful and returned a sequence number. local SEQ_NUMBER=1 # This should be the actual sequence number of the message sent. # 2. Revoke a message. # TODO: # openim::test::revoke_msg "${RECV_USER_ID}" "si_${SEND_USER_ID}_${RECV_USER_ID}" "${SEQ_NUMBER}" # 4. Clear all messages for a user. openim::test::user_clear_all_msg "${RECV_USER_ID}" # Log the completion of the message test suite. openim::log::success "Message test suite completed successfully." } #################################### Man Module #################################### # TODO: openim::test::man() { openim::log::info "TODO: openim test man" } #################################### Build Module #################################### # Function: openim::test::smoke # Purpose: Performs a series of basic tests to validate the core functionality of the system. # These are preliminary checks to ensure that the most crucial operations like user registration # and account checking are operational. openim::test::smoke() { openim::register_user openim::test::check_account openim::test::register_and_check } # Function: openim::test::api # Purpose: This function is a collection of API test calls that cover various aspects of the # service such as authentication, user operations, friend management, group interactions, and # message handling. It is used to verify the integrity and functionality of API endpoints. openim::test::api() { openim::test::auth openim::test::user openim::test::friend openim::test::group openim::test::msg } # Function: openim::test::test # Purpose: This is the comprehensive test function that invokes all individual test functions. # It ensures that each component of the service is tested, utilizing utility functions for # environment checking and completing with a success message if all tests pass. openim::test::test() { openim::util::require-jq openim::test::smoke openim::test::man openim::test::api openim::log::info "$(echo -e '\033[32mcongratulations, all test passed!\033[0m')" } # Main execution logic: This conditional block checks if the script's arguments match any known # test function patterns and, if so, evaluates the function call. This allows for specific test # functions to be triggered based on the passed arguments. if [[ "$*" =~ openim::test:: ]]; then eval $* fi