diff --git a/CMake/Dependencies/libcorejson-CMakeLists.txt b/CMake/Dependencies/libcorejson-CMakeLists.txt new file mode 100644 index 0000000000..21fbe13a80 --- /dev/null +++ b/CMake/Dependencies/libcorejson-CMakeLists.txt @@ -0,0 +1,24 @@ +cmake_minimum_required(VERSION 3.6.3) + +project(libcorejson NONE) + +if (BUILD_STATIC_LIBS OR WIN32) + set(LIBCOREJSON_SHARED_LIBS OFF) +else() + set(LIBCOREJSON_SHARED_LIBS ON) +endif() + +include(ExternalProject) +ExternalProject_Add(libcorejson + GIT_REPOSITORY https://github.com/FreeRTOS/coreJSON.git + GIT_TAG dc1ab9130a1fb99b801a2a1fa8e9f42239f752be + PREFIX ${CMAKE_CURRENT_BINARY_DIR}/build + PATCH_COMMAND git apply --ignore-whitespace ${CMAKE_CURRENT_LIST_DIR}/libcorejson-add-cmakelists.patch + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX=${OPEN_SRC_INSTALL_PREFIX} + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DBUILD_SHARED_LIBS=${LIBCOREJSON_SHARED_LIBS} + "-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} -fPIC" + BUILD_ALWAYS TRUE + TEST_COMMAND "" +) diff --git a/CMake/Dependencies/libcorejson-add-cmakelists.patch b/CMake/Dependencies/libcorejson-add-cmakelists.patch new file mode 100644 index 0000000000..8819a95123 --- /dev/null +++ b/CMake/Dependencies/libcorejson-add-cmakelists.patch @@ -0,0 +1,30 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +new file mode 100644 +index 0000000..e48e611 +--- /dev/null ++++ b/CMakeLists.txt +@@ -0,0 +1,24 @@ ++cmake_minimum_required(VERSION 3.6.3) ++project(corejson C) ++ ++include(jsonFilePaths.cmake) ++ ++if(BUILD_SHARED_LIBS) ++ add_library(corejson SHARED ${JSON_SOURCES}) ++else() ++ add_library(corejson STATIC ${JSON_SOURCES}) ++endif() ++ ++target_include_directories(corejson PUBLIC ++ ${JSON_INCLUDE_PUBLIC_DIRS}) ++ ++# install header files ++install( ++ FILES ${JSON_INCLUDE_PUBLIC_DIRS}/core_json.h ++ DESTINATION include/corejson) ++ ++install( ++ TARGETS corejson ++ ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}" ++ LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}" ++ RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}") diff --git a/CMake/Dependencies/libkvssignaling-CMakeLists.txt b/CMake/Dependencies/libkvssignaling-CMakeLists.txt new file mode 100644 index 0000000000..873f497b5d --- /dev/null +++ b/CMake/Dependencies/libkvssignaling-CMakeLists.txt @@ -0,0 +1,23 @@ +cmake_minimum_required(VERSION 3.6.3) + +project(libkvssignaling NONE) + +include(ExternalProject) +if (BUILD_STATIC_LIBS OR WIN32) + set(LIBKVSSIGNALING_SHARED_LIBS OFF) +else() + set(LIBKVSSIGNALING_SHARED_LIBS ON) +endif() + +ExternalProject_Add(libkvssignaling + GIT_REPOSITORY https://github.com/awslabs/amazon-kinesis-video-streams-signaling.git + GIT_TAG fb54c01f6f03838ed19ad5c1857bb9406e89f4df + PREFIX ${CMAKE_CURRENT_BINARY_DIR}/build + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX=${OPEN_SRC_INSTALL_PREFIX} + -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} + -DBUILD_SHARED_LIBS=${LIBKVSSIGNALING_SHARED_LIBS} + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + BUILD_ALWAYS TRUE + TEST_COMMAND "" +) diff --git a/CMake/Utilities.cmake b/CMake/Utilities.cmake index 2b05cb5c5c..2fb358bef3 100644 --- a/CMake/Utilities.cmake +++ b/CMake/Utilities.cmake @@ -16,7 +16,9 @@ function(build_dependency lib_name) kvsCommonLws kvssdp kvsstun - kvsrtp) + kvsrtp + kvssignaling + corejson) list(FIND supported_libs ${lib_name} index) if(${index} EQUAL -1) message(WARNING "${lib_name} is not supported to build from source") diff --git a/CMakeLists.txt b/CMakeLists.txt index 38d2f984dd..0a32189d8e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -224,6 +224,20 @@ if(BUILD_DEPENDENCIES) build_dependency(kvsstun ${BUILD_ARGS}) build_dependency(kvsrtp ${BUILD_ARGS}) + set(BUILD_ARGS + -DBUILD_STATIC_LIBS=${BUILD_STATIC_LIBS} + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}) + + build_dependency(corejson ${BUILD_ARGS}) + + set(BUILD_ARGS + -DBUILD_STATIC_LIBS=${BUILD_STATIC_LIBS} + -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} + "-DCMAKE_C_FLAGS=${CMAKE_C_FLAGS} -I${OPEN_SRC_INSTALL_PREFIX}/include/corejson") + + build_dependency(kvssignaling ${BUILD_ARGS}) + set(BUILD_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}) @@ -412,6 +426,8 @@ target_link_libraries( kvssdp kvsstun kvsrtp + kvssignaling + corejson ${CMAKE_THREAD_LIBS_INIT} ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY} @@ -436,6 +452,8 @@ target_link_libraries( kvssdp kvsstun kvsrtp + kvssignaling + corejson PRIVATE kvspicUtils kvspicState ${CMAKE_THREAD_LIBS_INIT} diff --git a/src/include/com/amazonaws/kinesis/video/webrtcclient/Include.h b/src/include/com/amazonaws/kinesis/video/webrtcclient/Include.h index 64929f1107..567faa6176 100644 --- a/src/include/com/amazonaws/kinesis/video/webrtcclient/Include.h +++ b/src/include/com/amazonaws/kinesis/video/webrtcclient/Include.h @@ -384,6 +384,8 @@ extern "C" { #define STATUS_SIGNALING_JOIN_SESSION_CALL_FAILED STATUS_SIGNALING_BASE + 0x0000004a #define STATUS_SIGNALING_JOIN_SESSION_CONNECTED_FAILED STATUS_SIGNALING_BASE + 0x0000004b #define STATUS_SIGNALING_DESCRIBE_MEDIA_CALL_FAILED STATUS_SIGNALING_BASE + 0x0000004c +#define STATUS_SIGNALING_INVALID_OUTPUT_ROLE STATUS_SIGNALING_BASE + 0x0000004d +#define STATUS_SIGNALING_INVALID_OUTPUT_MESSAGE_TYPE STATUS_SIGNALING_BASE + 0x0000004e /*!@} */ diff --git a/src/source/Signaling/ChannelInfo.c b/src/source/Signaling/ChannelInfo.c index 3aba6d57cb..83ebf14ed7 100644 --- a/src/source/Signaling/ChannelInfo.c +++ b/src/source/Signaling/ChannelInfo.c @@ -317,39 +317,6 @@ PCHAR getStringFromChannelType(SIGNALING_CHANNEL_TYPE type) return typeStr; } -SIGNALING_CHANNEL_ROLE_TYPE getChannelRoleTypeFromString(PCHAR type, UINT32 length) -{ - // Assume the channel Deleting status first - SIGNALING_CHANNEL_ROLE_TYPE channelRoleType = SIGNALING_CHANNEL_ROLE_TYPE_UNKNOWN; - - if (0 == STRNCMP(SIGNALING_CHANNEL_ROLE_TYPE_MASTER_STR, type, length)) { - channelRoleType = SIGNALING_CHANNEL_ROLE_TYPE_MASTER; - } else if (0 == STRNCMP(SIGNALING_CHANNEL_ROLE_TYPE_VIEWER_STR, type, length)) { - channelRoleType = SIGNALING_CHANNEL_ROLE_TYPE_VIEWER; - } - - return channelRoleType; -} - -PCHAR getStringFromChannelRoleType(SIGNALING_CHANNEL_ROLE_TYPE type) -{ - PCHAR typeStr; - - switch (type) { - case SIGNALING_CHANNEL_ROLE_TYPE_MASTER: - typeStr = SIGNALING_CHANNEL_ROLE_TYPE_MASTER_STR; - break; - case SIGNALING_CHANNEL_ROLE_TYPE_VIEWER: - typeStr = SIGNALING_CHANNEL_ROLE_TYPE_VIEWER_STR; - break; - default: - typeStr = SIGNALING_CHANNEL_ROLE_TYPE_UNKNOWN_STR; - break; - } - - return typeStr; -} - // https://docs.aws.amazon.com/kinesisvideostreams-webrtc-dg/latest/devguide/kvswebrtc-how-iam.html#kinesis-using-iam-arn-format // Example: arn:aws:kinesisvideo:region:account-id:channel/channel-name/code STATUS validateKvsSignalingChannelArnAndExtractChannelName(PChannelInfo pChannelInfo, PUINT16 pStart, PUINT16 pNumChars) diff --git a/src/source/Signaling/ChannelInfo.h b/src/source/Signaling/ChannelInfo.h index 604b23386e..6a417035c4 100644 --- a/src/source/Signaling/ChannelInfo.h +++ b/src/source/Signaling/ChannelInfo.h @@ -23,11 +23,6 @@ extern "C" { #define SIGNALING_CHANNEL_TYPE_UNKNOWN_STR (PCHAR) "UNKOWN" #define SIGNALING_CHANNEL_TYPE_SINGLE_MASTER_STR (PCHAR) "SINGLE_MASTER" -// Signaling channel role type string -#define SIGNALING_CHANNEL_ROLE_TYPE_UNKNOWN_STR (PCHAR) "UNKOWN" -#define SIGNALING_CHANNEL_ROLE_TYPE_MASTER_STR (PCHAR) "MASTER" -#define SIGNALING_CHANNEL_ROLE_TYPE_VIEWER_STR (PCHAR) "VIEWER" - // Min and max for the message TTL value #define MIN_SIGNALING_MESSAGE_TTL_VALUE (5 * HUNDREDS_OF_NANOS_IN_A_SECOND) #define MAX_SIGNALING_MESSAGE_TTL_VALUE (120 * HUNDREDS_OF_NANOS_IN_A_SECOND) @@ -86,25 +81,6 @@ SIGNALING_CHANNEL_TYPE getChannelTypeFromString(PCHAR, UINT32); */ PCHAR getStringFromChannelType(SIGNALING_CHANNEL_TYPE); -/** - * Returns the signaling channel Role from a string - * - * @param - PCHAR - IN - String representation of the channel role - * @param - UINT32 - IN - String length - * - * @return - Signaling channel type - */ -SIGNALING_CHANNEL_ROLE_TYPE getChannelRoleTypeFromString(PCHAR, UINT32); - -/** - * Returns the signaling channel role type string - * - * @param - SIGNALING_CHANNEL_TYPE - IN - Signaling channel type - * - * @return - Signaling channel type string - */ -PCHAR getStringFromChannelRoleType(SIGNALING_CHANNEL_ROLE_TYPE); - /** * Determines whether or not the channel arn is valid * If VALID it extracts the channel name diff --git a/src/source/Signaling/LwsApiCalls.c b/src/source/Signaling/LwsApiCalls.c index 0132245a95..4096cabf56 100644 --- a/src/source/Signaling/LwsApiCalls.c +++ b/src/source/Signaling/LwsApiCalls.c @@ -3,6 +3,7 @@ */ #define LOG_CLASS "LwsApiCalls" #include "../Include_i.h" +#include "kvssignaling/signaling_api.h" #define WEBRTC_SCHEME_NAME "webrtc" static BOOL gInterruptedFlagBySignalHandler; @@ -12,6 +13,115 @@ VOID lwsSignalHandler(INT32 signal) gInterruptedFlagBySignalHandler = TRUE; } +static STATUS getChannelRoleType(SIGNALING_CHANNEL_ROLE_TYPE roleType, SignalingRole_t* pOutputRole) +{ + ENTERS(); + STATUS retStatus = STATUS_SUCCESS; + + CHK(pOutputRole != NULL, STATUS_SIGNALING_INVALID_OUTPUT_ROLE); + + switch (roleType) { + case SIGNALING_CHANNEL_ROLE_TYPE_MASTER: + *pOutputRole = SIGNALING_ROLE_MASTER; + break; + case SIGNALING_CHANNEL_ROLE_TYPE_VIEWER: + *pOutputRole = SIGNALING_ROLE_VIEWER; + break; + default: + *pOutputRole = SIGNALING_ROLE_NONE; + break; + } + +CleanUp: + + LEAVES(); + return retStatus; +} + +static STATUS getMessageType(SignalingTypeMessage_t messageType, SIGNALING_MESSAGE_TYPE* pMessageType) +{ + ENTERS(); + STATUS retStatus = STATUS_SUCCESS; + + CHK(pMessageType != NULL, STATUS_SIGNALING_INVALID_OUTPUT_MESSAGE_TYPE); + + if (messageType == SIGNALING_TYPE_MESSAGE_SDP_OFFER) { + *pMessageType = SIGNALING_MESSAGE_TYPE_OFFER; + } else if (messageType == SIGNALING_TYPE_MESSAGE_SDP_ANSWER) { + *pMessageType = SIGNALING_MESSAGE_TYPE_ANSWER; + } else if (messageType == SIGNALING_TYPE_MESSAGE_ICE_CANDIDATE) { + *pMessageType = SIGNALING_MESSAGE_TYPE_ICE_CANDIDATE; + } else if (messageType == SIGNALING_TYPE_MESSAGE_GO_AWAY) { + *pMessageType = SIGNALING_MESSAGE_TYPE_GO_AWAY; + } else if (messageType == SIGNALING_TYPE_MESSAGE_RECONNECT_ICE_SERVER) { + *pMessageType = SIGNALING_MESSAGE_TYPE_RECONNECT_ICE_SERVER; + } else if (messageType == SIGNALING_TYPE_MESSAGE_STATUS_RESPONSE) { + *pMessageType = SIGNALING_MESSAGE_TYPE_STATUS_RESPONSE; + } else { + *pMessageType = SIGNALING_MESSAGE_TYPE_UNKNOWN; + CHK_WARN(FALSE, retStatus, "Unrecognized message type received"); + } + +CleanUp: + + LEAVES(); + return retStatus; +} + +static STATUS updateIceServerList(PSignalingClient pSignalingClient, SignalingIceServer_t* pIceServers, SIZE_T numIceServers) +{ + ENTERS(); + STATUS retStatus = STATUS_SUCCESS; + UINT32 i, j; + + CHK(pIceServers != NULL, STATUS_SIGNALING_ICE_CONFIG_REFRESH_FAILED); + CHK(numIceServers <= MAX_ICE_CONFIG_COUNT, STATUS_SIGNALING_MAX_ICE_CONFIG_COUNT); + + MEMSET(&pSignalingClient->iceConfigs, 0x00, MAX_ICE_CONFIG_COUNT * SIZEOF(IceConfigInfo)); + pSignalingClient->iceConfigCount = 0; + + for (i = 0; i < numIceServers; i++) { + if (pIceServers[i].pUserName != NULL) { + CHK(pIceServers[i].userNameLength <= MAX_ICE_CONFIG_USER_NAME_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); + STRNCPY(pSignalingClient->iceConfigs[i].userName, pIceServers[i].pUserName, pIceServers[i].userNameLength); + pSignalingClient->iceConfigs[i].userName[pIceServers[i].userNameLength] = '\0'; + } + + if (pIceServers[i].pPassword != NULL) { + CHK(pIceServers[i].passwordLength <= MAX_ICE_CONFIG_CREDENTIAL_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); + STRNCPY(pSignalingClient->iceConfigs[i].password, pIceServers[i].pPassword, pIceServers[i].passwordLength); + pSignalingClient->iceConfigs[i].password[pIceServers[i].passwordLength] = '\0'; + } + + if (pIceServers[i].messageTtlSeconds > 0) { + // NOTE: Ttl value is in seconds + pSignalingClient->iceConfigs[i].ttl = (UINT64) pIceServers[i].messageTtlSeconds * HUNDREDS_OF_NANOS_IN_A_SECOND; + } + + if (pIceServers[i].pUris[0] != NULL) { + CHK(pIceServers[i].urisNum <= MAX_ICE_CONFIG_URI_COUNT, STATUS_SIGNALING_MAX_ICE_URI_COUNT); + + for (j = 0; j < pIceServers[i].urisNum; j++) { + CHK(pIceServers[i].urisLength[j] <= MAX_ICE_CONFIG_URI_LEN, STATUS_SIGNALING_MAX_ICE_URI_LEN); + + STRNCPY(pSignalingClient->iceConfigs[i].uris[j], pIceServers[i].pUris[j], pIceServers[i].urisLength[j]); + pSignalingClient->iceConfigs[i].uris[j][pIceServers[i].urisLength[j]] = '\0'; + pSignalingClient->iceConfigs[i].uriCount++; + } + } + } + + // Perform some validation on the ice configuration + pSignalingClient->iceConfigCount = numIceServers; + +CleanUp: + + CHK_LOG_ERR(retStatus); + + LEAVES(); + return retStatus; +} + INT32 lwsHttpCallbackRoutine(struct lws* wsi, enum lws_callback_reasons reason, PVOID user, PVOID pDataIn, size_t dataSize) { UNUSED_PARAM(user); @@ -753,21 +863,33 @@ STATUS describeChannelLws(PSignalingClient pSignalingClient, UINT64 time) CHAR paramsJson[MAX_JSON_PARAMETER_STRING_LEN]; PLwsCallInfo pLwsCallInfo = NULL; PCHAR pResponseStr; - jsmn_parser parser; - jsmntok_t tokens[MAX_JSON_TOKEN_COUNT]; - UINT32 i, strLen, resultLen; - UINT32 tokenCount; - UINT64 messageTtl; - BOOL jsonInChannelDescription = FALSE, jsonInMvConfiguration = FALSE; + UINT32 resultLen; + SignalingResult_t retSignal; + SignalingRequest_t signalRequest; + SignalingAwsRegion_t awsRegion; + SignalingChannelName_t channelName; + SignalingChannelInfo_t channelInfo; CHK(pSignalingClient != NULL, STATUS_NULL_ARG); + CHK(pSignalingClient->pChannelInfo != NULL, STATUS_NULL_ARG); + CHK(pSignalingClient->pChannelInfo->pChannelName != NULL, STATUS_NULL_ARG); + + // Prepare AWS region + awsRegion.pAwsRegion = pSignalingClient->pChannelInfo->pRegion; + awsRegion.awsRegionLength = STRNLEN(pSignalingClient->pChannelInfo->pRegion, MAX_REGION_NAME_LEN); + // Prepare URL buffer + signalRequest.pUrl = &url[0]; + signalRequest.urlLength = MAX_URI_CHAR_LEN + 1; + // Prepare body buffer + signalRequest.pBody = ¶msJson[0]; + signalRequest.bodyLength = MAX_JSON_PARAMETER_STRING_LEN; + // Prepare channel name + channelName.channelNameLength = STRNLEN(pSignalingClient->pChannelInfo->pChannelName, MAX_CHANNEL_NAME_LEN); + channelName.pChannelName = pSignalingClient->pChannelInfo->pChannelName; + + retSignal = Signaling_ConstructDescribeSignalingChannelRequest(&awsRegion, &channelName, &signalRequest); + CHK(retSignal == SIGNALING_RESULT_OK, retSignal); - // Create the API url - STRCPY(url, pSignalingClient->pChannelInfo->pControlPlaneUrl); - STRCAT(url, DESCRIBE_SIGNALING_CHANNEL_API_POSTFIX); - - // Prepare the json params for the call - SNPRINTF(paramsJson, ARRAY_SIZE(paramsJson), DESCRIBE_CHANNEL_PARAM_JSON_TEMPLATE, pSignalingClient->pChannelInfo->pChannelName); // Create the request info with the body CHK_STATUS(createRequestInfo(url, paramsJson, pSignalingClient->pChannelInfo->pRegion, pSignalingClient->pChannelInfo->pCertPath, NULL, NULL, SSL_CERTIFICATE_TYPE_NOT_SPECIFIED, pSignalingClient->pChannelInfo->pUserAgent, @@ -796,69 +918,42 @@ STATUS describeChannelLws(PSignalingClient pSignalingClient, UINT64 time) CHK((SERVICE_CALL_RESULT) ATOMIC_LOAD(&pSignalingClient->result) == SERVICE_CALL_RESULT_OK && resultLen != 0 && pResponseStr != NULL, STATUS_SIGNALING_LWS_CALL_FAILED); + retSignal = Signaling_ParseDescribeSignalingChannelResponse(pResponseStr, resultLen, &channelInfo); + CHK(retSignal == SIGNALING_RESULT_OK, retSignal); + // Parse the response - jsmn_init(&parser); - tokenCount = jsmn_parse(&parser, pResponseStr, resultLen, tokens, SIZEOF(tokens) / SIZEOF(jsmntok_t)); - CHK(tokenCount > 1, STATUS_INVALID_API_CALL_RETURN_JSON); - CHK(tokens[0].type == JSMN_OBJECT, STATUS_INVALID_API_CALL_RETURN_JSON); MEMSET(&pSignalingClient->channelDescription, 0x00, SIZEOF(SignalingChannelDescription)); - // Loop through the tokens and extract the stream description - for (i = 1; i < tokenCount; i++) { - if (!jsonInChannelDescription) { - if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "ChannelInfo")) { - pSignalingClient->channelDescription.version = SIGNALING_CHANNEL_DESCRIPTION_CURRENT_VERSION; - jsonInChannelDescription = TRUE; - i++; - } - } else { - if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "ChannelARN")) { - strLen = (UINT32) (tokens[i + 1].end - tokens[i + 1].start); - CHK(strLen <= MAX_ARN_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); - STRNCPY(pSignalingClient->channelDescription.channelArn, pResponseStr + tokens[i + 1].start, strLen); - pSignalingClient->channelDescription.channelArn[MAX_ARN_LEN] = '\0'; - i++; - } else if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "ChannelName")) { - strLen = (UINT32) (tokens[i + 1].end - tokens[i + 1].start); - CHK(strLen <= MAX_CHANNEL_NAME_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); - STRNCPY(pSignalingClient->channelDescription.channelName, pResponseStr + tokens[i + 1].start, strLen); - pSignalingClient->channelDescription.channelName[MAX_CHANNEL_NAME_LEN] = '\0'; - i++; - } else if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "Version")) { - strLen = (UINT32) (tokens[i + 1].end - tokens[i + 1].start); - CHK(strLen <= MAX_UPDATE_VERSION_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); - STRNCPY(pSignalingClient->channelDescription.updateVersion, pResponseStr + tokens[i + 1].start, strLen); - pSignalingClient->channelDescription.updateVersion[MAX_UPDATE_VERSION_LEN] = '\0'; - i++; - } else if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "ChannelStatus")) { - strLen = (UINT32) (tokens[i + 1].end - tokens[i + 1].start); - CHK(strLen <= MAX_DESCRIBE_CHANNEL_STATUS_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); - pSignalingClient->channelDescription.channelStatus = getChannelStatusFromString(pResponseStr + tokens[i + 1].start, strLen); - i++; - } else if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "ChannelType")) { - strLen = (UINT32) (tokens[i + 1].end - tokens[i + 1].start); - CHK(strLen <= MAX_DESCRIBE_CHANNEL_TYPE_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); - pSignalingClient->channelDescription.channelType = getChannelTypeFromString(pResponseStr + tokens[i + 1].start, strLen); - i++; - } else if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "CreationTime")) { - // TODO: In the future parse out the creation time but currently we don't need it - i++; - } else { - if (!jsonInMvConfiguration) { - if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "SingleMasterConfiguration")) { - jsonInMvConfiguration = TRUE; - i++; - } - } else { - if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "MessageTtlSeconds")) { - CHK_STATUS(STRTOUI64(pResponseStr + tokens[i + 1].start, pResponseStr + tokens[i + 1].end, 10, &messageTtl)); - // NOTE: Ttl value is in seconds - pSignalingClient->channelDescription.messageTtl = messageTtl * HUNDREDS_OF_NANOS_IN_A_SECOND; - i++; - } - } - } - } + pSignalingClient->channelDescription.channelType = + channelInfo.channelType == SIGNALING_TYPE_CHANNEL_SINGLE_MASTER ? SIGNALING_CHANNEL_TYPE_SINGLE_MASTER : SIGNALING_CHANNEL_TYPE_UNKNOWN; + + if (channelInfo.channelArn.pChannelArn != NULL) { + CHK(channelInfo.channelArn.channelArnLength <= MAX_ARN_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); + STRNCPY(pSignalingClient->channelDescription.channelArn, channelInfo.channelArn.pChannelArn, channelInfo.channelArn.channelArnLength); + pSignalingClient->channelDescription.channelArn[channelInfo.channelArn.channelArnLength] = '\0'; + } + + if (channelInfo.channelName.pChannelName != NULL) { + CHK(channelInfo.channelName.channelNameLength <= MAX_CHANNEL_NAME_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); + STRNCPY(pSignalingClient->channelDescription.channelName, channelInfo.channelName.pChannelName, channelInfo.channelName.channelNameLength); + pSignalingClient->channelDescription.channelName[channelInfo.channelName.channelNameLength] = '\0'; + } + + if (channelInfo.pChannelStatus != NULL) { + CHK(channelInfo.channelStatusLength <= MAX_DESCRIBE_CHANNEL_STATUS_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); + pSignalingClient->channelDescription.channelStatus = + getChannelStatusFromString((PCHAR) channelInfo.pChannelStatus, channelInfo.channelStatusLength); + } + + if (channelInfo.pVersion != NULL) { + CHK(channelInfo.versionLength <= MAX_UPDATE_VERSION_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); + STRNCPY(pSignalingClient->channelDescription.updateVersion, channelInfo.pVersion, channelInfo.versionLength); + pSignalingClient->channelDescription.updateVersion[channelInfo.versionLength] = '\0'; + } + + if (channelInfo.messageTtlSeconds != 0) { + // NOTE: Ttl value is in seconds + pSignalingClient->channelDescription.messageTtl = channelInfo.messageTtlSeconds * HUNDREDS_OF_NANOS_IN_A_SECOND; } // Perform some validation on the channel description @@ -885,44 +980,47 @@ STATUS createChannelLws(PSignalingClient pSignalingClient, UINT64 time) PRequestInfo pRequestInfo = NULL; CHAR url[MAX_URI_CHAR_LEN + 1]; CHAR paramsJson[MAX_JSON_PARAMETER_STRING_LEN]; - CHAR tagsJson[2 * MAX_JSON_PARAMETER_STRING_LEN]; - PCHAR pCurPtr, pTagsStart, pResponseStr; - UINT32 i, strLen, resultLen; - INT32 charsCopied; + PCHAR pResponseStr; + UINT32 i, resultLen; PLwsCallInfo pLwsCallInfo = NULL; - jsmn_parser parser; - jsmntok_t tokens[MAX_JSON_TOKEN_COUNT]; - UINT32 tokenCount; + SignalingResult_t retSignal; + SignalingRequest_t signalRequest; + SignalingAwsRegion_t awsRegion; + CreateSignalingChannelRequestInfo_t createSignalingChannelRequestInfo; + SignalingChannelArn_t channelArn; + SignalingTag_t tags[MAX_TAG_COUNT]; CHK(pSignalingClient != NULL, STATUS_NULL_ARG); - + CHK(pSignalingClient->pChannelInfo->tagCount <= MAX_TAG_COUNT, STATUS_INVALID_ARG); + + // Prepare AWS region + awsRegion.pAwsRegion = pSignalingClient->pChannelInfo->pRegion; + awsRegion.awsRegionLength = STRNLEN(pSignalingClient->pChannelInfo->pRegion, MAX_REGION_NAME_LEN); + // Prepare URL buffer + signalRequest.pUrl = &url[0]; + signalRequest.urlLength = MAX_URI_CHAR_LEN + 1; + // Prepare body buffer + signalRequest.pBody = ¶msJson[0]; + signalRequest.bodyLength = MAX_JSON_PARAMETER_STRING_LEN; // Create the API url - STRCPY(url, pSignalingClient->pChannelInfo->pControlPlaneUrl); - STRCAT(url, CREATE_SIGNALING_CHANNEL_API_POSTFIX); - - tagsJson[0] = '\0'; - if (pSignalingClient->pChannelInfo->tagCount != 0) { - // Prepare the tags elements. Format the list at the end - pCurPtr = tagsJson + MAX_JSON_PARAMETER_STRING_LEN; - pTagsStart = pCurPtr; - for (i = 0; i < pSignalingClient->pChannelInfo->tagCount; i++) { - charsCopied = SNPRINTF(pCurPtr, MAX_JSON_PARAMETER_STRING_LEN - (pCurPtr - pTagsStart), TAG_PARAM_JSON_OBJ_TEMPLATE, - pSignalingClient->pChannelInfo->pTags[i].name, pSignalingClient->pChannelInfo->pTags[i].value); - CHK(charsCopied > 0 && charsCopied < MAX_JSON_PARAMETER_STRING_LEN - (pCurPtr - pTagsStart), STATUS_INTERNAL_ERROR); - pCurPtr += charsCopied; - } - - // Remove the tailing comma - *(pCurPtr - 1) = '\0'; - - // Prepare the json params for the call - SNPRINTF(tagsJson, MAX_JSON_PARAMETER_STRING_LEN, TAGS_PARAM_JSON_TEMPLATE, tagsJson + MAX_JSON_PARAMETER_STRING_LEN); - } - - // Prepare the json params for the call - SNPRINTF(paramsJson, ARRAY_SIZE(paramsJson), CREATE_CHANNEL_PARAM_JSON_TEMPLATE, pSignalingClient->pChannelInfo->pChannelName, - getStringFromChannelType(pSignalingClient->pChannelInfo->channelType), - pSignalingClient->pChannelInfo->messageTtl / HUNDREDS_OF_NANOS_IN_A_SECOND, tagsJson); + MEMSET(&createSignalingChannelRequestInfo, 0, SIZEOF(CreateSignalingChannelRequestInfo_t)); + createSignalingChannelRequestInfo.channelName.channelNameLength = STRNLEN(pSignalingClient->pChannelInfo->pChannelName, MAX_CHANNEL_NAME_LEN); + createSignalingChannelRequestInfo.channelName.pChannelName = pSignalingClient->pChannelInfo->pChannelName; + createSignalingChannelRequestInfo.messageTtlSeconds = pSignalingClient->pChannelInfo->messageTtl / HUNDREDS_OF_NANOS_IN_A_SECOND; + createSignalingChannelRequestInfo.channelType = pSignalingClient->pChannelInfo->channelType == SIGNALING_TYPE_CHANNEL_SINGLE_MASTER + ? SIGNALING_TYPE_CHANNEL_SINGLE_MASTER + : SIGNALING_TYPE_CHANNEL_UNKNOWN; + createSignalingChannelRequestInfo.numTags = pSignalingClient->pChannelInfo->tagCount; + /* Format tags into structure buffer. */ + createSignalingChannelRequestInfo.pTags = tags; + for (i = 0; i < pSignalingClient->pChannelInfo->tagCount; i++) { + tags[i].nameLength = STRNLEN(pSignalingClient->pChannelInfo->pTags[i].name, MAX_TAG_NAME_LEN); + tags[i].pName = pSignalingClient->pChannelInfo->pTags[i].name; + tags[i].valueLength = STRNLEN(pSignalingClient->pChannelInfo->pTags[i].value, MAX_TAG_VALUE_LEN); + tags[i].pValue = pSignalingClient->pChannelInfo->pTags[i].value; + } + retSignal = Signaling_ConstructCreateSignalingChannelRequest(&awsRegion, &createSignalingChannelRequestInfo, &signalRequest); + CHK(retSignal == SIGNALING_RESULT_OK, retSignal); // Create the request info with the body CHK_STATUS(createRequestInfo(url, paramsJson, pSignalingClient->pChannelInfo->pRegion, pSignalingClient->pChannelInfo->pCertPath, NULL, NULL, @@ -952,20 +1050,14 @@ STATUS createChannelLws(PSignalingClient pSignalingClient, UINT64 time) STATUS_SIGNALING_LWS_CALL_FAILED); // Parse out the ARN - jsmn_init(&parser); - tokenCount = jsmn_parse(&parser, pResponseStr, resultLen, tokens, SIZEOF(tokens) / SIZEOF(jsmntok_t)); - CHK(tokenCount > 1, STATUS_INVALID_API_CALL_RETURN_JSON); - CHK(tokens[0].type == JSMN_OBJECT, STATUS_INVALID_API_CALL_RETURN_JSON); - - // Loop through the tokens and extract the stream description - for (i = 1; i < tokenCount; i++) { - if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "ChannelARN")) { - strLen = (UINT32) (tokens[i + 1].end - tokens[i + 1].start); - CHK(strLen <= MAX_ARN_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); - STRNCPY(pSignalingClient->channelDescription.channelArn, pResponseStr + tokens[i + 1].start, strLen); - pSignalingClient->channelDescription.channelArn[MAX_ARN_LEN] = '\0'; - i++; - } + retSignal = Signaling_ParseCreateSignalingChannelResponse(pResponseStr, resultLen, &channelArn); + CHK(retSignal == SIGNALING_RESULT_OK, retSignal); + + if (channelArn.pChannelArn != NULL) { + CHK(channelArn.channelArnLength <= MAX_ARN_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); + + STRNCPY(pSignalingClient->channelDescription.channelArn, channelArn.pChannelArn, channelArn.channelArnLength); + pSignalingClient->channelDescription.channelArn[channelArn.channelArnLength] = '\0'; } // Perform some validation on the channel description @@ -992,28 +1084,37 @@ STATUS getChannelEndpointLws(PSignalingClient pSignalingClient, UINT64 time) PRequestInfo pRequestInfo = NULL; CHAR url[MAX_URI_CHAR_LEN + 1]; CHAR paramsJson[MAX_JSON_PARAMETER_STRING_LEN]; - UINT32 i, resultLen, strLen, protocolLen = 0, endpointLen = 0; - PCHAR pResponseStr, pProtocol = NULL, pEndpoint = NULL; + UINT32 resultLen; + PCHAR pResponseStr; PLwsCallInfo pLwsCallInfo = NULL; - jsmn_parser parser; - jsmntok_t tokens[MAX_JSON_TOKEN_COUNT]; - UINT32 tokenCount; - BOOL jsonInResourceEndpointList = FALSE, protocol = FALSE, endpoint = FALSE, inEndpointArray = FALSE; + SignalingResult_t retSignal; + SignalingRequest_t signalRequest; + SignalingAwsRegion_t awsRegion; + GetSignalingChannelEndpointRequestInfo_t getSignalingChannelEndpointRequestInfo; + SignalingChannelEndpoints_t channelEndpoints; CHK(pSignalingClient != NULL, STATUS_NULL_ARG); + CHK(pSignalingClient->channelDescription.channelArn[0] != '\0', STATUS_INVALID_OPERATION); + // Prepare AWS region + awsRegion.pAwsRegion = pSignalingClient->pChannelInfo->pRegion; + awsRegion.awsRegionLength = STRNLEN(pSignalingClient->pChannelInfo->pRegion, MAX_REGION_NAME_LEN); + // Prepare URL buffer + signalRequest.pUrl = &url[0]; + signalRequest.urlLength = MAX_URI_CHAR_LEN + 1; + // Prepare body buffer + signalRequest.pBody = ¶msJson[0]; + signalRequest.bodyLength = MAX_JSON_PARAMETER_STRING_LEN; // Create the API url - STRCPY(url, pSignalingClient->pChannelInfo->pControlPlaneUrl); - STRCAT(url, GET_SIGNALING_CHANNEL_ENDPOINT_API_POSTFIX); - - // Prepare the json params for the call - if (pSignalingClient->mediaStorageConfig.storageStatus == FALSE) { - SNPRINTF(paramsJson, ARRAY_SIZE(paramsJson), GET_CHANNEL_ENDPOINT_PARAM_JSON_TEMPLATE, pSignalingClient->channelDescription.channelArn, - SIGNALING_CHANNEL_PROTOCOL, getStringFromChannelRoleType(pSignalingClient->pChannelInfo->channelRoleType)); - } else { - SNPRINTF(paramsJson, ARRAY_SIZE(paramsJson), GET_CHANNEL_ENDPOINT_PARAM_JSON_TEMPLATE, pSignalingClient->channelDescription.channelArn, - SIGNALING_CHANNEL_PROTOCOL_W_MEDIA_STORAGE, getStringFromChannelRoleType(pSignalingClient->pChannelInfo->channelRoleType)); + getSignalingChannelEndpointRequestInfo.channelArn.pChannelArn = pSignalingClient->channelDescription.channelArn; + getSignalingChannelEndpointRequestInfo.channelArn.channelArnLength = STRNLEN(pSignalingClient->channelDescription.channelArn, MAX_ARN_LEN); + getSignalingChannelEndpointRequestInfo.protocols = SIGNALING_PROTOCOL_HTTPS | SIGNALING_PROTOCOL_WEBSOCKET_SECURE; + if (pSignalingClient->mediaStorageConfig.storageStatus != FALSE) { + getSignalingChannelEndpointRequestInfo.protocols |= SIGNALING_PROTOCOL_WEBRTC; } + CHK_STATUS(getChannelRoleType(pSignalingClient->pChannelInfo->channelRoleType, &getSignalingChannelEndpointRequestInfo.role)); + retSignal = Signaling_ConstructGetSignalingChannelEndpointRequest(&awsRegion, &getSignalingChannelEndpointRequestInfo, &signalRequest); + CHK(retSignal == SIGNALING_RESULT_OK, retSignal); // Create the request info with the body CHK_STATUS(createRequestInfo(url, paramsJson, pSignalingClient->pChannelInfo->pRegion, pSignalingClient->pChannelInfo->pCertPath, NULL, NULL, @@ -1043,77 +1144,30 @@ STATUS getChannelEndpointLws(PSignalingClient pSignalingClient, UINT64 time) STATUS_SIGNALING_LWS_CALL_FAILED); // Parse and extract the endpoints - jsmn_init(&parser); - tokenCount = jsmn_parse(&parser, pResponseStr, resultLen, tokens, SIZEOF(tokens) / SIZEOF(jsmntok_t)); - CHK(tokenCount > 1, STATUS_INVALID_API_CALL_RETURN_JSON); - CHK(tokens[0].type == JSMN_OBJECT, STATUS_INVALID_API_CALL_RETURN_JSON); + retSignal = Signaling_ParseGetSignalingChannelEndpointResponse(pResponseStr, resultLen, &channelEndpoints); + CHK(retSignal == SIGNALING_RESULT_OK, retSignal); pSignalingClient->channelEndpointWss[0] = '\0'; pSignalingClient->channelEndpointHttps[0] = '\0'; pSignalingClient->channelEndpointWebrtc[0] = '\0'; - // Loop through the tokens and extract the stream description - for (i = 1; i < tokenCount; i++) { - if (!jsonInResourceEndpointList) { - if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "ResourceEndpointList")) { - jsonInResourceEndpointList = TRUE; - i++; - } - } else { - if (!inEndpointArray && tokens[i].type == JSMN_ARRAY) { - inEndpointArray = TRUE; - } else { - if (tokens[i].type == JSMN_OBJECT) { - // Process if both are set - if (protocol && endpoint) { - if (0 == STRNCMPI(pProtocol, WSS_SCHEME_NAME, protocolLen)) { - STRNCPY(pSignalingClient->channelEndpointWss, pEndpoint, MIN(endpointLen, MAX_SIGNALING_ENDPOINT_URI_LEN)); - pSignalingClient->channelEndpointWss[MAX_SIGNALING_ENDPOINT_URI_LEN] = '\0'; - } else if (0 == STRNCMPI(pProtocol, HTTPS_SCHEME_NAME, protocolLen)) { - STRNCPY(pSignalingClient->channelEndpointHttps, pEndpoint, MIN(endpointLen, MAX_SIGNALING_ENDPOINT_URI_LEN)); - pSignalingClient->channelEndpointHttps[MAX_SIGNALING_ENDPOINT_URI_LEN] = '\0'; - } else if (0 == STRNCMPI(pProtocol, WEBRTC_SCHEME_NAME, protocolLen)) { - STRNCPY(pSignalingClient->channelEndpointWebrtc, pEndpoint, MIN(endpointLen, MAX_SIGNALING_ENDPOINT_URI_LEN)); - pSignalingClient->channelEndpointWebrtc[MAX_SIGNALING_ENDPOINT_URI_LEN] = '\0'; - } - } + // Parse the response + if (channelEndpoints.wssEndpoint.pEndpoint != NULL) { + CHK(channelEndpoints.wssEndpoint.endpointLength <= MAX_SIGNALING_ENDPOINT_URI_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); + STRNCPY(pSignalingClient->channelEndpointWss, channelEndpoints.wssEndpoint.pEndpoint, channelEndpoints.wssEndpoint.endpointLength); + pSignalingClient->channelEndpointWss[channelEndpoints.wssEndpoint.endpointLength] = '\0'; + } - protocol = FALSE; - endpoint = FALSE; - protocolLen = 0; - endpointLen = 0; - pProtocol = NULL; - pEndpoint = NULL; - } else if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "Protocol")) { - strLen = (UINT32) (tokens[i + 1].end - tokens[i + 1].start); - pProtocol = pResponseStr + tokens[i + 1].start; - protocolLen = strLen; - protocol = TRUE; - i++; - } else if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "ResourceEndpoint")) { - strLen = (UINT32) (tokens[i + 1].end - tokens[i + 1].start); - CHK(strLen <= MAX_SIGNALING_ENDPOINT_URI_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); - pEndpoint = pResponseStr + tokens[i + 1].start; - endpointLen = strLen; - endpoint = TRUE; - i++; - } - } - } + if (channelEndpoints.httpsEndpoint.pEndpoint != NULL) { + CHK(channelEndpoints.httpsEndpoint.endpointLength <= MAX_SIGNALING_ENDPOINT_URI_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); + STRNCPY(pSignalingClient->channelEndpointHttps, channelEndpoints.httpsEndpoint.pEndpoint, channelEndpoints.httpsEndpoint.endpointLength); + pSignalingClient->channelEndpointHttps[channelEndpoints.httpsEndpoint.endpointLength] = '\0'; } - // Check if we have unprocessed protocol - if (protocol && endpoint) { - if (0 == STRNCMPI(pProtocol, WSS_SCHEME_NAME, protocolLen)) { - STRNCPY(pSignalingClient->channelEndpointWss, pEndpoint, MIN(endpointLen, MAX_SIGNALING_ENDPOINT_URI_LEN)); - pSignalingClient->channelEndpointWss[MAX_SIGNALING_ENDPOINT_URI_LEN] = '\0'; - } else if (0 == STRNCMPI(pProtocol, HTTPS_SCHEME_NAME, protocolLen)) { - STRNCPY(pSignalingClient->channelEndpointHttps, pEndpoint, MIN(endpointLen, MAX_SIGNALING_ENDPOINT_URI_LEN)); - pSignalingClient->channelEndpointHttps[MAX_SIGNALING_ENDPOINT_URI_LEN] = '\0'; - } else if (0 == STRNCMPI(pProtocol, WEBRTC_SCHEME_NAME, protocolLen)) { - STRNCPY(pSignalingClient->channelEndpointWebrtc, pEndpoint, MIN(endpointLen, MAX_SIGNALING_ENDPOINT_URI_LEN)); - pSignalingClient->channelEndpointWebrtc[MAX_SIGNALING_ENDPOINT_URI_LEN] = '\0'; - } + if (channelEndpoints.webrtcEndpoint.pEndpoint != NULL) { + CHK(channelEndpoints.webrtcEndpoint.endpointLength <= MAX_SIGNALING_ENDPOINT_URI_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); + STRNCPY(pSignalingClient->channelEndpointWebrtc, channelEndpoints.webrtcEndpoint.pEndpoint, channelEndpoints.webrtcEndpoint.endpointLength); + pSignalingClient->channelEndpointWebrtc[channelEndpoints.webrtcEndpoint.endpointLength] = '\0'; } // Perform some validation on the channel description @@ -1143,27 +1197,36 @@ STATUS getIceConfigLws(PSignalingClient pSignalingClient, UINT64 time) CHAR paramsJson[MAX_JSON_PARAMETER_STRING_LEN]; PLwsCallInfo pLwsCallInfo = NULL; PCHAR pResponseStr; - jsmn_parser parser; - jsmntok_t tokens[MAX_JSON_TOKEN_COUNT]; - jsmntok_t* pToken; - UINT32 i, strLen, resultLen, configCount = 0, tokenCount; - INT32 j; - UINT64 ttl; - BOOL jsonInIceServerList = FALSE; + UINT32 resultLen; + SignalingResult_t retSignal; + SignalingRequest_t signalRequest; + SignalingChannelEndpoint_t httpsEndpoint; + GetIceServerConfigRequestInfo_t getIceServerConfigRequestInfo; + SignalingIceServer_t iceServers[MAX_ICE_CONFIG_COUNT]; + UINT64 numIceServers = MAX_ICE_CONFIG_COUNT; CHK(pSignalingClient != NULL, STATUS_NULL_ARG); + CHK(pSignalingClient->channelDescription.channelArn[0] != '\0', STATUS_INVALID_OPERATION); CHK(pSignalingClient->channelEndpointHttps[0] != '\0', STATUS_INTERNAL_ERROR); // Update the diagnostics info on the number of ICE refresh calls ATOMIC_INCREMENT(&pSignalingClient->diagnostics.iceRefreshCount); - // Create the API url - STRCPY(url, pSignalingClient->channelEndpointHttps); - STRCAT(url, GET_ICE_CONFIG_API_POSTFIX); - - // Prepare the json params for the call - SNPRINTF(paramsJson, ARRAY_SIZE(paramsJson), GET_ICE_CONFIG_PARAM_JSON_TEMPLATE, pSignalingClient->channelDescription.channelArn, - pSignalingClient->clientInfo.signalingClientInfo.clientId); + // Prepare HTTPS endpoint. + httpsEndpoint.pEndpoint = pSignalingClient->channelEndpointHttps; + httpsEndpoint.endpointLength = STRNLEN(pSignalingClient->channelEndpointHttps, MAX_SIGNALING_ENDPOINT_URI_LEN); + // Prepare URL buffer + signalRequest.pUrl = &url[0]; + signalRequest.urlLength = MAX_URI_CHAR_LEN + 1; + // Prepare body buffer + signalRequest.pBody = ¶msJson[0]; + signalRequest.bodyLength = MAX_JSON_PARAMETER_STRING_LEN; + getIceServerConfigRequestInfo.channelArn.pChannelArn = pSignalingClient->channelDescription.channelArn; + getIceServerConfigRequestInfo.channelArn.channelArnLength = STRNLEN(pSignalingClient->channelDescription.channelArn, MAX_ARN_LEN); + getIceServerConfigRequestInfo.pClientId = pSignalingClient->clientInfo.signalingClientInfo.clientId; + getIceServerConfigRequestInfo.clientIdLength = STRNLEN(pSignalingClient->clientInfo.signalingClientInfo.clientId, MAX_SIGNALING_CLIENT_ID_LEN); + retSignal = Signaling_ConstructGetIceServerConfigRequest(&httpsEndpoint, &getIceServerConfigRequestInfo, &signalRequest); + CHK(retSignal == SIGNALING_RESULT_OK, retSignal); // Create the request info with the body CHK_STATUS(createRequestInfo(url, paramsJson, pSignalingClient->pChannelInfo->pRegion, pSignalingClient->pChannelInfo->pCertPath, NULL, NULL, @@ -1193,64 +1256,11 @@ STATUS getIceConfigLws(PSignalingClient pSignalingClient, UINT64 time) STATUS_SIGNALING_LWS_CALL_FAILED); // Parse the response - jsmn_init(&parser); - tokenCount = jsmn_parse(&parser, pResponseStr, resultLen, tokens, SIZEOF(tokens) / SIZEOF(jsmntok_t)); - CHK(tokenCount > 1, STATUS_INVALID_API_CALL_RETURN_JSON); - CHK(tokens[0].type == JSMN_OBJECT, STATUS_INVALID_API_CALL_RETURN_JSON); - - MEMSET(&pSignalingClient->iceConfigs, 0x00, MAX_ICE_CONFIG_COUNT * SIZEOF(IceConfigInfo)); - pSignalingClient->iceConfigCount = 0; - - // Loop through the tokens and extract the ice configuration - for (i = 0; i < tokenCount; i++) { - if (!jsonInIceServerList) { - if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "IceServerList")) { - jsonInIceServerList = TRUE; - - CHK(tokens[i + 1].type == JSMN_ARRAY, STATUS_INVALID_API_CALL_RETURN_JSON); - CHK(tokens[i + 1].size <= MAX_ICE_CONFIG_COUNT, STATUS_SIGNALING_MAX_ICE_CONFIG_COUNT); - } - } else { - pToken = &tokens[i]; - if (pToken->type == JSMN_OBJECT) { - configCount++; - } else if (compareJsonString(pResponseStr, pToken, JSMN_STRING, (PCHAR) "Username")) { - strLen = (UINT32) (pToken[1].end - pToken[1].start); - CHK(strLen <= MAX_ICE_CONFIG_USER_NAME_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); - STRNCPY(pSignalingClient->iceConfigs[configCount - 1].userName, pResponseStr + pToken[1].start, strLen); - pSignalingClient->iceConfigs[configCount - 1].userName[MAX_ICE_CONFIG_USER_NAME_LEN] = '\0'; - i++; - } else if (compareJsonString(pResponseStr, pToken, JSMN_STRING, (PCHAR) "Password")) { - strLen = (UINT32) (pToken[1].end - pToken[1].start); - CHK(strLen <= MAX_ICE_CONFIG_CREDENTIAL_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); - STRNCPY(pSignalingClient->iceConfigs[configCount - 1].password, pResponseStr + pToken[1].start, strLen); - pSignalingClient->iceConfigs[configCount - 1].userName[MAX_ICE_CONFIG_CREDENTIAL_LEN] = '\0'; - i++; - } else if (compareJsonString(pResponseStr, pToken, JSMN_STRING, (PCHAR) "Ttl")) { - CHK_STATUS(STRTOUI64(pResponseStr + pToken[1].start, pResponseStr + pToken[1].end, 10, &ttl)); - - // NOTE: Ttl value is in seconds - pSignalingClient->iceConfigs[configCount - 1].ttl = ttl * HUNDREDS_OF_NANOS_IN_A_SECOND; - i++; - } else if (compareJsonString(pResponseStr, pToken, JSMN_STRING, (PCHAR) "Uris")) { - // Expect an array of elements - CHK(pToken[1].type == JSMN_ARRAY, STATUS_INVALID_API_CALL_RETURN_JSON); - CHK(pToken[1].size <= MAX_ICE_CONFIG_URI_COUNT, STATUS_SIGNALING_MAX_ICE_URI_COUNT); - for (j = 0; j < pToken[1].size; j++) { - strLen = (UINT32) (pToken[j + 2].end - pToken[j + 2].start); - CHK(strLen <= MAX_ICE_CONFIG_URI_LEN, STATUS_SIGNALING_MAX_ICE_URI_LEN); - STRNCPY(pSignalingClient->iceConfigs[configCount - 1].uris[j], pResponseStr + pToken[j + 2].start, strLen); - pSignalingClient->iceConfigs[configCount - 1].uris[j][MAX_ICE_CONFIG_URI_LEN] = '\0'; - pSignalingClient->iceConfigs[configCount - 1].uriCount++; - } - - i += pToken[1].size + 1; - } - } - } + retSignal = Signaling_ParseGetIceServerConfigResponse(pResponseStr, resultLen, iceServers, (size_t*) &numIceServers); + CHK(retSignal == SIGNALING_RESULT_OK, retSignal); - // Perform some validation on the ice configuration - pSignalingClient->iceConfigCount = configCount; + // Parse and validate the response + CHK_STATUS(updateIceServerList(pSignalingClient, iceServers, numIceServers)); CHK_STATUS(validateIceConfiguration(pSignalingClient)); CleanUp: @@ -1276,6 +1286,10 @@ STATUS deleteChannelLws(PSignalingClient pSignalingClient, UINT64 time) CHAR paramsJson[MAX_JSON_PARAMETER_STRING_LEN]; PLwsCallInfo pLwsCallInfo = NULL; SIZE_T result; + SignalingResult_t retSignal; + SignalingRequest_t signalRequest; + SignalingAwsRegion_t awsRegion; + DeleteSignalingChannelRequestInfo_t deleteSignalingChannelRequestInfo; CHK(pSignalingClient != NULL, STATUS_NULL_ARG); CHK(pSignalingClient->channelDescription.channelArn[0] != '\0', STATUS_INVALID_OPERATION); @@ -1286,13 +1300,22 @@ STATUS deleteChannelLws(PSignalingClient pSignalingClient, UINT64 time) terminateConnectionWithStatus(pSignalingClient, SERVICE_CALL_RESULT_OK); } + // Prepare AWS region + awsRegion.pAwsRegion = pSignalingClient->pChannelInfo->pRegion; + awsRegion.awsRegionLength = STRNLEN(pSignalingClient->pChannelInfo->pRegion, MAX_REGION_NAME_LEN); + // Prepare URL buffer + signalRequest.pUrl = &url[0]; + signalRequest.urlLength = MAX_URI_CHAR_LEN + 1; + // Prepare body buffer + signalRequest.pBody = ¶msJson[0]; + signalRequest.bodyLength = MAX_JSON_PARAMETER_STRING_LEN; // Create the API url - STRCPY(url, pSignalingClient->pChannelInfo->pControlPlaneUrl); - STRCAT(url, DELETE_SIGNALING_CHANNEL_API_POSTFIX); - - // Prepare the json params for the call - SNPRINTF(paramsJson, ARRAY_SIZE(paramsJson), DELETE_CHANNEL_PARAM_JSON_TEMPLATE, pSignalingClient->channelDescription.channelArn, - pSignalingClient->channelDescription.updateVersion); + deleteSignalingChannelRequestInfo.channelArn.pChannelArn = pSignalingClient->channelDescription.channelArn; + deleteSignalingChannelRequestInfo.channelArn.channelArnLength = STRNLEN(pSignalingClient->channelDescription.channelArn, MAX_ARN_LEN); + deleteSignalingChannelRequestInfo.pVersion = pSignalingClient->channelDescription.updateVersion; + deleteSignalingChannelRequestInfo.versionLength = STRNLEN(pSignalingClient->channelDescription.updateVersion, MAX_UPDATE_VERSION_LEN); + retSignal = Signaling_ConstructDeleteSignalingChannelRequest(&awsRegion, &deleteSignalingChannelRequestInfo, &signalRequest); + CHK(retSignal == SIGNALING_RESULT_OK, retSignal); // Create the request info with the body CHK_STATUS(createRequestInfo(url, paramsJson, pSignalingClient->pChannelInfo->pRegion, pSignalingClient->pChannelInfo->pCertPath, NULL, NULL, @@ -1401,19 +1424,35 @@ STATUS connectSignalingChannelLws(PSignalingClient pSignalingClient, UINT64 time BOOL locked = FALSE; SERVICE_CALL_RESULT callResult = SERVICE_CALL_RESULT_NOT_SET; UINT64 timeout; + SignalingResult_t retSignal; + SignalingRequest_t signalRequest; + SignalingChannelEndpoint_t wssEndpoint; + ConnectWssEndpointRequestInfo_t connectWssEndpointRequestInfo; CHK(pSignalingClient != NULL, STATUS_NULL_ARG); CHK(pSignalingClient->channelEndpointWss[0] != '\0', STATUS_INTERNAL_ERROR); + CHK(pSignalingClient->channelDescription.channelArn[0] != '\0', STATUS_INVALID_OPERATION); - // Prepare the json params for the call + // Prepare URL buffer + signalRequest.pUrl = &url[0]; + signalRequest.urlLength = MAX_URI_CHAR_LEN + 1; + // Prepare body buffer + signalRequest.pBody = NULL; + signalRequest.bodyLength = 0; + // Prepare WSS endpoint + wssEndpoint.pEndpoint = pSignalingClient->channelEndpointWss; + wssEndpoint.endpointLength = STRNLEN(pSignalingClient->channelEndpointWss, MAX_SIGNALING_ENDPOINT_URI_LEN); + MEMSET(&connectWssEndpointRequestInfo, 0, SIZEOF(ConnectWssEndpointRequestInfo_t)); + connectWssEndpointRequestInfo.channelArn.pChannelArn = pSignalingClient->channelDescription.channelArn; + connectWssEndpointRequestInfo.channelArn.channelArnLength = STRNLEN(pSignalingClient->channelDescription.channelArn, MAX_ARN_LEN); + CHK_STATUS(getChannelRoleType(pSignalingClient->pChannelInfo->channelRoleType, &connectWssEndpointRequestInfo.role)); if (pSignalingClient->pChannelInfo->channelRoleType == SIGNALING_CHANNEL_ROLE_TYPE_VIEWER) { - SNPRINTF(url, ARRAY_SIZE(url), SIGNALING_ENDPOINT_VIEWER_URL_WSS_TEMPLATE, pSignalingClient->channelEndpointWss, - SIGNALING_CHANNEL_ARN_PARAM_NAME, pSignalingClient->channelDescription.channelArn, SIGNALING_CLIENT_ID_PARAM_NAME, - pSignalingClient->clientInfo.signalingClientInfo.clientId); - } else { - SNPRINTF(url, ARRAY_SIZE(url), SIGNALING_ENDPOINT_MASTER_URL_WSS_TEMPLATE, pSignalingClient->channelEndpointWss, - SIGNALING_CHANNEL_ARN_PARAM_NAME, pSignalingClient->channelDescription.channelArn); + connectWssEndpointRequestInfo.pClientId = pSignalingClient->clientInfo.signalingClientInfo.clientId; + connectWssEndpointRequestInfo.clientIdLength = + STRNLEN(pSignalingClient->clientInfo.signalingClientInfo.clientId, MAX_SIGNALING_CLIENT_ID_LEN); } + retSignal = Signaling_ConstructConnectWssEndpointRequest(&wssEndpoint, &connectWssEndpointRequestInfo, &signalRequest); + CHK(retSignal == SIGNALING_RESULT_OK, retSignal); // Create the request info with the body CHK_STATUS(createRequestInfo(url, NULL, pSignalingClient->pChannelInfo->pRegion, pSignalingClient->pChannelInfo->pCertPath, NULL, NULL, @@ -1493,25 +1532,38 @@ STATUS joinStorageSessionLws(PSignalingClient pSignalingClient, UINT64 time) PLwsCallInfo pLwsCallInfo = NULL; PCHAR pResponseStr; UINT32 resultLen; + SignalingResult_t retSignal; + SignalingRequest_t signalRequest; + SignalingChannelEndpoint_t webrtcEndpoint; + JoinStorageSessionRequestInfo_t joinStorageSessionRequestInfo; UNUSED_PARAM(pResponseStr); UNUSED_PARAM(resultLen); CHK(pSignalingClient != NULL, STATUS_NULL_ARG); CHK(pSignalingClient->channelEndpointWebrtc[0] != '\0', STATUS_INTERNAL_ERROR); + CHK(pSignalingClient->channelDescription.channelArn[0] != '\0', STATUS_INVALID_OPERATION); + // Prepare URL buffer + signalRequest.pUrl = &url[0]; + signalRequest.urlLength = MAX_URI_CHAR_LEN + 1; + // Prepare body buffer + signalRequest.pBody = ¶msJson[0]; + signalRequest.bodyLength = MAX_JSON_PARAMETER_STRING_LEN; + // Prepare WebRTC endpoint + webrtcEndpoint.pEndpoint = pSignalingClient->channelEndpointWebrtc; + webrtcEndpoint.endpointLength = STRNLEN(pSignalingClient->channelEndpointWebrtc, MAX_SIGNALING_ENDPOINT_URI_LEN); // Create the API url - STRCPY(url, pSignalingClient->channelEndpointWebrtc); - STRCAT(url, JOIN_STORAGE_SESSION_API_POSTFIX); - - // Prepare the json params for the call + joinStorageSessionRequestInfo.channelArn.pChannelArn = pSignalingClient->channelDescription.channelArn; + joinStorageSessionRequestInfo.channelArn.channelArnLength = STRNLEN(pSignalingClient->channelDescription.channelArn, MAX_ARN_LEN); + CHK_STATUS(getChannelRoleType(pSignalingClient->pChannelInfo->channelRoleType, &joinStorageSessionRequestInfo.role)); if (pSignalingClient->pChannelInfo->channelRoleType == SIGNALING_CHANNEL_ROLE_TYPE_VIEWER) { - SNPRINTF(paramsJson, ARRAY_SIZE(paramsJson), SIGNALING_JOIN_STORAGE_SESSION_VIEWER_PARAM_JSON_TEMPLATE, - pSignalingClient->channelDescription.channelArn, pSignalingClient->clientInfo.signalingClientInfo.clientId); - } else { - SNPRINTF(paramsJson, ARRAY_SIZE(paramsJson), SIGNALING_JOIN_STORAGE_SESSION_MASTER_PARAM_JSON_TEMPLATE, - pSignalingClient->channelDescription.channelArn); + joinStorageSessionRequestInfo.pClientId = pSignalingClient->clientInfo.signalingClientInfo.clientId; + joinStorageSessionRequestInfo.clientIdLength = + STRNLEN(pSignalingClient->clientInfo.signalingClientInfo.clientId, MAX_SIGNALING_CLIENT_ID_LEN); } + retSignal = Signaling_ConstructJoinStorageSessionRequest(&webrtcEndpoint, &joinStorageSessionRequestInfo, &signalRequest); + CHK(retSignal == SIGNALING_RESULT_OK, retSignal); // Create the request info with the body CHK_STATUS(createRequestInfo(url, paramsJson, pSignalingClient->pChannelInfo->pRegion, pSignalingClient->pChannelInfo->pCertPath, NULL, NULL, @@ -1570,21 +1622,31 @@ STATUS describeMediaStorageConfLws(PSignalingClient pSignalingClient, UINT64 tim CHAR paramsJson[MAX_JSON_PARAMETER_STRING_LEN]; PLwsCallInfo pLwsCallInfo = NULL; PCHAR pResponseStr; - jsmn_parser parser; - jsmntok_t tokens[MAX_JSON_TOKEN_COUNT]; - UINT32 i, strLen, resultLen; - UINT32 tokenCount; - BOOL jsonInMediaStorageConfig = FALSE; + UINT32 resultLen; + SignalingResult_t retSignal; + SignalingRequest_t signalRequest; + SignalingAwsRegion_t awsRegion; + SignalingChannelArn_t channelArn; + SignalingMediaStorageConfig_t mediaStorageConfig; CHK(pSignalingClient != NULL, STATUS_NULL_ARG); + CHK(pSignalingClient->channelDescription.channelArn[0] != '\0', STATUS_INVALID_OPERATION); + // Prepare AWS region + awsRegion.pAwsRegion = pSignalingClient->pChannelInfo->pRegion; + awsRegion.awsRegionLength = STRNLEN(pSignalingClient->pChannelInfo->pRegion, MAX_REGION_NAME_LEN); + // Prepare URL buffer + signalRequest.pUrl = &url[0]; + signalRequest.urlLength = MAX_URI_CHAR_LEN + 1; + // Prepare body buffer + signalRequest.pBody = ¶msJson[0]; + signalRequest.bodyLength = MAX_JSON_PARAMETER_STRING_LEN; // Create the API url - STRCPY(url, pSignalingClient->pChannelInfo->pControlPlaneUrl); - STRCAT(url, DESCRIBE_MEDIA_STORAGE_CONF_API_POSTFIX); + channelArn.pChannelArn = pSignalingClient->channelDescription.channelArn; + channelArn.channelArnLength = STRNLEN(pSignalingClient->channelDescription.channelArn, MAX_ARN_LEN); + retSignal = Signaling_ConstructDescribeMediaStorageConfigRequest(&awsRegion, &channelArn, &signalRequest); + CHK(retSignal == SIGNALING_RESULT_OK, retSignal); - // Prepare the json params for the call - CHK(pSignalingClient->channelDescription.channelArn[0] != '\0', STATUS_NULL_ARG); - SNPRINTF(paramsJson, ARRAY_SIZE(paramsJson), DESCRIBE_MEDIA_STORAGE_CONF_PARAM_JSON_TEMPLATE, pSignalingClient->channelDescription.channelArn); // Create the request info with the body CHK_STATUS(createRequestInfo(url, paramsJson, pSignalingClient->pChannelInfo->pRegion, pSignalingClient->pChannelInfo->pCertPath, NULL, NULL, SSL_CERTIFICATE_TYPE_NOT_SPECIFIED, pSignalingClient->pChannelInfo->pUserAgent, @@ -1614,41 +1676,29 @@ STATUS describeMediaStorageConfLws(PSignalingClient pSignalingClient, UINT64 tim STATUS_SIGNALING_LWS_CALL_FAILED); // Parse the response - jsmn_init(&parser); - tokenCount = jsmn_parse(&parser, pResponseStr, resultLen, tokens, SIZEOF(tokens) / SIZEOF(jsmntok_t)); - CHK(tokenCount > 1, STATUS_INVALID_API_CALL_RETURN_JSON); - CHK(tokens[0].type == JSMN_OBJECT, STATUS_INVALID_API_CALL_RETURN_JSON); - - // Loop through the tokens and extract the stream description - for (i = 1; i < tokenCount; i++) { - if (!jsonInMediaStorageConfig) { - if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "MediaStorageConfiguration")) { - jsonInMediaStorageConfig = TRUE; - i++; - } + retSignal = Signaling_ParseDescribeMediaStorageConfigResponse(pResponseStr, resultLen, &mediaStorageConfig); + CHK(retSignal == SIGNALING_RESULT_OK, retSignal); + + // Parse the response + MEMSET(&pSignalingClient->mediaStorageConfig, 0x00, SIZEOF(MediaStorageConfig)); + + if (mediaStorageConfig.pStatus != NULL) { + CHK(mediaStorageConfig.statusLength <= MAX_ARN_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); + + if (STRNCMP("ENABLED", mediaStorageConfig.pStatus, mediaStorageConfig.statusLength) == 0) { + pSignalingClient->mediaStorageConfig.storageStatus = TRUE; } else { - if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "Status")) { - strLen = (UINT32) (tokens[i + 1].end - tokens[i + 1].start); - CHK(strLen <= MAX_ARN_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); - if (STRNCMP("ENABLED", pResponseStr + tokens[i + 1].start, strLen) == 0) { - pSignalingClient->mediaStorageConfig.storageStatus = TRUE; - } else { - pSignalingClient->mediaStorageConfig.storageStatus = FALSE; - } - i++; - } else if (compareJsonString(pResponseStr, &tokens[i], JSMN_STRING, (PCHAR) "StreamARN")) { - // StorageStream may be null. - if (tokens[i + 1].type != JSMN_PRIMITIVE) { - strLen = (UINT32) (tokens[i + 1].end - tokens[i + 1].start); - CHK(strLen <= MAX_ARN_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); - STRNCPY(pSignalingClient->mediaStorageConfig.storageStreamArn, pResponseStr + tokens[i + 1].start, strLen); - pSignalingClient->mediaStorageConfig.storageStreamArn[MAX_ARN_LEN] = '\0'; - } - i++; - } + pSignalingClient->mediaStorageConfig.storageStatus = FALSE; } } + if (mediaStorageConfig.pStreamArn != NULL) { + CHK(mediaStorageConfig.streamArnLength <= MAX_ARN_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); + + STRNCPY(pSignalingClient->mediaStorageConfig.storageStreamArn, mediaStorageConfig.pStreamArn, mediaStorageConfig.streamArnLength); + pSignalingClient->mediaStorageConfig.storageStreamArn[MAX_ARN_LEN] = '\0'; + } + // Perform some validation on the channel description CHK(pSignalingClient->channelDescription.channelStatus != SIGNALING_CHANNEL_STATUS_DELETING, STATUS_SIGNALING_CHANNEL_BEING_DELETED); @@ -1775,33 +1825,33 @@ STATUS sendLwsMessage(PSignalingClient pSignalingClient, SIGNALING_MESSAGE_TYPE ENTERS(); STATUS retStatus = STATUS_SUCCESS; CHAR encodedMessage[MAX_SESSION_DESCRIPTION_INIT_SDP_LEN + 1]; - CHAR encodedIceConfig[MAX_ENCODED_ICE_SERVER_INFOS_STR_LEN + 1]; - CHAR encodedUris[MAX_ICE_SERVER_URI_STR_LEN + 1]; - UINT32 size, writtenSize, correlationLen, iceCount, uriCount, urisLen, iceConfigLen; + UINT32 size, writtenSize, correlationLen; BOOL awaitForResponse; - PCHAR pMessageType; - UINT64 curTime; + SignalingResult_t retSignal; + WssSendMessage_t wssSendMessage; + SIZE_T bufferSize; // Ensure we are in a connected state CHK_STATUS(acceptSignalingStateMachineState(pSignalingClient, SIGNALING_STATE_CONNECTED | SIGNALING_STATE_JOIN_SESSION_CONNECTED)); CHK(pSignalingClient != NULL && pSignalingClient->pOngoingCallInfo != NULL, STATUS_NULL_ARG); + MEMSET(&wssSendMessage, 0, SIZEOF(WssSendMessage_t)); + // Prepare the buffer to send switch (messageType) { case SIGNALING_MESSAGE_TYPE_OFFER: - pMessageType = (PCHAR) SIGNALING_SDP_TYPE_OFFER; + wssSendMessage.messageType = SIGNALING_TYPE_MESSAGE_SDP_OFFER; break; case SIGNALING_MESSAGE_TYPE_ANSWER: - pMessageType = (PCHAR) SIGNALING_SDP_TYPE_ANSWER; + wssSendMessage.messageType = SIGNALING_TYPE_MESSAGE_SDP_ANSWER; break; case SIGNALING_MESSAGE_TYPE_ICE_CANDIDATE: - pMessageType = (PCHAR) SIGNALING_ICE_CANDIDATE; + wssSendMessage.messageType = SIGNALING_TYPE_MESSAGE_ICE_CANDIDATE; break; default: CHK(FALSE, STATUS_INVALID_ARG); } - DLOGD("%s", pMessageType); DLOGD("%s", pMessage); // Calculate the lengths if not specified if (messageLen == 0) { @@ -1824,61 +1874,27 @@ STATUS sendLwsMessage(PSignalingClient pSignalingClient, SIGNALING_MESSAGE_TYPE size = SIZEOF(pSignalingClient->pOngoingCallInfo->sendBuffer) - LWS_PRE; CHK(writtenSize <= size, STATUS_SIGNALING_MAX_MESSAGE_LEN_AFTER_ENCODING); - // Start off with an empty string - encodedIceConfig[0] = '\0'; - - // In case of an Offer, package the ICE candidates only if we have a set of non-expired ICE configs - if (messageType == SIGNALING_MESSAGE_TYPE_OFFER && pSignalingClient->iceConfigCount != 0 && - (curTime = SIGNALING_GET_CURRENT_TIME(pSignalingClient)) <= pSignalingClient->iceConfigExpiration && - STATUS_SUCCEEDED(validateIceConfiguration(pSignalingClient))) { - // Start the ice infos by copying the preamble, then the main body and then the ending - STRCPY(encodedIceConfig, SIGNALING_ICE_SERVER_LIST_TEMPLATE_START); - iceConfigLen = ARRAY_SIZE(SIGNALING_ICE_SERVER_LIST_TEMPLATE_START) - 1; // remove the null terminator - - for (iceCount = 0; iceCount < pSignalingClient->iceConfigCount; iceCount++) { - encodedUris[0] = '\0'; - for (uriCount = 0; uriCount < pSignalingClient->iceConfigs[iceCount].uriCount; uriCount++) { - STRCAT(encodedUris, "\""); - STRCAT(encodedUris, pSignalingClient->iceConfigs[iceCount].uris[uriCount]); - STRCAT(encodedUris, "\","); - } - - // remove the last comma - urisLen = STRLEN(encodedUris); - encodedUris[--urisLen] = '\0'; - - // Construct the encoded ice config - // NOTE: We need to subtract the passed time to get the TTL of the expiration correct - writtenSize = (UINT32) SNPRINTF(encodedIceConfig + iceConfigLen, MAX_ICE_SERVER_INFO_STR_LEN, SIGNALING_ICE_SERVER_TEMPLATE, - pSignalingClient->iceConfigs[iceCount].password, - (pSignalingClient->iceConfigs[iceCount].ttl - (curTime - pSignalingClient->iceConfigTime)) / - HUNDREDS_OF_NANOS_IN_A_SECOND, - encodedUris, pSignalingClient->iceConfigs[iceCount].userName); - CHK(writtenSize <= MAX_ICE_SERVER_INFO_STR_LEN, STATUS_SIGNALING_MAX_MESSAGE_LEN_AFTER_ENCODING); - iceConfigLen += writtenSize; - } - - // Get rid of the last comma - iceConfigLen--; - - // Closing the JSON array - STRCPY(encodedIceConfig + iceConfigLen, SIGNALING_ICE_SERVER_LIST_TEMPLATE_END); - } + /* Prepare send message. */ + wssSendMessage.base64EncodedMessageLength = writtenSize; + wssSendMessage.pBase64EncodedMessage = encodedMessage; + wssSendMessage.correlationIdLength = correlationLen; + wssSendMessage.pCorrelationId = pCorrelationId; + wssSendMessage.recipientClientIdLength = STRNLEN(peerClientId, MAX_SIGNALING_CLIENT_ID_LEN); + wssSendMessage.pRecipientClientId = peerClientId; // Prepare json message - if (correlationLen == 0) { - writtenSize = (UINT32) SNPRINTF((PCHAR) (pSignalingClient->pOngoingCallInfo->sendBuffer + LWS_PRE), size, SIGNALING_SEND_MESSAGE_TEMPLATE, - pMessageType, MAX_SIGNALING_CLIENT_ID_LEN, peerClientId, encodedMessage, encodedIceConfig); - } else { - writtenSize = (UINT32) SNPRINTF((PCHAR) (pSignalingClient->pOngoingCallInfo->sendBuffer + LWS_PRE), size, - SIGNALING_SEND_MESSAGE_TEMPLATE_WITH_CORRELATION_ID, pMessageType, MAX_SIGNALING_CLIENT_ID_LEN, peerClientId, - encodedMessage, correlationLen, pCorrelationId, encodedIceConfig); - } + bufferSize = SIZEOF(pSignalingClient->pOngoingCallInfo->sendBuffer) - LWS_PRE - 1; /* -1 for null terminator. */ + retSignal = + Signaling_ConstructWssMessage(&wssSendMessage, (PCHAR) (pSignalingClient->pOngoingCallInfo->sendBuffer + LWS_PRE), (size_t*) &bufferSize); + CHK(retSignal == SIGNALING_RESULT_OK, retSignal); // Validate against max - CHK(writtenSize <= LWS_MESSAGE_BUFFER_SIZE, STATUS_SIGNALING_MAX_MESSAGE_LEN_AFTER_ENCODING); + CHK(bufferSize + LWS_PRE <= LWS_MESSAGE_BUFFER_SIZE, STATUS_SIGNALING_MAX_MESSAGE_LEN_AFTER_ENCODING); - writtenSize *= SIZEOF(CHAR); + // Set null terminator to make sure sendBuffer is a valid string. + *(pSignalingClient->pOngoingCallInfo->sendBuffer + LWS_PRE + bufferSize) = '\0'; + + writtenSize = bufferSize * SIZEOF(CHAR); CHK(writtenSize <= size, STATUS_INVALID_ARG); // Store the data pointer @@ -1888,7 +1904,7 @@ STATUS sendLwsMessage(PSignalingClient pSignalingClient, SIGNALING_MESSAGE_TYPE // Send the data to the web socket awaitForResponse = (correlationLen != 0) && BLOCK_ON_CORRELATION_ID; - DLOGD("Sending data over web socket: Message type: %s, RecepientId: %s", pMessageType, peerClientId); + DLOGD("Sending data over web socket: Message type: %d, RecepientId: %s", wssSendMessage.messageType, peerClientId); CHK_STATUS(writeLwsData(pSignalingClient, awaitForResponse)); @@ -1980,22 +1996,19 @@ STATUS receiveLwsMessage(PSignalingClient pSignalingClient, PCHAR pMessage, UINT { ENTERS(); STATUS retStatus = STATUS_SUCCESS; - jsmn_parser parser; - jsmntok_t tokens[MAX_JSON_TOKEN_COUNT]; - jsmntok_t* pToken; - UINT32 i, strLen, outLen = MAX_SIGNALING_MESSAGE_LEN; - UINT32 tokenCount; - INT32 j; + UINT32 outLen = MAX_SIGNALING_MESSAGE_LEN; PSignalingMessageWrapper pSignalingMessageWrapper = NULL; TID receivedTid = INVALID_TID_VALUE; - BOOL parsedMessageType = FALSE, parsedStatusResponse = FALSE, jsonInIceServerList = FALSE; + BOOL parsedMessageType = FALSE; PSignalingMessage pOngoingMessage; - UINT64 ttl; + SignalingResult_t retSignal; + WssRecvMessage_t wssRecvMessage; + UINT64 messageLength = messageLen; CHK(pSignalingClient != NULL, STATUS_NULL_ARG); // If we have a signalingMessage and if there is a correlation id specified then the response should be non-empty - if (pMessage == NULL || messageLen == 0) { + if (pMessage == NULL || messageLength == 0) { if (BLOCK_ON_CORRELATION_ID) { // Get empty correlation id message from the ongoing if exists CHK_STATUS(signalingGetOngoingMessage(pSignalingClient, EMPTY_STRING, EMPTY_STRING, &pOngoingMessage)); @@ -2008,126 +2021,69 @@ STATUS receiveLwsMessage(PSignalingClient pSignalingClient, PCHAR pMessage, UINT } // Check if anything needs to be done - CHK_WARN(pMessage != NULL && messageLen != 0, retStatus, "Signaling received an empty message"); + CHK_WARN(pMessage != NULL && messageLength != 0, retStatus, "Signaling received an empty message"); } + // DLOGV("receive LWS Message:\n%s", pMessage); + MEMSET(&wssRecvMessage, 0, SIZEOF(WssRecvMessage_t)); // Parse the response - jsmn_init(&parser); - tokenCount = jsmn_parse(&parser, pMessage, messageLen, tokens, SIZEOF(tokens) / SIZEOF(jsmntok_t)); - CHK(tokenCount > 1, STATUS_INVALID_API_CALL_RETURN_JSON); - CHK(tokens[0].type == JSMN_OBJECT, STATUS_INVALID_API_CALL_RETURN_JSON); + retSignal = Signaling_ParseWssRecvMessage(pMessage, (SIZE_T) messageLength, &wssRecvMessage); + CHK(retSignal == SIGNALING_RESULT_OK, retSignal); CHK(NULL != (pSignalingMessageWrapper = (PSignalingMessageWrapper) MEMCALLOC(1, SIZEOF(SignalingMessageWrapper))), STATUS_NOT_ENOUGH_MEMORY); pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.version = SIGNALING_MESSAGE_CURRENT_VERSION; - // Loop through the tokens and extract the stream description - for (i = 1; i < tokenCount; i++) { - if (compareJsonString(pMessage, &tokens[i], JSMN_STRING, (PCHAR) "senderClientId")) { - strLen = (UINT32) (tokens[i + 1].end - tokens[i + 1].start); - CHK(strLen <= MAX_SIGNALING_CLIENT_ID_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); - STRNCPY(pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.peerClientId, pMessage + tokens[i + 1].start, strLen); - pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.peerClientId[MAX_SIGNALING_CLIENT_ID_LEN] = '\0'; - i++; - } else if (compareJsonString(pMessage, &tokens[i], JSMN_STRING, (PCHAR) "messageType")) { - strLen = (UINT32) (tokens[i + 1].end - tokens[i + 1].start); - CHK(strLen <= MAX_SIGNALING_MESSAGE_TYPE_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); - CHK_STATUS(getMessageTypeFromString(pMessage + tokens[i + 1].start, strLen, - &pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.messageType)); - - parsedMessageType = TRUE; - i++; - } else if (compareJsonString(pMessage, &tokens[i], JSMN_STRING, (PCHAR) "messagePayload")) { - strLen = (UINT32) (tokens[i + 1].end - tokens[i + 1].start); - CHK(strLen <= MAX_SIGNALING_MESSAGE_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); - - // Base64 decode the message - CHK_STATUS(base64Decode(pMessage + tokens[i + 1].start, strLen, - (PBYTE) (pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.payload), &outLen)); - pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.payload[MAX_SIGNALING_MESSAGE_LEN] = '\0'; - pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.payloadLen = outLen; - i++; - } else if (!parsedStatusResponse && compareJsonString(pMessage, &tokens[i], JSMN_STRING, (PCHAR) "statusResponse")) { - parsedStatusResponse = TRUE; - i++; - } else if (parsedStatusResponse && compareJsonString(pMessage, &tokens[i], JSMN_STRING, (PCHAR) "correlationId")) { - strLen = (UINT32) (tokens[i + 1].end - tokens[i + 1].start); - CHK(strLen <= MAX_CORRELATION_ID_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); - STRNCPY(pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.correlationId, pMessage + tokens[i + 1].start, strLen); - pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.correlationId[MAX_CORRELATION_ID_LEN] = '\0'; - - i++; - } else if (parsedStatusResponse && compareJsonString(pMessage, &tokens[i], JSMN_STRING, (PCHAR) "errorType")) { - strLen = (UINT32) (tokens[i + 1].end - tokens[i + 1].start); - CHK(strLen <= MAX_ERROR_TYPE_STRING_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); - STRNCPY(pSignalingMessageWrapper->receivedSignalingMessage.errorType, pMessage + tokens[i + 1].start, strLen); - pSignalingMessageWrapper->receivedSignalingMessage.errorType[MAX_ERROR_TYPE_STRING_LEN] = '\0'; - - i++; - } else if (parsedStatusResponse && compareJsonString(pMessage, &tokens[i], JSMN_STRING, (PCHAR) "statusCode")) { - strLen = (UINT32) (tokens[i + 1].end - tokens[i + 1].start); - CHK(strLen <= MAX_STATUS_CODE_STRING_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); - - // Parse the status code - CHK_STATUS(STRTOUI32(pMessage + tokens[i + 1].start, pMessage + tokens[i + 1].end, 10, - &pSignalingMessageWrapper->receivedSignalingMessage.statusCode)); - - i++; - } else if (parsedStatusResponse && compareJsonString(pMessage, &tokens[i], JSMN_STRING, (PCHAR) "description")) { - strLen = (UINT32) (tokens[i + 1].end - tokens[i + 1].start); - CHK(strLen <= MAX_MESSAGE_DESCRIPTION_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); - STRNCPY(pSignalingMessageWrapper->receivedSignalingMessage.description, pMessage + tokens[i + 1].start, strLen); - pSignalingMessageWrapper->receivedSignalingMessage.description[MAX_MESSAGE_DESCRIPTION_LEN] = '\0'; - - i++; - } else if (!jsonInIceServerList && - pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.messageType == SIGNALING_MESSAGE_TYPE_OFFER && - compareJsonString(pMessage, &tokens[i], JSMN_STRING, (PCHAR) "IceServerList")) { - jsonInIceServerList = TRUE; - - CHK(tokens[i + 1].type == JSMN_ARRAY, STATUS_INVALID_API_CALL_RETURN_JSON); - CHK(tokens[i + 1].size <= MAX_ICE_CONFIG_COUNT, STATUS_SIGNALING_MAX_ICE_CONFIG_COUNT); - - // Zero the ice configs - MEMSET(&pSignalingClient->iceConfigs, 0x00, MAX_ICE_CONFIG_COUNT * SIZEOF(IceConfigInfo)); - pSignalingClient->iceConfigCount = 0; - } else if (jsonInIceServerList) { - pToken = &tokens[i]; - if (pToken->type == JSMN_OBJECT) { - pSignalingClient->iceConfigCount++; - } else if (compareJsonString(pMessage, pToken, JSMN_STRING, (PCHAR) "Username")) { - strLen = (UINT32) (pToken[1].end - pToken[1].start); - CHK(strLen <= MAX_ICE_CONFIG_USER_NAME_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); - STRNCPY(pSignalingClient->iceConfigs[pSignalingClient->iceConfigCount - 1].userName, pMessage + pToken[1].start, strLen); - pSignalingClient->iceConfigs[pSignalingClient->iceConfigCount - 1].userName[MAX_ICE_CONFIG_USER_NAME_LEN] = '\0'; - i++; - } else if (compareJsonString(pMessage, pToken, JSMN_STRING, (PCHAR) "Password")) { - strLen = (UINT32) (pToken[1].end - pToken[1].start); - CHK(strLen <= MAX_ICE_CONFIG_CREDENTIAL_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); - STRNCPY(pSignalingClient->iceConfigs[pSignalingClient->iceConfigCount - 1].password, pMessage + pToken[1].start, strLen); - pSignalingClient->iceConfigs[pSignalingClient->iceConfigCount - 1].userName[MAX_ICE_CONFIG_CREDENTIAL_LEN] = '\0'; - i++; - } else if (compareJsonString(pMessage, pToken, JSMN_STRING, (PCHAR) "Ttl")) { - CHK_STATUS(STRTOUI64(pMessage + pToken[1].start, pMessage + pToken[1].end, 10, &ttl)); - - // NOTE: Ttl value is in seconds - pSignalingClient->iceConfigs[pSignalingClient->iceConfigCount - 1].ttl = ttl * HUNDREDS_OF_NANOS_IN_A_SECOND; - i++; - } else if (compareJsonString(pMessage, pToken, JSMN_STRING, (PCHAR) "Uris")) { - // Expect an array of elements - CHK(pToken[1].type == JSMN_ARRAY, STATUS_INVALID_API_CALL_RETURN_JSON); - CHK(pToken[1].size <= MAX_ICE_CONFIG_URI_COUNT, STATUS_SIGNALING_MAX_ICE_URI_COUNT); - for (j = 0; j < pToken[1].size; j++) { - strLen = (UINT32) (pToken[j + 2].end - pToken[j + 2].start); - CHK(strLen <= MAX_ICE_CONFIG_URI_LEN, STATUS_SIGNALING_MAX_ICE_URI_LEN); - STRNCPY(pSignalingClient->iceConfigs[pSignalingClient->iceConfigCount - 1].uris[j], pMessage + pToken[j + 2].start, strLen); - pSignalingClient->iceConfigs[pSignalingClient->iceConfigCount - 1].uris[j][MAX_ICE_CONFIG_URI_LEN] = '\0'; - pSignalingClient->iceConfigs[pSignalingClient->iceConfigCount - 1].uriCount++; - } + if (wssRecvMessage.pSenderClientId != NULL) { + CHK(wssRecvMessage.senderClientIdLength <= MAX_SIGNALING_CLIENT_ID_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); + STRNCPY(pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.peerClientId, wssRecvMessage.pSenderClientId, + wssRecvMessage.senderClientIdLength); + pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.peerClientId[wssRecvMessage.senderClientIdLength] = '\0'; + } - i += pToken[1].size + 1; - } - } + if (wssRecvMessage.messageType != SIGNALING_TYPE_MESSAGE_UNKNOWN) { + CHK_STATUS(getMessageType(wssRecvMessage.messageType, &pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.messageType)); + + parsedMessageType = TRUE; + } + + if (wssRecvMessage.pBase64EncodedPayload != NULL) { + // Base64 decode the message + CHK(wssRecvMessage.base64EncodedPayloadLength <= MAX_SIGNALING_MESSAGE_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); + CHK_STATUS(base64Decode((PCHAR) wssRecvMessage.pBase64EncodedPayload, wssRecvMessage.base64EncodedPayloadLength, + (PBYTE) (pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.payload), &outLen)); + pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.payload[wssRecvMessage.base64EncodedPayloadLength] = '\0'; + pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.payloadLen = outLen; + } + + if (wssRecvMessage.statusResponse.pCorrelationId != NULL) { + CHK(wssRecvMessage.statusResponse.correlationIdLength <= MAX_CORRELATION_ID_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); + STRNCPY(pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.correlationId, wssRecvMessage.statusResponse.pCorrelationId, + wssRecvMessage.statusResponse.correlationIdLength); + pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.correlationId[wssRecvMessage.statusResponse.correlationIdLength] = '\0'; + } + + if (wssRecvMessage.statusResponse.pErrorType != NULL) { + CHK(wssRecvMessage.statusResponse.errorTypeLength <= MAX_ERROR_TYPE_STRING_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); + STRNCPY(pSignalingMessageWrapper->receivedSignalingMessage.errorType, wssRecvMessage.statusResponse.pErrorType, + wssRecvMessage.statusResponse.errorTypeLength); + pSignalingMessageWrapper->receivedSignalingMessage.errorType[wssRecvMessage.statusResponse.errorTypeLength] = '\0'; + } + + if (wssRecvMessage.statusResponse.pStatusCode != NULL) { + CHK(wssRecvMessage.statusResponse.statusCodeLength <= MAX_STATUS_CODE_STRING_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); + + // Parse the status code + CHK_STATUS(STRTOUI32((PCHAR) wssRecvMessage.statusResponse.pStatusCode, + ((PCHAR) wssRecvMessage.statusResponse.pStatusCode) + wssRecvMessage.statusResponse.statusCodeLength, 10, + &pSignalingMessageWrapper->receivedSignalingMessage.statusCode)); + } + + if (wssRecvMessage.statusResponse.pDescription != NULL) { + CHK(wssRecvMessage.statusResponse.descriptionLength <= MAX_MESSAGE_DESCRIPTION_LEN, STATUS_INVALID_API_CALL_RETURN_JSON); + STRNCPY(pSignalingMessageWrapper->receivedSignalingMessage.description, wssRecvMessage.statusResponse.pDescription, + wssRecvMessage.statusResponse.descriptionLength); + pSignalingMessageWrapper->receivedSignalingMessage.description[wssRecvMessage.statusResponse.descriptionLength] = '\0'; } // Message type is a mandatory field. @@ -2208,11 +2164,6 @@ STATUS receiveLwsMessage(PSignalingClient pSignalingClient, PCHAR pMessage, UINT DLOGD("Client received message of type: %s", getMessageTypeInString(pSignalingMessageWrapper->receivedSignalingMessage.signalingMessage.messageType)); - // Validate and process the ice config - if (jsonInIceServerList && STATUS_FAILED(validateIceConfiguration(pSignalingClient))) { - DLOGW("Failed to validate the ICE server configuration received with an Offer"); - } - #ifdef ENABLE_KVS_THREADPOOL // This would fail if threadpool was not created CHK_STATUS(threadpoolContextPush(receiveLwsMessageWrapper, pSignalingMessageWrapper)); @@ -2278,43 +2229,6 @@ STATUS terminateConnectionWithStatus(PSignalingClient pSignalingClient, SERVICE_ return retStatus; } -STATUS getMessageTypeFromString(PCHAR typeStr, UINT32 typeLen, SIGNALING_MESSAGE_TYPE* pMessageType) -{ - ENTERS(); - STATUS retStatus = STATUS_SUCCESS; - UINT32 len; - - CHK(typeStr != NULL && pMessageType != NULL, STATUS_NULL_ARG); - - if (typeLen == 0) { - len = (UINT32) STRLEN(typeStr); - } else { - len = typeLen; - } - - if (0 == STRNCMP(typeStr, SIGNALING_SDP_TYPE_OFFER, len)) { - *pMessageType = SIGNALING_MESSAGE_TYPE_OFFER; - } else if (0 == STRNCMP(typeStr, SIGNALING_SDP_TYPE_ANSWER, len)) { - *pMessageType = SIGNALING_MESSAGE_TYPE_ANSWER; - } else if (0 == STRNCMP(typeStr, SIGNALING_ICE_CANDIDATE, len)) { - *pMessageType = SIGNALING_MESSAGE_TYPE_ICE_CANDIDATE; - } else if (0 == STRNCMP(typeStr, SIGNALING_GO_AWAY, len)) { - *pMessageType = SIGNALING_MESSAGE_TYPE_GO_AWAY; - } else if (0 == STRNCMP(typeStr, SIGNALING_RECONNECT_ICE_SERVER, len)) { - *pMessageType = SIGNALING_MESSAGE_TYPE_RECONNECT_ICE_SERVER; - } else if (0 == STRNCMP(typeStr, SIGNALING_STATUS_RESPONSE, len)) { - *pMessageType = SIGNALING_MESSAGE_TYPE_STATUS_RESPONSE; - } else { - *pMessageType = SIGNALING_MESSAGE_TYPE_UNKNOWN; - CHK_WARN(FALSE, retStatus, "Unrecognized message type received"); - } - -CleanUp: - - LEAVES(); - return retStatus; -} - PCHAR getMessageTypeInString(SIGNALING_MESSAGE_TYPE messageType) { switch (messageType) { diff --git a/src/source/Signaling/LwsApiCalls.h b/src/source/Signaling/LwsApiCalls.h index 45c4ed9e22..0cba74c521 100644 --- a/src/source/Signaling/LwsApiCalls.h +++ b/src/source/Signaling/LwsApiCalls.h @@ -25,78 +25,6 @@ extern "C" { #define PROTOCOL_INDEX_HTTPS 0 #define PROTOCOL_INDEX_WSS 1 -// API postfix definitions -#define CREATE_SIGNALING_CHANNEL_API_POSTFIX "/createSignalingChannel" -#define DESCRIBE_SIGNALING_CHANNEL_API_POSTFIX "/describeSignalingChannel" -#define GET_SIGNALING_CHANNEL_ENDPOINT_API_POSTFIX "/getSignalingChannelEndpoint" -#define DELETE_SIGNALING_CHANNEL_API_POSTFIX "/deleteSignalingChannel" -#define GET_ICE_CONFIG_API_POSTFIX "/v1/get-ice-server-config" -#define JOIN_STORAGE_SESSION_API_POSTFIX "/joinStorageSession" -#define DESCRIBE_MEDIA_STORAGE_CONF_API_POSTFIX "/describeMediaStorageConfiguration" -#define UPDATE_MEDIA_STORAGE_CONF_API_POSTFIX "/updateMediaStorageConfiguration" - -// Signaling protocol name -#define SIGNALING_CHANNEL_PROTOCOL "\"WSS\", \"HTTPS\"" -#define SIGNALING_CHANNEL_PROTOCOL_W_MEDIA_STORAGE "\"WSS\", \"HTTPS\", \"WEBRTC\"" - -// Parameterized string for Describe Channel API -#define DESCRIBE_CHANNEL_PARAM_JSON_TEMPLATE "{\n\t\"ChannelName\": \"%s\"\n}" -#define DESCRIBE_MEDIA_STORAGE_CONF_PARAM_JSON_TEMPLATE "{\n\t\"ChannelARN\": \"%s\"\n}" - -// Parameterized string for Delete Channel API -#define DELETE_CHANNEL_PARAM_JSON_TEMPLATE \ - "{\n\t\"ChannelARN\": \"%s\"," \ - "\n\t\"CurrentVersion\": \"%s\"\n}" - -// Parameterized string for Create Channel API -#define CREATE_CHANNEL_PARAM_JSON_TEMPLATE \ - "{\n\t\"ChannelName\": \"%s\"," \ - "\n\t\"ChannelType\": \"%s\"," \ - "\n\t\"SingleMasterConfiguration\": {" \ - "\n\t\t\"MessageTtlSeconds\": %" PRIu64 "\n\t}" \ - "%s\n}" - -// Parameterized string for each tag pair as a JSON object -#define TAG_PARAM_JSON_OBJ_TEMPLATE "\n\t\t{\"Key\": \"%s\", \"Value\": \"%s\"}," - -// Parameterized string for TagStream API - we should have at least one tag -#define TAGS_PARAM_JSON_TEMPLATE ",\n\t\"Tags\": [%s\n\t]" - -// Parameterized string for Get Channel Endpoint API -#define GET_CHANNEL_ENDPOINT_PARAM_JSON_TEMPLATE \ - "{\n\t\"ChannelARN\": \"%s\"," \ - "\n\t\"SingleMasterChannelEndpointConfiguration\": {" \ - "\n\t\t\"Protocols\": [%s]," \ - "\n\t\t\"Role\": \"%s\"" \ - "\n\t}\n}" - -// Parameterized string for Get Ice Server Config API -#define GET_ICE_CONFIG_PARAM_JSON_TEMPLATE \ - "{\n\t\"ChannelARN\": \"%s\"," \ - "\n\t\"ClientId\": \"%s\"," \ - "\n\t\"Service\": \"TURN\"" \ - "\n}" - -#define SIGNALING_JOIN_STORAGE_SESSION_MASTER_PARAM_JSON_TEMPLATE "{\n\t\"channelArn\": \"%s\"\n}" -#define SIGNALING_JOIN_STORAGE_SESSION_VIEWER_PARAM_JSON_TEMPLATE \ - "{\n\t\"channelArn\": \"%s\"," \ - "\n\t\"clientId\": \"%s\"\n}" -#define SIGNALING_UPDATE_STORAGE_CONFIG_PARAM_JSON_TEMPLATE \ - "{\n\t\"StreamARN\": \"%s\"," \ - "\n\t\"ChannelARN\": \"%s\"," \ - "\n\t\"StorageStatus\": \"%s\"" \ - "\n}" - -// Parameter names for Signaling connect URL -#define SIGNALING_ROLE_PARAM_NAME "X-Amz-Role" -#define SIGNALING_CHANNEL_NAME_PARAM_NAME "X-Amz-ChannelName" -#define SIGNALING_CHANNEL_ARN_PARAM_NAME "X-Amz-ChannelARN" -#define SIGNALING_CLIENT_ID_PARAM_NAME "X-Amz-ClientId" - -// Parameterized string for WSS connect -#define SIGNALING_ENDPOINT_MASTER_URL_WSS_TEMPLATE "%s?%s=%s" -#define SIGNALING_ENDPOINT_VIEWER_URL_WSS_TEMPLATE "%s?%s=%s&%s=%s" - #define SIGNALING_SDP_TYPE_OFFER "SDP_OFFER" #define SIGNALING_SDP_TYPE_ANSWER "SDP_ANSWER" #define SIGNALING_ICE_CANDIDATE "ICE_CANDIDATE" @@ -111,38 +39,6 @@ extern "C" { // Max value length for the status code #define MAX_SIGNALING_STATUS_MESSAGE_LEN 16 -// Send message JSON template -#define SIGNALING_SEND_MESSAGE_TEMPLATE \ - "{\n" \ - "\t\"action\": \"%s\",\n" \ - "\t\"RecipientClientId\": \"%.*s\",\n" \ - "\t\"MessagePayload\": \"%s\"%s\n" \ - "}" - -// Send message JSON template with correlation id -#define SIGNALING_SEND_MESSAGE_TEMPLATE_WITH_CORRELATION_ID \ - "{\n" \ - "\t\"action\": \"%s\",\n" \ - "\t\"RecipientClientId\": \"%.*s\",\n" \ - "\t\"MessagePayload\": \"%s\",\n" \ - "\t\"CorrelationId\": \"%.*s\"%s\n" \ - "}" - -#define SIGNALING_ICE_SERVER_LIST_TEMPLATE_START \ - ",\n" \ - "\t\"IceServerList\": [" - -#define SIGNALING_ICE_SERVER_LIST_TEMPLATE_END "\n\t]" - -#define SIGNALING_ICE_SERVER_TEMPLATE \ - "\n" \ - "\t\t{\n" \ - "\t\t\t\"Password\": \"%s\",\n" \ - "\t\t\t\"Ttl\": %" PRIu64 ",\n" \ - "\t\t\t\"Uris\": [%s],\n" \ - "\t\t\t\"Username\": \"%s\"\n" \ - "\t\t}," - // max length for http date header, must follow RFC 7231, should be less than 32 characters #define MAX_DATE_HEADER_BUFFER_LENGTH 64 @@ -275,7 +171,6 @@ STATUS sendLwsMessage(PSignalingClient, SIGNALING_MESSAGE_TYPE, PCHAR, PCHAR, UI STATUS writeLwsData(PSignalingClient, BOOL); STATUS terminateLwsListenerLoop(PSignalingClient); STATUS receiveLwsMessage(PSignalingClient, PCHAR, UINT32); -STATUS getMessageTypeFromString(PCHAR, UINT32, SIGNALING_MESSAGE_TYPE*); PCHAR getMessageTypeInString(SIGNALING_MESSAGE_TYPE); STATUS wakeLwsServiceEventLoop(PSignalingClient, UINT32); STATUS terminateConnectionWithStatus(PSignalingClient, SERVICE_CALL_RESULT); diff --git a/tst/SignalingApiFunctionalityTest.cpp b/tst/SignalingApiFunctionalityTest.cpp index f63162f697..e403b7460c 100644 --- a/tst/SignalingApiFunctionalityTest.cpp +++ b/tst/SignalingApiFunctionalityTest.cpp @@ -3553,7 +3553,7 @@ TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer) SignalingClientInfoInternal clientInfoInternal; PSignalingClient pSignalingClient; SIGNALING_CLIENT_HANDLE signalingHandle; - UINT32 i, iceCount; + UINT32 iceCount; PIceConfigInfo pIceConfigInfo; signalingClientCallbacks.version = SIGNALING_CLIENT_CALLBACKS_CURRENT_VERSION; @@ -3638,19 +3638,6 @@ TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer) " \"messageType\": \"SDP_OFFER\",\n" " \"senderClientId\": \"ProducerMaster\",\n" " \"messagePayload\": \"eyJ0eXBlIjogIm9mZmVyIiwgInNkcCI6ICJ2PTBcclxubz0tIDIwNTE4OTcyNDggMiBJTiBJUDQgMTI3LjAuMC4xXHJcbnM9LVxyXG50PTAgMFxyXG5hPWdyb3VwOkJVTkRMRSAwIDEgMlxyXG5hPW1zaWQtc2VtYW50aWM6IFdNUyBteUt2c1ZpZGVvU3RyZWFtXHJcbm09YXVkaW8gOSBVRFAvVExTL1JUUC9TQVZQRiAxMTFcclxuYz1JTiBJUDQgMTI3LjAuMC4xXHJcbmE9Y2FuZGlkYXRlOjUgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTo0IDEgdWRwIDE2Nzc3MjE1IDAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMCAwIHR5cCByZWxheSByYWRkciA6Oi8wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MyAxIHVkcCAxNjk0NDk4ODE1IDE5Mi4xNjguMC4yMyA1MTIwNSB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjIgMSB1ZHAgMTY3NzcyMTg1NSAxMC45NS4yMDQuNjEgNTI2NDYgdHlwIHNyZmx4IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZToxIDEgdWRwIDIxMTM5Mjk0NzEgMTAuOTUuMjA0LjYxIDUzNDI4IHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTowIDEgdWRwIDIxMzA3MDY0MzEgMTkyLjE2OC4wLjIzIDUwMTIzIHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPW1zaWQ6bXlLdnNWaWRlb1N0cmVhbSBteUF1ZGlvVHJhY2tcclxuYT1zc3JjOjE4OTEzODY4OTYgY25hbWU6QlA0bEVqdTBHK0VBQk0yS1xyXG5hPXNzcmM6MTg5MTM4Njg5NiBtc2lkOm15S3ZzVmlkZW9TdHJlYW0gbXlBdWRpb1RyYWNrXHJcbmE9c3NyYzoxODkxMzg2ODk2IG1zbGFiZWw6bXlLdnNWaWRlb1N0cmVhbVxyXG5hPXNzcmM6MTg5MTM4Njg5NiBsYWJlbDpteUF1ZGlvVHJhY2tcclxuYT1ydGNwOjkgSU4gSVA0IDAuMC4wLjBcclxuYT1pY2UtdWZyYWc6VVhwM1xyXG5hPWljZS1wd2Q6NGZZbTlEa1FQazl1YmRRQ2RyaFBhVFpnXHJcbmE9aWNlLW9wdGlvbnM6dHJpY2tsZVxyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjBcclxuYT1zZW5kcmVjdlxyXG5hPXJ0Y3AtbXV4XHJcbmE9cnRjcC1yc2l6ZVxyXG5hPXJ0cG1hcDoxMTEgb3B1cy80ODAwMC8yXHJcbmE9Zm10cDoxMTEgbWlucHRpbWU9MTA7dXNlaW5iYW5kZmVjPTFcclxuYT1ydGNwLWZiOjExMSBuYWNrXHJcbm09dmlkZW8gOSBVRFAvVExTL1JUUC9TQVZQRiAxMjVcclxuYz1JTiBJUDQgMTI3LjAuMC4xXHJcbmE9Y2FuZGlkYXRlOjUgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTo0IDEgdWRwIDE2Nzc3MjE1IDAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMCAwIHR5cCByZWxheSByYWRkciA6Oi8wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MyAxIHVkcCAxNjk0NDk4ODE1IDE5Mi4xNjguMC4yMyA1MTIwNSB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjIgMSB1ZHAgMTY3NzcyMTg1NSAxMC45NS4yMDQuNjEgNTI2NDYgdHlwIHNyZmx4IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZToxIDEgdWRwIDIxMTM5Mjk0NzEgMTAuOTUuMjA0LjYxIDUzNDI4IHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTowIDEgdWRwIDIxMzA3MDY0MzEgMTkyLjE2OC4wLjIzIDUwMTIzIHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPW1zaWQ6bXlLdnNWaWRlb1N0cmVhbSBteVZpZGVvVHJhY2tcclxuYT1zc3JjOjIxNDEwMjk1OTIgY25hbWU6QlA0bEVqdTBHK0VBQk0yS1xyXG5hPXNzcmM6MjE0MTAyOTU5MiBtc2lkOm15S3ZzVmlkZW9TdHJlYW0gbXlWaWRlb1RyYWNrXHJcbmE9c3NyYzoyMTQxMDI5NTkyIG1zbGFiZWw6bXlLdnNWaWRlb1N0cmVhbVxyXG5hPXNzcmM6MjE0MTAyOTU5MiBsYWJlbDpteVZpZGVvVHJhY2tcclxuYT1ydGNwOjkgSU4gSVA0IDAuMC4wLjBcclxuYT1pY2UtdWZyYWc6VVhwM1xyXG5hPWljZS1wd2Q6NGZZbTlEa1FQazl1YmRRQ2RyaFBhVFpnXHJcbmE9aWNlLW9wdGlvbnM6dHJpY2tsZVxyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjFcclxuYT1zZW5kcmVjdlxyXG5hPXJ0Y3AtbXV4XHJcbmE9cnRjcC1yc2l6ZVxyXG5hPXJ0cG1hcDoxMjUgSDI2NC85MDAwMFxyXG5hPWZtdHA6MTI1IGxldmVsLWFzeW1tZXRyeS1hbGxvd2VkPTE7cGFja2V0aXphdGlvbi1tb2RlPTE7cHJvZmlsZS1sZXZlbC1pZD00MmUwMWZcclxuYT1ydGNwLWZiOjEyNSBuYWNrXHJcbm09YXBwbGljYXRpb24gOSBVRFAvRFRMUy9TQ1RQIHdlYnJ0Yy1kYXRhY2hhbm5lbFxyXG5jPUlOIElQNCAxMjcuMC4wLjFcclxuYT1jYW5kaWRhdGU6NSAxIHVkcCAxNjc3NzIxNSAwMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDAgMCB0eXAgcmVsYXkgcmFkZHIgOjovMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjQgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTozIDEgdWRwIDE2OTQ0OTg4MTUgMTkyLjE2OC4wLjIzIDUxMjA1IHR5cCBzcmZseCByYWRkciAwLjAuMC4wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MiAxIHVkcCAxNjc3NzIxODU1IDEwLjk1LjIwNC42MSA1MjY0NiB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjEgMSB1ZHAgMjExMzkyOTQ3MSAxMC45NS4yMDQuNjEgNTM0MjggdHlwIGhvc3QgcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjAgMSB1ZHAgMjEzMDcwNjQzMSAxOTIuMTY4LjAuMjMgNTAxMjMgdHlwIGhvc3QgcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9cnRjcDo5IElOIElQNCAwLjAuMC4wXHJcbmE9aWNlLXVmcmFnOlVYcDNcclxuYT1pY2UtcHdkOjRmWW05RGtRUGs5dWJkUUNkcmhQYVRaZ1xyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjJcclxuYT1zY3RwLXBvcnQ6NTAwMFxyXG4ifQ==\",\n" - " \"IceServerList\": [{\n" - " \"Password\": \"ZEXx/a0G7reNO4SrDoK0zYoXZCamD+k/mIn6PEiuDTk=\",\n" - " \"Ttl\": 298,\n" - " \"Uris\": [\"turn:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=tcp\"],\n" - " \"Username\": \"1607424954:djE6YXJuOmF3czpraW5lc2lzdmlkZW86dXMtd2VzdC0yOjgzNjIwMzExNzk3MTpjaGFubmVsL1NjYXJ5VGVzdENoYW5uZWwvMTU5OTg1NjczODM5OA==\"\n" - " },\n" - " {\n" - " \"Password\": \"k5PFpnyKu+oLa3Y3QUIhi+NA3BONdSUevw7NAAy/Nms=\",\n" - " \"Ttl\": 298,\n" - " \"Uris\": [\"turn:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=tcp\"],\n" - " \"Username\": \"1607424954:djE6YXJuOmF3czpraW5lc2lzdmlkZW86dXMtd2VzdC0yOjgzNjIwMzExNzk3MTpjaGFubmVsL1NjYXJ5VGVzdENoYW5uZWwvMTU5OTg1NjczODM5OA==\"\n" - " }\n" - " ],\n" " \"statusResponse\": {\n" " \"correlationId\": \"CorrelationID\",\n" " \"errorType\": \"Unknown message\",\n" @@ -3663,20 +3650,8 @@ TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer) EXPECT_EQ(STATUS_SUCCESS, signalingClientGetIceConfigInfoCount(signalingHandle, &iceCount)); EXPECT_EQ(STATUS_SUCCESS, signalingClientGetIceConfigInfo(signalingHandle, 0, &pIceConfigInfo)); - - // ICE should not have been called again as we updated it via a message - EXPECT_EQ(2, signalingStatesCounts[SIGNALING_CLIENT_STATE_GET_ICE_CONFIG]); - - // Validate the retrieved info - EXPECT_EQ(2, iceCount); - - for (i = 0; i < iceCount; i++) { - EXPECT_EQ(STATUS_SUCCESS, signalingClientGetIceConfigInfo(signalingHandle, i, &pIceConfigInfo)); - EXPECT_NE(0, pIceConfigInfo->uriCount); - EXPECT_EQ(298 * HUNDREDS_OF_NANOS_IN_A_SECOND, pIceConfigInfo->ttl); - EXPECT_EQ(SIGNALING_ICE_CONFIG_INFO_CURRENT_VERSION, pIceConfigInfo->version); - EXPECT_EQ(0, STRCMP("1607424954:djE6YXJuOmF3czpraW5lc2lzdmlkZW86dXMtd2VzdC0yOjgzNjIwMzExNzk3MTpjaGFubmVsL1NjYXJ5VGVzdENoYW5uZWwvMTU5OTg1NjczODM5OA==", pIceConfigInfo->userName)); - } + EXPECT_EQ(3, signalingStatesCounts[SIGNALING_CLIENT_STATE_GET_ICE_CONFIG]); + EXPECT_NE(0, iceCount); // // Set to invalid again to trigger an update. @@ -3689,19 +3664,6 @@ TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer) " \"messageType\": \"SDP_ANSWER\",\n" " \"senderClientId\": \"ProducerMaster\",\n" " \"messagePayload\": \"eyJ0eXBlIjogIm9mZmVyIiwgInNkcCI6ICJ2PTBcclxubz0tIDIwNTE4OTcyNDggMiBJTiBJUDQgMTI3LjAuMC4xXHJcbnM9LVxyXG50PTAgMFxyXG5hPWdyb3VwOkJVTkRMRSAwIDEgMlxyXG5hPW1zaWQtc2VtYW50aWM6IFdNUyBteUt2c1ZpZGVvU3RyZWFtXHJcbm09YXVkaW8gOSBVRFAvVExTL1JUUC9TQVZQRiAxMTFcclxuYz1JTiBJUDQgMTI3LjAuMC4xXHJcbmE9Y2FuZGlkYXRlOjUgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTo0IDEgdWRwIDE2Nzc3MjE1IDAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMCAwIHR5cCByZWxheSByYWRkciA6Oi8wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MyAxIHVkcCAxNjk0NDk4ODE1IDE5Mi4xNjguMC4yMyA1MTIwNSB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjIgMSB1ZHAgMTY3NzcyMTg1NSAxMC45NS4yMDQuNjEgNTI2NDYgdHlwIHNyZmx4IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZToxIDEgdWRwIDIxMTM5Mjk0NzEgMTAuOTUuMjA0LjYxIDUzNDI4IHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTowIDEgdWRwIDIxMzA3MDY0MzEgMTkyLjE2OC4wLjIzIDUwMTIzIHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPW1zaWQ6bXlLdnNWaWRlb1N0cmVhbSBteUF1ZGlvVHJhY2tcclxuYT1zc3JjOjE4OTEzODY4OTYgY25hbWU6QlA0bEVqdTBHK0VBQk0yS1xyXG5hPXNzcmM6MTg5MTM4Njg5NiBtc2lkOm15S3ZzVmlkZW9TdHJlYW0gbXlBdWRpb1RyYWNrXHJcbmE9c3NyYzoxODkxMzg2ODk2IG1zbGFiZWw6bXlLdnNWaWRlb1N0cmVhbVxyXG5hPXNzcmM6MTg5MTM4Njg5NiBsYWJlbDpteUF1ZGlvVHJhY2tcclxuYT1ydGNwOjkgSU4gSVA0IDAuMC4wLjBcclxuYT1pY2UtdWZyYWc6VVhwM1xyXG5hPWljZS1wd2Q6NGZZbTlEa1FQazl1YmRRQ2RyaFBhVFpnXHJcbmE9aWNlLW9wdGlvbnM6dHJpY2tsZVxyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjBcclxuYT1zZW5kcmVjdlxyXG5hPXJ0Y3AtbXV4XHJcbmE9cnRjcC1yc2l6ZVxyXG5hPXJ0cG1hcDoxMTEgb3B1cy80ODAwMC8yXHJcbmE9Zm10cDoxMTEgbWlucHRpbWU9MTA7dXNlaW5iYW5kZmVjPTFcclxuYT1ydGNwLWZiOjExMSBuYWNrXHJcbm09dmlkZW8gOSBVRFAvVExTL1JUUC9TQVZQRiAxMjVcclxuYz1JTiBJUDQgMTI3LjAuMC4xXHJcbmE9Y2FuZGlkYXRlOjUgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTo0IDEgdWRwIDE2Nzc3MjE1IDAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMCAwIHR5cCByZWxheSByYWRkciA6Oi8wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MyAxIHVkcCAxNjk0NDk4ODE1IDE5Mi4xNjguMC4yMyA1MTIwNSB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjIgMSB1ZHAgMTY3NzcyMTg1NSAxMC45NS4yMDQuNjEgNTI2NDYgdHlwIHNyZmx4IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZToxIDEgdWRwIDIxMTM5Mjk0NzEgMTAuOTUuMjA0LjYxIDUzNDI4IHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTowIDEgdWRwIDIxMzA3MDY0MzEgMTkyLjE2OC4wLjIzIDUwMTIzIHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPW1zaWQ6bXlLdnNWaWRlb1N0cmVhbSBteVZpZGVvVHJhY2tcclxuYT1zc3JjOjIxNDEwMjk1OTIgY25hbWU6QlA0bEVqdTBHK0VBQk0yS1xyXG5hPXNzcmM6MjE0MTAyOTU5MiBtc2lkOm15S3ZzVmlkZW9TdHJlYW0gbXlWaWRlb1RyYWNrXHJcbmE9c3NyYzoyMTQxMDI5NTkyIG1zbGFiZWw6bXlLdnNWaWRlb1N0cmVhbVxyXG5hPXNzcmM6MjE0MTAyOTU5MiBsYWJlbDpteVZpZGVvVHJhY2tcclxuYT1ydGNwOjkgSU4gSVA0IDAuMC4wLjBcclxuYT1pY2UtdWZyYWc6VVhwM1xyXG5hPWljZS1wd2Q6NGZZbTlEa1FQazl1YmRRQ2RyaFBhVFpnXHJcbmE9aWNlLW9wdGlvbnM6dHJpY2tsZVxyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjFcclxuYT1zZW5kcmVjdlxyXG5hPXJ0Y3AtbXV4XHJcbmE9cnRjcC1yc2l6ZVxyXG5hPXJ0cG1hcDoxMjUgSDI2NC85MDAwMFxyXG5hPWZtdHA6MTI1IGxldmVsLWFzeW1tZXRyeS1hbGxvd2VkPTE7cGFja2V0aXphdGlvbi1tb2RlPTE7cHJvZmlsZS1sZXZlbC1pZD00MmUwMWZcclxuYT1ydGNwLWZiOjEyNSBuYWNrXHJcbm09YXBwbGljYXRpb24gOSBVRFAvRFRMUy9TQ1RQIHdlYnJ0Yy1kYXRhY2hhbm5lbFxyXG5jPUlOIElQNCAxMjcuMC4wLjFcclxuYT1jYW5kaWRhdGU6NSAxIHVkcCAxNjc3NzIxNSAwMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDAgMCB0eXAgcmVsYXkgcmFkZHIgOjovMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjQgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTozIDEgdWRwIDE2OTQ0OTg4MTUgMTkyLjE2OC4wLjIzIDUxMjA1IHR5cCBzcmZseCByYWRkciAwLjAuMC4wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MiAxIHVkcCAxNjc3NzIxODU1IDEwLjk1LjIwNC42MSA1MjY0NiB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjEgMSB1ZHAgMjExMzkyOTQ3MSAxMC45NS4yMDQuNjEgNTM0MjggdHlwIGhvc3QgcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjAgMSB1ZHAgMjEzMDcwNjQzMSAxOTIuMTY4LjAuMjMgNTAxMjMgdHlwIGhvc3QgcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9cnRjcDo5IElOIElQNCAwLjAuMC4wXHJcbmE9aWNlLXVmcmFnOlVYcDNcclxuYT1pY2UtcHdkOjRmWW05RGtRUGs5dWJkUUNkcmhQYVRaZ1xyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjJcclxuYT1zY3RwLXBvcnQ6NTAwMFxyXG4ifQ==\",\n" - " \"IceServerList\": [{\n" - " \"Password\": \"ZEXx/a0G7reNO4SrDoK0zYoXZCamD+k/mIn6PEiuDTk=\",\n" - " \"Ttl\": 298,\n" - " \"Uris\": [\"turn:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=tcp\"],\n" - " \"Username\": \"1607424954:djE6YXJuOmF3czpraW5lc2lzdmlkZW86dXMtd2VzdC0yOjgzNjIwMzExNzk3MTpjaGFubmVsL1NjYXJ5VGVzdENoYW5uZWwvMTU5OTg1NjczODM5OA==\"\n" - " },\n" - " {\n" - " \"Password\": \"k5PFpnyKu+oLa3Y3QUIhi+NA3BONdSUevw7NAAy/Nms=\",\n" - " \"Ttl\": 298,\n" - " \"Uris\": [\"turn:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=tcp\"],\n" - " \"Username\": \"1607424954:djE6YXJuOmF3czpraW5lc2lzdmlkZW86dXMtd2VzdC0yOjgzNjIwMzExNzk3MTpjaGFubmVsL1NjYXJ5VGVzdENoYW5uZWwvMTU5OTg1NjczODM5OA==\"\n" - " }\n" - " ],\n" " \"statusResponse\": {\n" " \"correlationId\": \"CorrelationID\",\n" " \"errorType\": \"Unknown message\",\n" @@ -3714,9 +3676,8 @@ TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer) EXPECT_EQ(STATUS_SUCCESS, signalingClientGetIceConfigInfoCount(signalingHandle, &iceCount)); EXPECT_EQ(STATUS_SUCCESS, signalingClientGetIceConfigInfo(signalingHandle, 0, &pIceConfigInfo)); - - // ICE should have been called again as we couldn't have updated via the message - EXPECT_EQ(3, signalingStatesCounts[SIGNALING_CLIENT_STATE_GET_ICE_CONFIG]); + EXPECT_EQ(4, signalingStatesCounts[SIGNALING_CLIENT_STATE_GET_ICE_CONFIG]); + EXPECT_NE(0, iceCount); // Check that we are connected and can send a message SignalingMessage signalingMessage; @@ -3744,7 +3705,7 @@ TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer_SlowClockSkew) SignalingClientInfoInternal clientInfoInternal; PSignalingClient pSignalingClient; SIGNALING_CLIENT_HANDLE signalingHandle; - UINT32 i, iceCount; + UINT32 iceCount; PIceConfigInfo pIceConfigInfo; signalingClientCallbacks.version = SIGNALING_CLIENT_CALLBACKS_CURRENT_VERSION; @@ -3832,19 +3793,6 @@ TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer_SlowClockSkew) " \"messageType\": \"SDP_OFFER\",\n" " \"senderClientId\": \"ProducerMaster\",\n" " \"messagePayload\": \"eyJ0eXBlIjogIm9mZmVyIiwgInNkcCI6ICJ2PTBcclxubz0tIDIwNTE4OTcyNDggMiBJTiBJUDQgMTI3LjAuMC4xXHJcbnM9LVxyXG50PTAgMFxyXG5hPWdyb3VwOkJVTkRMRSAwIDEgMlxyXG5hPW1zaWQtc2VtYW50aWM6IFdNUyBteUt2c1ZpZGVvU3RyZWFtXHJcbm09YXVkaW8gOSBVRFAvVExTL1JUUC9TQVZQRiAxMTFcclxuYz1JTiBJUDQgMTI3LjAuMC4xXHJcbmE9Y2FuZGlkYXRlOjUgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTo0IDEgdWRwIDE2Nzc3MjE1IDAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMCAwIHR5cCByZWxheSByYWRkciA6Oi8wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MyAxIHVkcCAxNjk0NDk4ODE1IDE5Mi4xNjguMC4yMyA1MTIwNSB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjIgMSB1ZHAgMTY3NzcyMTg1NSAxMC45NS4yMDQuNjEgNTI2NDYgdHlwIHNyZmx4IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZToxIDEgdWRwIDIxMTM5Mjk0NzEgMTAuOTUuMjA0LjYxIDUzNDI4IHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTowIDEgdWRwIDIxMzA3MDY0MzEgMTkyLjE2OC4wLjIzIDUwMTIzIHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPW1zaWQ6bXlLdnNWaWRlb1N0cmVhbSBteUF1ZGlvVHJhY2tcclxuYT1zc3JjOjE4OTEzODY4OTYgY25hbWU6QlA0bEVqdTBHK0VBQk0yS1xyXG5hPXNzcmM6MTg5MTM4Njg5NiBtc2lkOm15S3ZzVmlkZW9TdHJlYW0gbXlBdWRpb1RyYWNrXHJcbmE9c3NyYzoxODkxMzg2ODk2IG1zbGFiZWw6bXlLdnNWaWRlb1N0cmVhbVxyXG5hPXNzcmM6MTg5MTM4Njg5NiBsYWJlbDpteUF1ZGlvVHJhY2tcclxuYT1ydGNwOjkgSU4gSVA0IDAuMC4wLjBcclxuYT1pY2UtdWZyYWc6VVhwM1xyXG5hPWljZS1wd2Q6NGZZbTlEa1FQazl1YmRRQ2RyaFBhVFpnXHJcbmE9aWNlLW9wdGlvbnM6dHJpY2tsZVxyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjBcclxuYT1zZW5kcmVjdlxyXG5hPXJ0Y3AtbXV4XHJcbmE9cnRjcC1yc2l6ZVxyXG5hPXJ0cG1hcDoxMTEgb3B1cy80ODAwMC8yXHJcbmE9Zm10cDoxMTEgbWlucHRpbWU9MTA7dXNlaW5iYW5kZmVjPTFcclxuYT1ydGNwLWZiOjExMSBuYWNrXHJcbm09dmlkZW8gOSBVRFAvVExTL1JUUC9TQVZQRiAxMjVcclxuYz1JTiBJUDQgMTI3LjAuMC4xXHJcbmE9Y2FuZGlkYXRlOjUgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTo0IDEgdWRwIDE2Nzc3MjE1IDAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMCAwIHR5cCByZWxheSByYWRkciA6Oi8wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MyAxIHVkcCAxNjk0NDk4ODE1IDE5Mi4xNjguMC4yMyA1MTIwNSB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjIgMSB1ZHAgMTY3NzcyMTg1NSAxMC45NS4yMDQuNjEgNTI2NDYgdHlwIHNyZmx4IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZToxIDEgdWRwIDIxMTM5Mjk0NzEgMTAuOTUuMjA0LjYxIDUzNDI4IHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTowIDEgdWRwIDIxMzA3MDY0MzEgMTkyLjE2OC4wLjIzIDUwMTIzIHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPW1zaWQ6bXlLdnNWaWRlb1N0cmVhbSBteVZpZGVvVHJhY2tcclxuYT1zc3JjOjIxNDEwMjk1OTIgY25hbWU6QlA0bEVqdTBHK0VBQk0yS1xyXG5hPXNzcmM6MjE0MTAyOTU5MiBtc2lkOm15S3ZzVmlkZW9TdHJlYW0gbXlWaWRlb1RyYWNrXHJcbmE9c3NyYzoyMTQxMDI5NTkyIG1zbGFiZWw6bXlLdnNWaWRlb1N0cmVhbVxyXG5hPXNzcmM6MjE0MTAyOTU5MiBsYWJlbDpteVZpZGVvVHJhY2tcclxuYT1ydGNwOjkgSU4gSVA0IDAuMC4wLjBcclxuYT1pY2UtdWZyYWc6VVhwM1xyXG5hPWljZS1wd2Q6NGZZbTlEa1FQazl1YmRRQ2RyaFBhVFpnXHJcbmE9aWNlLW9wdGlvbnM6dHJpY2tsZVxyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjFcclxuYT1zZW5kcmVjdlxyXG5hPXJ0Y3AtbXV4XHJcbmE9cnRjcC1yc2l6ZVxyXG5hPXJ0cG1hcDoxMjUgSDI2NC85MDAwMFxyXG5hPWZtdHA6MTI1IGxldmVsLWFzeW1tZXRyeS1hbGxvd2VkPTE7cGFja2V0aXphdGlvbi1tb2RlPTE7cHJvZmlsZS1sZXZlbC1pZD00MmUwMWZcclxuYT1ydGNwLWZiOjEyNSBuYWNrXHJcbm09YXBwbGljYXRpb24gOSBVRFAvRFRMUy9TQ1RQIHdlYnJ0Yy1kYXRhY2hhbm5lbFxyXG5jPUlOIElQNCAxMjcuMC4wLjFcclxuYT1jYW5kaWRhdGU6NSAxIHVkcCAxNjc3NzIxNSAwMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDAgMCB0eXAgcmVsYXkgcmFkZHIgOjovMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjQgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTozIDEgdWRwIDE2OTQ0OTg4MTUgMTkyLjE2OC4wLjIzIDUxMjA1IHR5cCBzcmZseCByYWRkciAwLjAuMC4wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MiAxIHVkcCAxNjc3NzIxODU1IDEwLjk1LjIwNC42MSA1MjY0NiB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjEgMSB1ZHAgMjExMzkyOTQ3MSAxMC45NS4yMDQuNjEgNTM0MjggdHlwIGhvc3QgcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjAgMSB1ZHAgMjEzMDcwNjQzMSAxOTIuMTY4LjAuMjMgNTAxMjMgdHlwIGhvc3QgcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9cnRjcDo5IElOIElQNCAwLjAuMC4wXHJcbmE9aWNlLXVmcmFnOlVYcDNcclxuYT1pY2UtcHdkOjRmWW05RGtRUGs5dWJkUUNkcmhQYVRaZ1xyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjJcclxuYT1zY3RwLXBvcnQ6NTAwMFxyXG4ifQ==\",\n" - " \"IceServerList\": [{\n" - " \"Password\": \"ZEXx/a0G7reNO4SrDoK0zYoXZCamD+k/mIn6PEiuDTk=\",\n" - " \"Ttl\": 298,\n" - " \"Uris\": [\"turn:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=tcp\"],\n" - " \"Username\": \"1607424954:djE6YXJuOmF3czpraW5lc2lzdmlkZW86dXMtd2VzdC0yOjgzNjIwMzExNzk3MTpjaGFubmVsL1NjYXJ5VGVzdENoYW5uZWwvMTU5OTg1NjczODM5OA==\"\n" - " },\n" - " {\n" - " \"Password\": \"k5PFpnyKu+oLa3Y3QUIhi+NA3BONdSUevw7NAAy/Nms=\",\n" - " \"Ttl\": 298,\n" - " \"Uris\": [\"turn:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=tcp\"],\n" - " \"Username\": \"1607424954:djE6YXJuOmF3czpraW5lc2lzdmlkZW86dXMtd2VzdC0yOjgzNjIwMzExNzk3MTpjaGFubmVsL1NjYXJ5VGVzdENoYW5uZWwvMTU5OTg1NjczODM5OA==\"\n" - " }\n" - " ],\n" " \"statusResponse\": {\n" " \"correlationId\": \"CorrelationID\",\n" " \"errorType\": \"Unknown message\",\n" @@ -3857,20 +3805,8 @@ TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer_SlowClockSkew) EXPECT_EQ(STATUS_SUCCESS, signalingClientGetIceConfigInfoCount(signalingHandle, &iceCount)); EXPECT_EQ(STATUS_SUCCESS, signalingClientGetIceConfigInfo(signalingHandle, 0, &pIceConfigInfo)); - - // ICE should not have been called again as we updated it via a message - EXPECT_EQ(3, signalingStatesCounts[SIGNALING_CLIENT_STATE_GET_ICE_CONFIG]); - - // Validate the retrieved info - EXPECT_EQ(2, iceCount); - - for (i = 0; i < iceCount; i++) { - EXPECT_EQ(STATUS_SUCCESS, signalingClientGetIceConfigInfo(signalingHandle, i, &pIceConfigInfo)); - EXPECT_NE(0, pIceConfigInfo->uriCount); - EXPECT_EQ(298 * HUNDREDS_OF_NANOS_IN_A_SECOND, pIceConfigInfo->ttl); - EXPECT_EQ(SIGNALING_ICE_CONFIG_INFO_CURRENT_VERSION, pIceConfigInfo->version); - EXPECT_EQ(0, STRCMP("1607424954:djE6YXJuOmF3czpraW5lc2lzdmlkZW86dXMtd2VzdC0yOjgzNjIwMzExNzk3MTpjaGFubmVsL1NjYXJ5VGVzdENoYW5uZWwvMTU5OTg1NjczODM5OA==", pIceConfigInfo->userName)); - } + EXPECT_EQ(4, signalingStatesCounts[SIGNALING_CLIENT_STATE_GET_ICE_CONFIG]); + EXPECT_NE(0, iceCount); // // Set to invalid again to trigger an update. @@ -3883,19 +3819,6 @@ TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer_SlowClockSkew) " \"messageType\": \"SDP_ANSWER\",\n" " \"senderClientId\": \"ProducerMaster\",\n" " \"messagePayload\": \"eyJ0eXBlIjogIm9mZmVyIiwgInNkcCI6ICJ2PTBcclxubz0tIDIwNTE4OTcyNDggMiBJTiBJUDQgMTI3LjAuMC4xXHJcbnM9LVxyXG50PTAgMFxyXG5hPWdyb3VwOkJVTkRMRSAwIDEgMlxyXG5hPW1zaWQtc2VtYW50aWM6IFdNUyBteUt2c1ZpZGVvU3RyZWFtXHJcbm09YXVkaW8gOSBVRFAvVExTL1JUUC9TQVZQRiAxMTFcclxuYz1JTiBJUDQgMTI3LjAuMC4xXHJcbmE9Y2FuZGlkYXRlOjUgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTo0IDEgdWRwIDE2Nzc3MjE1IDAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMCAwIHR5cCByZWxheSByYWRkciA6Oi8wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MyAxIHVkcCAxNjk0NDk4ODE1IDE5Mi4xNjguMC4yMyA1MTIwNSB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjIgMSB1ZHAgMTY3NzcyMTg1NSAxMC45NS4yMDQuNjEgNTI2NDYgdHlwIHNyZmx4IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZToxIDEgdWRwIDIxMTM5Mjk0NzEgMTAuOTUuMjA0LjYxIDUzNDI4IHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTowIDEgdWRwIDIxMzA3MDY0MzEgMTkyLjE2OC4wLjIzIDUwMTIzIHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPW1zaWQ6bXlLdnNWaWRlb1N0cmVhbSBteUF1ZGlvVHJhY2tcclxuYT1zc3JjOjE4OTEzODY4OTYgY25hbWU6QlA0bEVqdTBHK0VBQk0yS1xyXG5hPXNzcmM6MTg5MTM4Njg5NiBtc2lkOm15S3ZzVmlkZW9TdHJlYW0gbXlBdWRpb1RyYWNrXHJcbmE9c3NyYzoxODkxMzg2ODk2IG1zbGFiZWw6bXlLdnNWaWRlb1N0cmVhbVxyXG5hPXNzcmM6MTg5MTM4Njg5NiBsYWJlbDpteUF1ZGlvVHJhY2tcclxuYT1ydGNwOjkgSU4gSVA0IDAuMC4wLjBcclxuYT1pY2UtdWZyYWc6VVhwM1xyXG5hPWljZS1wd2Q6NGZZbTlEa1FQazl1YmRRQ2RyaFBhVFpnXHJcbmE9aWNlLW9wdGlvbnM6dHJpY2tsZVxyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjBcclxuYT1zZW5kcmVjdlxyXG5hPXJ0Y3AtbXV4XHJcbmE9cnRjcC1yc2l6ZVxyXG5hPXJ0cG1hcDoxMTEgb3B1cy80ODAwMC8yXHJcbmE9Zm10cDoxMTEgbWlucHRpbWU9MTA7dXNlaW5iYW5kZmVjPTFcclxuYT1ydGNwLWZiOjExMSBuYWNrXHJcbm09dmlkZW8gOSBVRFAvVExTL1JUUC9TQVZQRiAxMjVcclxuYz1JTiBJUDQgMTI3LjAuMC4xXHJcbmE9Y2FuZGlkYXRlOjUgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTo0IDEgdWRwIDE2Nzc3MjE1IDAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMCAwIHR5cCByZWxheSByYWRkciA6Oi8wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MyAxIHVkcCAxNjk0NDk4ODE1IDE5Mi4xNjguMC4yMyA1MTIwNSB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjIgMSB1ZHAgMTY3NzcyMTg1NSAxMC45NS4yMDQuNjEgNTI2NDYgdHlwIHNyZmx4IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZToxIDEgdWRwIDIxMTM5Mjk0NzEgMTAuOTUuMjA0LjYxIDUzNDI4IHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTowIDEgdWRwIDIxMzA3MDY0MzEgMTkyLjE2OC4wLjIzIDUwMTIzIHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPW1zaWQ6bXlLdnNWaWRlb1N0cmVhbSBteVZpZGVvVHJhY2tcclxuYT1zc3JjOjIxNDEwMjk1OTIgY25hbWU6QlA0bEVqdTBHK0VBQk0yS1xyXG5hPXNzcmM6MjE0MTAyOTU5MiBtc2lkOm15S3ZzVmlkZW9TdHJlYW0gbXlWaWRlb1RyYWNrXHJcbmE9c3NyYzoyMTQxMDI5NTkyIG1zbGFiZWw6bXlLdnNWaWRlb1N0cmVhbVxyXG5hPXNzcmM6MjE0MTAyOTU5MiBsYWJlbDpteVZpZGVvVHJhY2tcclxuYT1ydGNwOjkgSU4gSVA0IDAuMC4wLjBcclxuYT1pY2UtdWZyYWc6VVhwM1xyXG5hPWljZS1wd2Q6NGZZbTlEa1FQazl1YmRRQ2RyaFBhVFpnXHJcbmE9aWNlLW9wdGlvbnM6dHJpY2tsZVxyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjFcclxuYT1zZW5kcmVjdlxyXG5hPXJ0Y3AtbXV4XHJcbmE9cnRjcC1yc2l6ZVxyXG5hPXJ0cG1hcDoxMjUgSDI2NC85MDAwMFxyXG5hPWZtdHA6MTI1IGxldmVsLWFzeW1tZXRyeS1hbGxvd2VkPTE7cGFja2V0aXphdGlvbi1tb2RlPTE7cHJvZmlsZS1sZXZlbC1pZD00MmUwMWZcclxuYT1ydGNwLWZiOjEyNSBuYWNrXHJcbm09YXBwbGljYXRpb24gOSBVRFAvRFRMUy9TQ1RQIHdlYnJ0Yy1kYXRhY2hhbm5lbFxyXG5jPUlOIElQNCAxMjcuMC4wLjFcclxuYT1jYW5kaWRhdGU6NSAxIHVkcCAxNjc3NzIxNSAwMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDAgMCB0eXAgcmVsYXkgcmFkZHIgOjovMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjQgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTozIDEgdWRwIDE2OTQ0OTg4MTUgMTkyLjE2OC4wLjIzIDUxMjA1IHR5cCBzcmZseCByYWRkciAwLjAuMC4wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MiAxIHVkcCAxNjc3NzIxODU1IDEwLjk1LjIwNC42MSA1MjY0NiB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjEgMSB1ZHAgMjExMzkyOTQ3MSAxMC45NS4yMDQuNjEgNTM0MjggdHlwIGhvc3QgcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjAgMSB1ZHAgMjEzMDcwNjQzMSAxOTIuMTY4LjAuMjMgNTAxMjMgdHlwIGhvc3QgcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9cnRjcDo5IElOIElQNCAwLjAuMC4wXHJcbmE9aWNlLXVmcmFnOlVYcDNcclxuYT1pY2UtcHdkOjRmWW05RGtRUGs5dWJkUUNkcmhQYVRaZ1xyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjJcclxuYT1zY3RwLXBvcnQ6NTAwMFxyXG4ifQ==\",\n" - " \"IceServerList\": [{\n" - " \"Password\": \"ZEXx/a0G7reNO4SrDoK0zYoXZCamD+k/mIn6PEiuDTk=\",\n" - " \"Ttl\": 298,\n" - " \"Uris\": [\"turn:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=tcp\"],\n" - " \"Username\": \"1607424954:djE6YXJuOmF3czpraW5lc2lzdmlkZW86dXMtd2VzdC0yOjgzNjIwMzExNzk3MTpjaGFubmVsL1NjYXJ5VGVzdENoYW5uZWwvMTU5OTg1NjczODM5OA==\"\n" - " },\n" - " {\n" - " \"Password\": \"k5PFpnyKu+oLa3Y3QUIhi+NA3BONdSUevw7NAAy/Nms=\",\n" - " \"Ttl\": 298,\n" - " \"Uris\": [\"turn:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=tcp\"],\n" - " \"Username\": \"1607424954:djE6YXJuOmF3czpraW5lc2lzdmlkZW86dXMtd2VzdC0yOjgzNjIwMzExNzk3MTpjaGFubmVsL1NjYXJ5VGVzdENoYW5uZWwvMTU5OTg1NjczODM5OA==\"\n" - " }\n" - " ],\n" " \"statusResponse\": {\n" " \"correlationId\": \"CorrelationID\",\n" " \"errorType\": \"Unknown message\",\n" @@ -3908,9 +3831,8 @@ TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer_SlowClockSkew) EXPECT_EQ(STATUS_SUCCESS, signalingClientGetIceConfigInfoCount(signalingHandle, &iceCount)); EXPECT_EQ(STATUS_SUCCESS, signalingClientGetIceConfigInfo(signalingHandle, 0, &pIceConfigInfo)); - - // ICE should have been called again as we couldn't have updated via the message - EXPECT_EQ(4, signalingStatesCounts[SIGNALING_CLIENT_STATE_GET_ICE_CONFIG]); + EXPECT_EQ(5, signalingStatesCounts[SIGNALING_CLIENT_STATE_GET_ICE_CONFIG]); + EXPECT_NE(0, iceCount); // Check that we are connected and can send a message SignalingMessage signalingMessage; @@ -3939,7 +3861,7 @@ TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer_FastClockSkew) SignalingClientInfoInternal clientInfoInternal; PSignalingClient pSignalingClient; SIGNALING_CLIENT_HANDLE signalingHandle; - UINT32 i, iceCount; + UINT32 iceCount; PIceConfigInfo pIceConfigInfo; signalingClientCallbacks.version = SIGNALING_CLIENT_CALLBACKS_CURRENT_VERSION; @@ -4021,19 +3943,6 @@ TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer_FastClockSkew) " \"messageType\": \"SDP_OFFER\",\n" " \"senderClientId\": \"ProducerMaster\",\n" " \"messagePayload\": \"eyJ0eXBlIjogIm9mZmVyIiwgInNkcCI6ICJ2PTBcclxubz0tIDIwNTE4OTcyNDggMiBJTiBJUDQgMTI3LjAuMC4xXHJcbnM9LVxyXG50PTAgMFxyXG5hPWdyb3VwOkJVTkRMRSAwIDEgMlxyXG5hPW1zaWQtc2VtYW50aWM6IFdNUyBteUt2c1ZpZGVvU3RyZWFtXHJcbm09YXVkaW8gOSBVRFAvVExTL1JUUC9TQVZQRiAxMTFcclxuYz1JTiBJUDQgMTI3LjAuMC4xXHJcbmE9Y2FuZGlkYXRlOjUgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTo0IDEgdWRwIDE2Nzc3MjE1IDAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMCAwIHR5cCByZWxheSByYWRkciA6Oi8wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MyAxIHVkcCAxNjk0NDk4ODE1IDE5Mi4xNjguMC4yMyA1MTIwNSB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjIgMSB1ZHAgMTY3NzcyMTg1NSAxMC45NS4yMDQuNjEgNTI2NDYgdHlwIHNyZmx4IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZToxIDEgdWRwIDIxMTM5Mjk0NzEgMTAuOTUuMjA0LjYxIDUzNDI4IHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTowIDEgdWRwIDIxMzA3MDY0MzEgMTkyLjE2OC4wLjIzIDUwMTIzIHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPW1zaWQ6bXlLdnNWaWRlb1N0cmVhbSBteUF1ZGlvVHJhY2tcclxuYT1zc3JjOjE4OTEzODY4OTYgY25hbWU6QlA0bEVqdTBHK0VBQk0yS1xyXG5hPXNzcmM6MTg5MTM4Njg5NiBtc2lkOm15S3ZzVmlkZW9TdHJlYW0gbXlBdWRpb1RyYWNrXHJcbmE9c3NyYzoxODkxMzg2ODk2IG1zbGFiZWw6bXlLdnNWaWRlb1N0cmVhbVxyXG5hPXNzcmM6MTg5MTM4Njg5NiBsYWJlbDpteUF1ZGlvVHJhY2tcclxuYT1ydGNwOjkgSU4gSVA0IDAuMC4wLjBcclxuYT1pY2UtdWZyYWc6VVhwM1xyXG5hPWljZS1wd2Q6NGZZbTlEa1FQazl1YmRRQ2RyaFBhVFpnXHJcbmE9aWNlLW9wdGlvbnM6dHJpY2tsZVxyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjBcclxuYT1zZW5kcmVjdlxyXG5hPXJ0Y3AtbXV4XHJcbmE9cnRjcC1yc2l6ZVxyXG5hPXJ0cG1hcDoxMTEgb3B1cy80ODAwMC8yXHJcbmE9Zm10cDoxMTEgbWlucHRpbWU9MTA7dXNlaW5iYW5kZmVjPTFcclxuYT1ydGNwLWZiOjExMSBuYWNrXHJcbm09dmlkZW8gOSBVRFAvVExTL1JUUC9TQVZQRiAxMjVcclxuYz1JTiBJUDQgMTI3LjAuMC4xXHJcbmE9Y2FuZGlkYXRlOjUgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTo0IDEgdWRwIDE2Nzc3MjE1IDAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMCAwIHR5cCByZWxheSByYWRkciA6Oi8wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MyAxIHVkcCAxNjk0NDk4ODE1IDE5Mi4xNjguMC4yMyA1MTIwNSB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjIgMSB1ZHAgMTY3NzcyMTg1NSAxMC45NS4yMDQuNjEgNTI2NDYgdHlwIHNyZmx4IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZToxIDEgdWRwIDIxMTM5Mjk0NzEgMTAuOTUuMjA0LjYxIDUzNDI4IHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTowIDEgdWRwIDIxMzA3MDY0MzEgMTkyLjE2OC4wLjIzIDUwMTIzIHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPW1zaWQ6bXlLdnNWaWRlb1N0cmVhbSBteVZpZGVvVHJhY2tcclxuYT1zc3JjOjIxNDEwMjk1OTIgY25hbWU6QlA0bEVqdTBHK0VBQk0yS1xyXG5hPXNzcmM6MjE0MTAyOTU5MiBtc2lkOm15S3ZzVmlkZW9TdHJlYW0gbXlWaWRlb1RyYWNrXHJcbmE9c3NyYzoyMTQxMDI5NTkyIG1zbGFiZWw6bXlLdnNWaWRlb1N0cmVhbVxyXG5hPXNzcmM6MjE0MTAyOTU5MiBsYWJlbDpteVZpZGVvVHJhY2tcclxuYT1ydGNwOjkgSU4gSVA0IDAuMC4wLjBcclxuYT1pY2UtdWZyYWc6VVhwM1xyXG5hPWljZS1wd2Q6NGZZbTlEa1FQazl1YmRRQ2RyaFBhVFpnXHJcbmE9aWNlLW9wdGlvbnM6dHJpY2tsZVxyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjFcclxuYT1zZW5kcmVjdlxyXG5hPXJ0Y3AtbXV4XHJcbmE9cnRjcC1yc2l6ZVxyXG5hPXJ0cG1hcDoxMjUgSDI2NC85MDAwMFxyXG5hPWZtdHA6MTI1IGxldmVsLWFzeW1tZXRyeS1hbGxvd2VkPTE7cGFja2V0aXphdGlvbi1tb2RlPTE7cHJvZmlsZS1sZXZlbC1pZD00MmUwMWZcclxuYT1ydGNwLWZiOjEyNSBuYWNrXHJcbm09YXBwbGljYXRpb24gOSBVRFAvRFRMUy9TQ1RQIHdlYnJ0Yy1kYXRhY2hhbm5lbFxyXG5jPUlOIElQNCAxMjcuMC4wLjFcclxuYT1jYW5kaWRhdGU6NSAxIHVkcCAxNjc3NzIxNSAwMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDAgMCB0eXAgcmVsYXkgcmFkZHIgOjovMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjQgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTozIDEgdWRwIDE2OTQ0OTg4MTUgMTkyLjE2OC4wLjIzIDUxMjA1IHR5cCBzcmZseCByYWRkciAwLjAuMC4wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MiAxIHVkcCAxNjc3NzIxODU1IDEwLjk1LjIwNC42MSA1MjY0NiB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjEgMSB1ZHAgMjExMzkyOTQ3MSAxMC45NS4yMDQuNjEgNTM0MjggdHlwIGhvc3QgcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjAgMSB1ZHAgMjEzMDcwNjQzMSAxOTIuMTY4LjAuMjMgNTAxMjMgdHlwIGhvc3QgcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9cnRjcDo5IElOIElQNCAwLjAuMC4wXHJcbmE9aWNlLXVmcmFnOlVYcDNcclxuYT1pY2UtcHdkOjRmWW05RGtRUGs5dWJkUUNkcmhQYVRaZ1xyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjJcclxuYT1zY3RwLXBvcnQ6NTAwMFxyXG4ifQ==\",\n" - " \"IceServerList\": [{\n" - " \"Password\": \"ZEXx/a0G7reNO4SrDoK0zYoXZCamD+k/mIn6PEiuDTk=\",\n" - " \"Ttl\": 298,\n" - " \"Uris\": [\"turn:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=tcp\"],\n" - " \"Username\": \"1607424954:djE6YXJuOmF3czpraW5lc2lzdmlkZW86dXMtd2VzdC0yOjgzNjIwMzExNzk3MTpjaGFubmVsL1NjYXJ5VGVzdENoYW5uZWwvMTU5OTg1NjczODM5OA==\"\n" - " },\n" - " {\n" - " \"Password\": \"k5PFpnyKu+oLa3Y3QUIhi+NA3BONdSUevw7NAAy/Nms=\",\n" - " \"Ttl\": 298,\n" - " \"Uris\": [\"turn:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=tcp\"],\n" - " \"Username\": \"1607424954:djE6YXJuOmF3czpraW5lc2lzdmlkZW86dXMtd2VzdC0yOjgzNjIwMzExNzk3MTpjaGFubmVsL1NjYXJ5VGVzdENoYW5uZWwvMTU5OTg1NjczODM5OA==\"\n" - " }\n" - " ],\n" " \"statusResponse\": {\n" " \"correlationId\": \"CorrelationID\",\n" " \"errorType\": \"Unknown message\",\n" @@ -4046,20 +3955,8 @@ TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer_FastClockSkew) EXPECT_EQ(STATUS_SUCCESS, signalingClientGetIceConfigInfoCount(signalingHandle, &iceCount)); EXPECT_EQ(STATUS_SUCCESS, signalingClientGetIceConfigInfo(signalingHandle, 0, &pIceConfigInfo)); - - // ICE should not have been called again as we updated it via a message - EXPECT_EQ(3, signalingStatesCounts[SIGNALING_CLIENT_STATE_GET_ICE_CONFIG]); - - // Validate the retrieved info - EXPECT_EQ(2, iceCount); - - for (i = 0; i < iceCount; i++) { - EXPECT_EQ(STATUS_SUCCESS, signalingClientGetIceConfigInfo(signalingHandle, i, &pIceConfigInfo)); - EXPECT_NE(0, pIceConfigInfo->uriCount); - EXPECT_EQ(298 * HUNDREDS_OF_NANOS_IN_A_SECOND, pIceConfigInfo->ttl); - EXPECT_EQ(SIGNALING_ICE_CONFIG_INFO_CURRENT_VERSION, pIceConfigInfo->version); - EXPECT_EQ(0, STRCMP("1607424954:djE6YXJuOmF3czpraW5lc2lzdmlkZW86dXMtd2VzdC0yOjgzNjIwMzExNzk3MTpjaGFubmVsL1NjYXJ5VGVzdENoYW5uZWwvMTU5OTg1NjczODM5OA==", pIceConfigInfo->userName)); - } + EXPECT_EQ(4, signalingStatesCounts[SIGNALING_CLIENT_STATE_GET_ICE_CONFIG]); + EXPECT_NE(0, iceCount); // // Set to invalid again to trigger an update. @@ -4072,19 +3969,6 @@ TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer_FastClockSkew) " \"messageType\": \"SDP_ANSWER\",\n" " \"senderClientId\": \"ProducerMaster\",\n" " \"messagePayload\": \"eyJ0eXBlIjogIm9mZmVyIiwgInNkcCI6ICJ2PTBcclxubz0tIDIwNTE4OTcyNDggMiBJTiBJUDQgMTI3LjAuMC4xXHJcbnM9LVxyXG50PTAgMFxyXG5hPWdyb3VwOkJVTkRMRSAwIDEgMlxyXG5hPW1zaWQtc2VtYW50aWM6IFdNUyBteUt2c1ZpZGVvU3RyZWFtXHJcbm09YXVkaW8gOSBVRFAvVExTL1JUUC9TQVZQRiAxMTFcclxuYz1JTiBJUDQgMTI3LjAuMC4xXHJcbmE9Y2FuZGlkYXRlOjUgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTo0IDEgdWRwIDE2Nzc3MjE1IDAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMCAwIHR5cCByZWxheSByYWRkciA6Oi8wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MyAxIHVkcCAxNjk0NDk4ODE1IDE5Mi4xNjguMC4yMyA1MTIwNSB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjIgMSB1ZHAgMTY3NzcyMTg1NSAxMC45NS4yMDQuNjEgNTI2NDYgdHlwIHNyZmx4IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZToxIDEgdWRwIDIxMTM5Mjk0NzEgMTAuOTUuMjA0LjYxIDUzNDI4IHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTowIDEgdWRwIDIxMzA3MDY0MzEgMTkyLjE2OC4wLjIzIDUwMTIzIHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPW1zaWQ6bXlLdnNWaWRlb1N0cmVhbSBteUF1ZGlvVHJhY2tcclxuYT1zc3JjOjE4OTEzODY4OTYgY25hbWU6QlA0bEVqdTBHK0VBQk0yS1xyXG5hPXNzcmM6MTg5MTM4Njg5NiBtc2lkOm15S3ZzVmlkZW9TdHJlYW0gbXlBdWRpb1RyYWNrXHJcbmE9c3NyYzoxODkxMzg2ODk2IG1zbGFiZWw6bXlLdnNWaWRlb1N0cmVhbVxyXG5hPXNzcmM6MTg5MTM4Njg5NiBsYWJlbDpteUF1ZGlvVHJhY2tcclxuYT1ydGNwOjkgSU4gSVA0IDAuMC4wLjBcclxuYT1pY2UtdWZyYWc6VVhwM1xyXG5hPWljZS1wd2Q6NGZZbTlEa1FQazl1YmRRQ2RyaFBhVFpnXHJcbmE9aWNlLW9wdGlvbnM6dHJpY2tsZVxyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjBcclxuYT1zZW5kcmVjdlxyXG5hPXJ0Y3AtbXV4XHJcbmE9cnRjcC1yc2l6ZVxyXG5hPXJ0cG1hcDoxMTEgb3B1cy80ODAwMC8yXHJcbmE9Zm10cDoxMTEgbWlucHRpbWU9MTA7dXNlaW5iYW5kZmVjPTFcclxuYT1ydGNwLWZiOjExMSBuYWNrXHJcbm09dmlkZW8gOSBVRFAvVExTL1JUUC9TQVZQRiAxMjVcclxuYz1JTiBJUDQgMTI3LjAuMC4xXHJcbmE9Y2FuZGlkYXRlOjUgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTo0IDEgdWRwIDE2Nzc3MjE1IDAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMCAwIHR5cCByZWxheSByYWRkciA6Oi8wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MyAxIHVkcCAxNjk0NDk4ODE1IDE5Mi4xNjguMC4yMyA1MTIwNSB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjIgMSB1ZHAgMTY3NzcyMTg1NSAxMC45NS4yMDQuNjEgNTI2NDYgdHlwIHNyZmx4IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZToxIDEgdWRwIDIxMTM5Mjk0NzEgMTAuOTUuMjA0LjYxIDUzNDI4IHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTowIDEgdWRwIDIxMzA3MDY0MzEgMTkyLjE2OC4wLjIzIDUwMTIzIHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPW1zaWQ6bXlLdnNWaWRlb1N0cmVhbSBteVZpZGVvVHJhY2tcclxuYT1zc3JjOjIxNDEwMjk1OTIgY25hbWU6QlA0bEVqdTBHK0VBQk0yS1xyXG5hPXNzcmM6MjE0MTAyOTU5MiBtc2lkOm15S3ZzVmlkZW9TdHJlYW0gbXlWaWRlb1RyYWNrXHJcbmE9c3NyYzoyMTQxMDI5NTkyIG1zbGFiZWw6bXlLdnNWaWRlb1N0cmVhbVxyXG5hPXNzcmM6MjE0MTAyOTU5MiBsYWJlbDpteVZpZGVvVHJhY2tcclxuYT1ydGNwOjkgSU4gSVA0IDAuMC4wLjBcclxuYT1pY2UtdWZyYWc6VVhwM1xyXG5hPWljZS1wd2Q6NGZZbTlEa1FQazl1YmRRQ2RyaFBhVFpnXHJcbmE9aWNlLW9wdGlvbnM6dHJpY2tsZVxyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjFcclxuYT1zZW5kcmVjdlxyXG5hPXJ0Y3AtbXV4XHJcbmE9cnRjcC1yc2l6ZVxyXG5hPXJ0cG1hcDoxMjUgSDI2NC85MDAwMFxyXG5hPWZtdHA6MTI1IGxldmVsLWFzeW1tZXRyeS1hbGxvd2VkPTE7cGFja2V0aXphdGlvbi1tb2RlPTE7cHJvZmlsZS1sZXZlbC1pZD00MmUwMWZcclxuYT1ydGNwLWZiOjEyNSBuYWNrXHJcbm09YXBwbGljYXRpb24gOSBVRFAvRFRMUy9TQ1RQIHdlYnJ0Yy1kYXRhY2hhbm5lbFxyXG5jPUlOIElQNCAxMjcuMC4wLjFcclxuYT1jYW5kaWRhdGU6NSAxIHVkcCAxNjc3NzIxNSAwMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDAgMCB0eXAgcmVsYXkgcmFkZHIgOjovMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjQgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTozIDEgdWRwIDE2OTQ0OTg4MTUgMTkyLjE2OC4wLjIzIDUxMjA1IHR5cCBzcmZseCByYWRkciAwLjAuMC4wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MiAxIHVkcCAxNjc3NzIxODU1IDEwLjk1LjIwNC42MSA1MjY0NiB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjEgMSB1ZHAgMjExMzkyOTQ3MSAxMC45NS4yMDQuNjEgNTM0MjggdHlwIGhvc3QgcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjAgMSB1ZHAgMjEzMDcwNjQzMSAxOTIuMTY4LjAuMjMgNTAxMjMgdHlwIGhvc3QgcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9cnRjcDo5IElOIElQNCAwLjAuMC4wXHJcbmE9aWNlLXVmcmFnOlVYcDNcclxuYT1pY2UtcHdkOjRmWW05RGtRUGs5dWJkUUNkcmhQYVRaZ1xyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjJcclxuYT1zY3RwLXBvcnQ6NTAwMFxyXG4ifQ==\",\n" - " \"IceServerList\": [{\n" - " \"Password\": \"ZEXx/a0G7reNO4SrDoK0zYoXZCamD+k/mIn6PEiuDTk=\",\n" - " \"Ttl\": 298,\n" - " \"Uris\": [\"turn:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=tcp\"],\n" - " \"Username\": \"1607424954:djE6YXJuOmF3czpraW5lc2lzdmlkZW86dXMtd2VzdC0yOjgzNjIwMzExNzk3MTpjaGFubmVsL1NjYXJ5VGVzdENoYW5uZWwvMTU5OTg1NjczODM5OA==\"\n" - " },\n" - " {\n" - " \"Password\": \"k5PFpnyKu+oLa3Y3QUIhi+NA3BONdSUevw7NAAy/Nms=\",\n" - " \"Ttl\": 298,\n" - " \"Uris\": [\"turn:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=tcp\"],\n" - " \"Username\": \"1607424954:djE6YXJuOmF3czpraW5lc2lzdmlkZW86dXMtd2VzdC0yOjgzNjIwMzExNzk3MTpjaGFubmVsL1NjYXJ5VGVzdENoYW5uZWwvMTU5OTg1NjczODM5OA==\"\n" - " }\n" - " ],\n" " \"statusResponse\": {\n" " \"correlationId\": \"CorrelationID\",\n" " \"errorType\": \"Unknown message\",\n" @@ -4097,9 +3981,8 @@ TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer_FastClockSkew) EXPECT_EQ(STATUS_SUCCESS, signalingClientGetIceConfigInfoCount(signalingHandle, &iceCount)); EXPECT_EQ(STATUS_SUCCESS, signalingClientGetIceConfigInfo(signalingHandle, 0, &pIceConfigInfo)); - - // ICE should have been called again as we couldn't have updated via the message - EXPECT_EQ(4, signalingStatesCounts[SIGNALING_CLIENT_STATE_GET_ICE_CONFIG]); + EXPECT_EQ(5, signalingStatesCounts[SIGNALING_CLIENT_STATE_GET_ICE_CONFIG]); + EXPECT_NE(0, iceCount); // Check that we are connected and can send a message SignalingMessage signalingMessage; @@ -4129,7 +4012,7 @@ TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer_FastClockSkew_Veri SignalingClientInfoInternal clientInfoInternal; PSignalingClient pSignalingClient; SIGNALING_CLIENT_HANDLE signalingHandle; - UINT32 i, iceCount; + UINT32 iceCount; PIceConfigInfo pIceConfigInfo; STATUS retStatus = STATUS_SUCCESS; @@ -4230,19 +4113,6 @@ TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer_FastClockSkew_Veri " \"messageType\": \"SDP_OFFER\",\n" " \"senderClientId\": \"ProducerMaster\",\n" " \"messagePayload\": \"eyJ0eXBlIjogIm9mZmVyIiwgInNkcCI6ICJ2PTBcclxubz0tIDIwNTE4OTcyNDggMiBJTiBJUDQgMTI3LjAuMC4xXHJcbnM9LVxyXG50PTAgMFxyXG5hPWdyb3VwOkJVTkRMRSAwIDEgMlxyXG5hPW1zaWQtc2VtYW50aWM6IFdNUyBteUt2c1ZpZGVvU3RyZWFtXHJcbm09YXVkaW8gOSBVRFAvVExTL1JUUC9TQVZQRiAxMTFcclxuYz1JTiBJUDQgMTI3LjAuMC4xXHJcbmE9Y2FuZGlkYXRlOjUgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTo0IDEgdWRwIDE2Nzc3MjE1IDAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMCAwIHR5cCByZWxheSByYWRkciA6Oi8wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MyAxIHVkcCAxNjk0NDk4ODE1IDE5Mi4xNjguMC4yMyA1MTIwNSB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjIgMSB1ZHAgMTY3NzcyMTg1NSAxMC45NS4yMDQuNjEgNTI2NDYgdHlwIHNyZmx4IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZToxIDEgdWRwIDIxMTM5Mjk0NzEgMTAuOTUuMjA0LjYxIDUzNDI4IHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTowIDEgdWRwIDIxMzA3MDY0MzEgMTkyLjE2OC4wLjIzIDUwMTIzIHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPW1zaWQ6bXlLdnNWaWRlb1N0cmVhbSBteUF1ZGlvVHJhY2tcclxuYT1zc3JjOjE4OTEzODY4OTYgY25hbWU6QlA0bEVqdTBHK0VBQk0yS1xyXG5hPXNzcmM6MTg5MTM4Njg5NiBtc2lkOm15S3ZzVmlkZW9TdHJlYW0gbXlBdWRpb1RyYWNrXHJcbmE9c3NyYzoxODkxMzg2ODk2IG1zbGFiZWw6bXlLdnNWaWRlb1N0cmVhbVxyXG5hPXNzcmM6MTg5MTM4Njg5NiBsYWJlbDpteUF1ZGlvVHJhY2tcclxuYT1ydGNwOjkgSU4gSVA0IDAuMC4wLjBcclxuYT1pY2UtdWZyYWc6VVhwM1xyXG5hPWljZS1wd2Q6NGZZbTlEa1FQazl1YmRRQ2RyaFBhVFpnXHJcbmE9aWNlLW9wdGlvbnM6dHJpY2tsZVxyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjBcclxuYT1zZW5kcmVjdlxyXG5hPXJ0Y3AtbXV4XHJcbmE9cnRjcC1yc2l6ZVxyXG5hPXJ0cG1hcDoxMTEgb3B1cy80ODAwMC8yXHJcbmE9Zm10cDoxMTEgbWlucHRpbWU9MTA7dXNlaW5iYW5kZmVjPTFcclxuYT1ydGNwLWZiOjExMSBuYWNrXHJcbm09dmlkZW8gOSBVRFAvVExTL1JUUC9TQVZQRiAxMjVcclxuYz1JTiBJUDQgMTI3LjAuMC4xXHJcbmE9Y2FuZGlkYXRlOjUgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTo0IDEgdWRwIDE2Nzc3MjE1IDAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMCAwIHR5cCByZWxheSByYWRkciA6Oi8wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MyAxIHVkcCAxNjk0NDk4ODE1IDE5Mi4xNjguMC4yMyA1MTIwNSB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjIgMSB1ZHAgMTY3NzcyMTg1NSAxMC45NS4yMDQuNjEgNTI2NDYgdHlwIHNyZmx4IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZToxIDEgdWRwIDIxMTM5Mjk0NzEgMTAuOTUuMjA0LjYxIDUzNDI4IHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTowIDEgdWRwIDIxMzA3MDY0MzEgMTkyLjE2OC4wLjIzIDUwMTIzIHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPW1zaWQ6bXlLdnNWaWRlb1N0cmVhbSBteVZpZGVvVHJhY2tcclxuYT1zc3JjOjIxNDEwMjk1OTIgY25hbWU6QlA0bEVqdTBHK0VBQk0yS1xyXG5hPXNzcmM6MjE0MTAyOTU5MiBtc2lkOm15S3ZzVmlkZW9TdHJlYW0gbXlWaWRlb1RyYWNrXHJcbmE9c3NyYzoyMTQxMDI5NTkyIG1zbGFiZWw6bXlLdnNWaWRlb1N0cmVhbVxyXG5hPXNzcmM6MjE0MTAyOTU5MiBsYWJlbDpteVZpZGVvVHJhY2tcclxuYT1ydGNwOjkgSU4gSVA0IDAuMC4wLjBcclxuYT1pY2UtdWZyYWc6VVhwM1xyXG5hPWljZS1wd2Q6NGZZbTlEa1FQazl1YmRRQ2RyaFBhVFpnXHJcbmE9aWNlLW9wdGlvbnM6dHJpY2tsZVxyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjFcclxuYT1zZW5kcmVjdlxyXG5hPXJ0Y3AtbXV4XHJcbmE9cnRjcC1yc2l6ZVxyXG5hPXJ0cG1hcDoxMjUgSDI2NC85MDAwMFxyXG5hPWZtdHA6MTI1IGxldmVsLWFzeW1tZXRyeS1hbGxvd2VkPTE7cGFja2V0aXphdGlvbi1tb2RlPTE7cHJvZmlsZS1sZXZlbC1pZD00MmUwMWZcclxuYT1ydGNwLWZiOjEyNSBuYWNrXHJcbm09YXBwbGljYXRpb24gOSBVRFAvRFRMUy9TQ1RQIHdlYnJ0Yy1kYXRhY2hhbm5lbFxyXG5jPUlOIElQNCAxMjcuMC4wLjFcclxuYT1jYW5kaWRhdGU6NSAxIHVkcCAxNjc3NzIxNSAwMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDAgMCB0eXAgcmVsYXkgcmFkZHIgOjovMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjQgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTozIDEgdWRwIDE2OTQ0OTg4MTUgMTkyLjE2OC4wLjIzIDUxMjA1IHR5cCBzcmZseCByYWRkciAwLjAuMC4wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MiAxIHVkcCAxNjc3NzIxODU1IDEwLjk1LjIwNC42MSA1MjY0NiB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjEgMSB1ZHAgMjExMzkyOTQ3MSAxMC45NS4yMDQuNjEgNTM0MjggdHlwIGhvc3QgcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjAgMSB1ZHAgMjEzMDcwNjQzMSAxOTIuMTY4LjAuMjMgNTAxMjMgdHlwIGhvc3QgcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9cnRjcDo5IElOIElQNCAwLjAuMC4wXHJcbmE9aWNlLXVmcmFnOlVYcDNcclxuYT1pY2UtcHdkOjRmWW05RGtRUGs5dWJkUUNkcmhQYVRaZ1xyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjJcclxuYT1zY3RwLXBvcnQ6NTAwMFxyXG4ifQ==\",\n" - " \"IceServerList\": [{\n" - " \"Password\": \"ZEXx/a0G7reNO4SrDoK0zYoXZCamD+k/mIn6PEiuDTk=\",\n" - " \"Ttl\": 298,\n" - " \"Uris\": [\"turn:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=tcp\"],\n" - " \"Username\": \"1607424954:djE6YXJuOmF3czpraW5lc2lzdmlkZW86dXMtd2VzdC0yOjgzNjIwMzExNzk3MTpjaGFubmVsL1NjYXJ5VGVzdENoYW5uZWwvMTU5OTg1NjczODM5OA==\"\n" - " },\n" - " {\n" - " \"Password\": \"k5PFpnyKu+oLa3Y3QUIhi+NA3BONdSUevw7NAAy/Nms=\",\n" - " \"Ttl\": 298,\n" - " \"Uris\": [\"turn:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=tcp\"],\n" - " \"Username\": \"1607424954:djE6YXJuOmF3czpraW5lc2lzdmlkZW86dXMtd2VzdC0yOjgzNjIwMzExNzk3MTpjaGFubmVsL1NjYXJ5VGVzdENoYW5uZWwvMTU5OTg1NjczODM5OA==\"\n" - " }\n" - " ],\n" " \"statusResponse\": {\n" " \"correlationId\": \"CorrelationID\",\n" " \"errorType\": \"Unknown message\",\n" @@ -4263,20 +4133,8 @@ TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer_FastClockSkew_Veri } EXPECT_EQ(STATUS_SUCCESS, retStatus); EXPECT_EQ(STATUS_SUCCESS, signalingClientGetIceConfigInfo(signalingHandle, 0, &pIceConfigInfo)); - - // ICE should not have been called again as we updated it via a message - EXPECT_EQ(4, signalingStatesCounts[SIGNALING_CLIENT_STATE_GET_ICE_CONFIG]); - - // Validate the retrieved info - EXPECT_EQ(2, iceCount); - - for (i = 0; i < iceCount; i++) { - EXPECT_EQ(STATUS_SUCCESS, signalingClientGetIceConfigInfo(signalingHandle, i, &pIceConfigInfo)); - EXPECT_NE(0, pIceConfigInfo->uriCount); - EXPECT_EQ(298 * HUNDREDS_OF_NANOS_IN_A_SECOND, pIceConfigInfo->ttl); - EXPECT_EQ(SIGNALING_ICE_CONFIG_INFO_CURRENT_VERSION, pIceConfigInfo->version); - EXPECT_EQ(0, STRCMP("1607424954:djE6YXJuOmF3czpraW5lc2lzdmlkZW86dXMtd2VzdC0yOjgzNjIwMzExNzk3MTpjaGFubmVsL1NjYXJ5VGVzdENoYW5uZWwvMTU5OTg1NjczODM5OA==", pIceConfigInfo->userName)); - } + EXPECT_EQ(5, signalingStatesCounts[SIGNALING_CLIENT_STATE_GET_ICE_CONFIG]); + EXPECT_NE(0, iceCount); // // Set to invalid again to trigger an update. @@ -4289,19 +4147,6 @@ TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer_FastClockSkew_Veri " \"messageType\": \"SDP_ANSWER\",\n" " \"senderClientId\": \"ProducerMaster\",\n" " \"messagePayload\": \"eyJ0eXBlIjogIm9mZmVyIiwgInNkcCI6ICJ2PTBcclxubz0tIDIwNTE4OTcyNDggMiBJTiBJUDQgMTI3LjAuMC4xXHJcbnM9LVxyXG50PTAgMFxyXG5hPWdyb3VwOkJVTkRMRSAwIDEgMlxyXG5hPW1zaWQtc2VtYW50aWM6IFdNUyBteUt2c1ZpZGVvU3RyZWFtXHJcbm09YXVkaW8gOSBVRFAvVExTL1JUUC9TQVZQRiAxMTFcclxuYz1JTiBJUDQgMTI3LjAuMC4xXHJcbmE9Y2FuZGlkYXRlOjUgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTo0IDEgdWRwIDE2Nzc3MjE1IDAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMCAwIHR5cCByZWxheSByYWRkciA6Oi8wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MyAxIHVkcCAxNjk0NDk4ODE1IDE5Mi4xNjguMC4yMyA1MTIwNSB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjIgMSB1ZHAgMTY3NzcyMTg1NSAxMC45NS4yMDQuNjEgNTI2NDYgdHlwIHNyZmx4IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZToxIDEgdWRwIDIxMTM5Mjk0NzEgMTAuOTUuMjA0LjYxIDUzNDI4IHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTowIDEgdWRwIDIxMzA3MDY0MzEgMTkyLjE2OC4wLjIzIDUwMTIzIHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPW1zaWQ6bXlLdnNWaWRlb1N0cmVhbSBteUF1ZGlvVHJhY2tcclxuYT1zc3JjOjE4OTEzODY4OTYgY25hbWU6QlA0bEVqdTBHK0VBQk0yS1xyXG5hPXNzcmM6MTg5MTM4Njg5NiBtc2lkOm15S3ZzVmlkZW9TdHJlYW0gbXlBdWRpb1RyYWNrXHJcbmE9c3NyYzoxODkxMzg2ODk2IG1zbGFiZWw6bXlLdnNWaWRlb1N0cmVhbVxyXG5hPXNzcmM6MTg5MTM4Njg5NiBsYWJlbDpteUF1ZGlvVHJhY2tcclxuYT1ydGNwOjkgSU4gSVA0IDAuMC4wLjBcclxuYT1pY2UtdWZyYWc6VVhwM1xyXG5hPWljZS1wd2Q6NGZZbTlEa1FQazl1YmRRQ2RyaFBhVFpnXHJcbmE9aWNlLW9wdGlvbnM6dHJpY2tsZVxyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjBcclxuYT1zZW5kcmVjdlxyXG5hPXJ0Y3AtbXV4XHJcbmE9cnRjcC1yc2l6ZVxyXG5hPXJ0cG1hcDoxMTEgb3B1cy80ODAwMC8yXHJcbmE9Zm10cDoxMTEgbWlucHRpbWU9MTA7dXNlaW5iYW5kZmVjPTFcclxuYT1ydGNwLWZiOjExMSBuYWNrXHJcbm09dmlkZW8gOSBVRFAvVExTL1JUUC9TQVZQRiAxMjVcclxuYz1JTiBJUDQgMTI3LjAuMC4xXHJcbmE9Y2FuZGlkYXRlOjUgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTo0IDEgdWRwIDE2Nzc3MjE1IDAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMCAwIHR5cCByZWxheSByYWRkciA6Oi8wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MyAxIHVkcCAxNjk0NDk4ODE1IDE5Mi4xNjguMC4yMyA1MTIwNSB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjIgMSB1ZHAgMTY3NzcyMTg1NSAxMC45NS4yMDQuNjEgNTI2NDYgdHlwIHNyZmx4IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZToxIDEgdWRwIDIxMTM5Mjk0NzEgMTAuOTUuMjA0LjYxIDUzNDI4IHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTowIDEgdWRwIDIxMzA3MDY0MzEgMTkyLjE2OC4wLjIzIDUwMTIzIHR5cCBob3N0IHJhZGRyIDAuMC4wLjAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPW1zaWQ6bXlLdnNWaWRlb1N0cmVhbSBteVZpZGVvVHJhY2tcclxuYT1zc3JjOjIxNDEwMjk1OTIgY25hbWU6QlA0bEVqdTBHK0VBQk0yS1xyXG5hPXNzcmM6MjE0MTAyOTU5MiBtc2lkOm15S3ZzVmlkZW9TdHJlYW0gbXlWaWRlb1RyYWNrXHJcbmE9c3NyYzoyMTQxMDI5NTkyIG1zbGFiZWw6bXlLdnNWaWRlb1N0cmVhbVxyXG5hPXNzcmM6MjE0MTAyOTU5MiBsYWJlbDpteVZpZGVvVHJhY2tcclxuYT1ydGNwOjkgSU4gSVA0IDAuMC4wLjBcclxuYT1pY2UtdWZyYWc6VVhwM1xyXG5hPWljZS1wd2Q6NGZZbTlEa1FQazl1YmRRQ2RyaFBhVFpnXHJcbmE9aWNlLW9wdGlvbnM6dHJpY2tsZVxyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjFcclxuYT1zZW5kcmVjdlxyXG5hPXJ0Y3AtbXV4XHJcbmE9cnRjcC1yc2l6ZVxyXG5hPXJ0cG1hcDoxMjUgSDI2NC85MDAwMFxyXG5hPWZtdHA6MTI1IGxldmVsLWFzeW1tZXRyeS1hbGxvd2VkPTE7cGFja2V0aXphdGlvbi1tb2RlPTE7cHJvZmlsZS1sZXZlbC1pZD00MmUwMWZcclxuYT1ydGNwLWZiOjEyNSBuYWNrXHJcbm09YXBwbGljYXRpb24gOSBVRFAvRFRMUy9TQ1RQIHdlYnJ0Yy1kYXRhY2hhbm5lbFxyXG5jPUlOIElQNCAxMjcuMC4wLjFcclxuYT1jYW5kaWRhdGU6NSAxIHVkcCAxNjc3NzIxNSAwMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDAgMCB0eXAgcmVsYXkgcmFkZHIgOjovMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjQgMSB1ZHAgMTY3NzcyMTUgMDAwMDowMDAwOjAwMDA6MDAwMDowMDAwOjAwMDA6MDAwMDowMDAwIDAgdHlwIHJlbGF5IHJhZGRyIDo6LzAgcnBvcnQgMCBnZW5lcmF0aW9uIDAgbmV0d29yay1jb3N0IDk5OVxyXG5hPWNhbmRpZGF0ZTozIDEgdWRwIDE2OTQ0OTg4MTUgMTkyLjE2OC4wLjIzIDUxMjA1IHR5cCBzcmZseCByYWRkciAwLjAuMC4wIHJwb3J0IDAgZ2VuZXJhdGlvbiAwIG5ldHdvcmstY29zdCA5OTlcclxuYT1jYW5kaWRhdGU6MiAxIHVkcCAxNjc3NzIxODU1IDEwLjk1LjIwNC42MSA1MjY0NiB0eXAgc3JmbHggcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjEgMSB1ZHAgMjExMzkyOTQ3MSAxMC45NS4yMDQuNjEgNTM0MjggdHlwIGhvc3QgcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9Y2FuZGlkYXRlOjAgMSB1ZHAgMjEzMDcwNjQzMSAxOTIuMTY4LjAuMjMgNTAxMjMgdHlwIGhvc3QgcmFkZHIgMC4wLjAuMCBycG9ydCAwIGdlbmVyYXRpb24gMCBuZXR3b3JrLWNvc3QgOTk5XHJcbmE9cnRjcDo5IElOIElQNCAwLjAuMC4wXHJcbmE9aWNlLXVmcmFnOlVYcDNcclxuYT1pY2UtcHdkOjRmWW05RGtRUGs5dWJkUUNkcmhQYVRaZ1xyXG5hPWZpbmdlcnByaW50OnNoYS0yNTYgQkQ6RTk6QkI6RTE6ODE6NzQ6MDU6RkQ6Mzc6QUI6MzU6MTU6OTE6NTQ6ODc6RDU6NDI6QkU6RjQ6RjE6MUQ6NjA6OEI6REQ6NEQ6RUM6QzM6NDQ6RkU6OTc6ODg6MjBcclxuYT1zZXR1cDphY3RwYXNzXHJcbmE9bWlkOjJcclxuYT1zY3RwLXBvcnQ6NTAwMFxyXG4ifQ==\",\n" - " \"IceServerList\": [{\n" - " \"Password\": \"ZEXx/a0G7reNO4SrDoK0zYoXZCamD+k/mIn6PEiuDTk=\",\n" - " \"Ttl\": 298,\n" - " \"Uris\": [\"turn:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:18-236-143-60.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=tcp\"],\n" - " \"Username\": \"1607424954:djE6YXJuOmF3czpraW5lc2lzdmlkZW86dXMtd2VzdC0yOjgzNjIwMzExNzk3MTpjaGFubmVsL1NjYXJ5VGVzdENoYW5uZWwvMTU5OTg1NjczODM5OA==\"\n" - " },\n" - " {\n" - " \"Password\": \"k5PFpnyKu+oLa3Y3QUIhi+NA3BONdSUevw7NAAy/Nms=\",\n" - " \"Ttl\": 298,\n" - " \"Uris\": [\"turn:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=udp\", \"turns:52-25-38-73.t-4f692171.kinesisvideo.us-west-2.amazonaws.com:443?transport=tcp\"],\n" - " \"Username\": \"1607424954:djE6YXJuOmF3czpraW5lc2lzdmlkZW86dXMtd2VzdC0yOjgzNjIwMzExNzk3MTpjaGFubmVsL1NjYXJ5VGVzdENoYW5uZWwvMTU5OTg1NjczODM5OA==\"\n" - " }\n" - " ],\n" " \"statusResponse\": {\n" " \"correlationId\": \"CorrelationID\",\n" " \"errorType\": \"Unknown message\",\n" @@ -4314,9 +4159,8 @@ TEST_F(SignalingApiFunctionalityTest, receivingIceConfigOffer_FastClockSkew_Veri EXPECT_EQ(STATUS_SUCCESS, signalingClientGetIceConfigInfoCount(signalingHandle, &iceCount)); EXPECT_EQ(STATUS_SUCCESS, signalingClientGetIceConfigInfo(signalingHandle, 0, &pIceConfigInfo)); - - // ICE should have been called again as we couldn't have updated via the message - EXPECT_EQ(5, signalingStatesCounts[SIGNALING_CLIENT_STATE_GET_ICE_CONFIG]); + EXPECT_EQ(6, signalingStatesCounts[SIGNALING_CLIENT_STATE_GET_ICE_CONFIG]); + EXPECT_NE(0, iceCount); // Check that we are connected and can send a message SignalingMessage signalingMessage; diff --git a/tst/SignalingApiTest.cpp b/tst/SignalingApiTest.cpp index 9254485eb8..543ca52725 100644 --- a/tst/SignalingApiTest.cpp +++ b/tst/SignalingApiTest.cpp @@ -22,6 +22,7 @@ TEST_F(SignalingApiTest, invalidRoleType_deserializeSignalingCacheEntries) CHAR testHttpsEndpoint[MAX_SIGNALING_ENDPOINT_URI_LEN + 1] = {0}; CHAR testWebrtcEndpoint[MAX_SIGNALING_ENDPOINT_URI_LEN + 1] = {0}; CHAR testRegion[MAX_REGION_NAME_LEN + 1] = {0}; + CHAR testRole[MAX_ROLE_ALIAS_LEN + 1] = {0}; CHAR testChannelArn[MAX_ARN_LEN + 1] = {0}; CHAR testChannel[MAX_CHANNEL_NAME_LEN + 1] = {0}; UINT64 time = GETTIME() / HUNDREDS_OF_NANOS_IN_A_SECOND; @@ -34,6 +35,7 @@ TEST_F(SignalingApiTest, invalidRoleType_deserializeSignalingCacheEntries) MEMSET(testWssEndpoint, 0, MAX_SIGNALING_ENDPOINT_URI_LEN+1); MEMSET(testHttpsEndpoint, 0, MAX_SIGNALING_ENDPOINT_URI_LEN+1); MEMSET(testRegion, 0, MAX_REGION_NAME_LEN + 1); + MEMSET(testRole, 0, MAX_ROLE_ALIAS_LEN + 1); MEMSET(testChannelArn, 0, MAX_ARN_LEN+1); MEMSET(testChannel, 0, MAX_CHANNEL_NAME_LEN+1); @@ -41,12 +43,13 @@ TEST_F(SignalingApiTest, invalidRoleType_deserializeSignalingCacheEntries) SNPRINTF(testWssEndpoint, SIZEOF(testWssEndpoint), "%s%d", "testWssEndpoint", append); SNPRINTF(testHttpsEndpoint, SIZEOF(testHttpsEndpoint),"%s%d", "testHttpsEndpoint", append); SNPRINTF(testRegion, SIZEOF(testRegion),"%s%d", "testRegion", append); + SNPRINTF(testRole, SIZEOF(testRole),"%s%d", "testRole", append); SNPRINTF(testChannelArn, SIZEOF(testChannelArn),"%s%d", "testChannelArn", append); SNPRINTF(testChannel, SIZEOF(testChannel),"%s%d", "testChannel", append); EXPECT_EQ(STATUS_SUCCESS, createFileIfNotExist(DEFAULT_CACHE_FILE_PATH)); - serializedCacheEntryLen = SNPRINTF(serializedCacheEntry, ARRAY_SIZE(serializedCacheEntry), "%s,%s,%s,%s,%s,%s,%s,%s,%s,%.10" PRIu64 "\n", testChannelArn, SIGNALING_CHANNEL_ROLE_TYPE_UNKNOWN_STR, + serializedCacheEntryLen = SNPRINTF(serializedCacheEntry, ARRAY_SIZE(serializedCacheEntry), "%s,%s,%s,%s,%s,%s,%s,%s,%s,%.10" PRIu64 "\n", testChannelArn, testRole, testRegion, testChannelArn, testHttpsEndpoint, testWssEndpoint, "0", testChannelArn, testWebrtcEndpoint, time); EXPECT_EQ(writeFile(DEFAULT_CACHE_FILE_PATH, FALSE, TRUE, (PBYTE) serializedCacheEntry, serializedCacheEntryLen), STATUS_SUCCESS); @@ -745,21 +748,6 @@ TEST_F(SignalingApiTest, signalingClientCreateWithClientInfoVariations) THREAD_SLEEP(100 * HUNDREDS_OF_NANOS_IN_A_MILLISECOND); } -TEST_F(SignalingApiTest, getChannelRoleTypeFromStringApi) -{ - EXPECT_EQ(getChannelRoleTypeFromString(SIGNALING_CHANNEL_ROLE_TYPE_MASTER_STR, STRLEN(SIGNALING_CHANNEL_ROLE_TYPE_MASTER_STR)), SIGNALING_CHANNEL_ROLE_TYPE_MASTER); - EXPECT_EQ(getChannelRoleTypeFromString(SIGNALING_CHANNEL_ROLE_TYPE_VIEWER_STR, STRLEN(SIGNALING_CHANNEL_ROLE_TYPE_VIEWER_STR)), SIGNALING_CHANNEL_ROLE_TYPE_VIEWER); - EXPECT_EQ(getChannelRoleTypeFromString(SIGNALING_CHANNEL_ROLE_TYPE_UNKNOWN_STR, STRLEN(SIGNALING_CHANNEL_ROLE_TYPE_UNKNOWN_STR)), SIGNALING_CHANNEL_ROLE_TYPE_UNKNOWN); - EXPECT_EQ(getChannelRoleTypeFromString((PCHAR) "test", STRLEN("test")), SIGNALING_CHANNEL_ROLE_TYPE_UNKNOWN); -} - -TEST_F(SignalingApiTest, getStringFromChannelRoleTypeApi) -{ - EXPECT_STREQ(getStringFromChannelRoleType(SIGNALING_CHANNEL_ROLE_TYPE_MASTER), SIGNALING_CHANNEL_ROLE_TYPE_MASTER_STR); - EXPECT_STREQ(getStringFromChannelRoleType(SIGNALING_CHANNEL_ROLE_TYPE_VIEWER), SIGNALING_CHANNEL_ROLE_TYPE_VIEWER_STR); - EXPECT_STREQ(getStringFromChannelRoleType(SIGNALING_CHANNEL_ROLE_TYPE_UNKNOWN), SIGNALING_CHANNEL_ROLE_TYPE_UNKNOWN_STR); -} - TEST_F(SignalingApiTest, getChannelStatusFromStringApi) { EXPECT_EQ(getChannelStatusFromString((PCHAR) "ACTIVE", STRLEN("ACTIVE")), SIGNALING_CHANNEL_STATUS_ACTIVE); @@ -802,25 +790,6 @@ TEST_F(SignalingApiTest, getMessageTypeInStringApiTest) EXPECT_STREQ(getMessageTypeInString((SIGNALING_MESSAGE_TYPE) 10), SIGNALING_MESSAGE_UNKNOWN); } -TEST_F(SignalingApiTest, getMessageTypeFromStringApiTest) -{ - SIGNALING_MESSAGE_TYPE messageType; - EXPECT_EQ(getMessageTypeFromString((PCHAR) SIGNALING_SDP_TYPE_OFFER, 0, &messageType), STATUS_SUCCESS); - EXPECT_EQ(messageType, SIGNALING_MESSAGE_TYPE_OFFER); - EXPECT_EQ(getMessageTypeFromString((PCHAR) SIGNALING_SDP_TYPE_ANSWER, STRLEN(SIGNALING_SDP_TYPE_ANSWER), &messageType), STATUS_SUCCESS); - EXPECT_EQ(messageType, SIGNALING_MESSAGE_TYPE_ANSWER); - EXPECT_EQ(getMessageTypeFromString((PCHAR) SIGNALING_ICE_CANDIDATE, 0, &messageType), STATUS_SUCCESS); - EXPECT_EQ(messageType, SIGNALING_MESSAGE_TYPE_ICE_CANDIDATE); - EXPECT_EQ(getMessageTypeFromString((PCHAR) SIGNALING_GO_AWAY, 0, &messageType), STATUS_SUCCESS); - EXPECT_EQ(messageType, SIGNALING_MESSAGE_TYPE_GO_AWAY); - EXPECT_EQ(getMessageTypeFromString((PCHAR) SIGNALING_RECONNECT_ICE_SERVER, 0, &messageType), STATUS_SUCCESS); - EXPECT_EQ(messageType, SIGNALING_MESSAGE_TYPE_RECONNECT_ICE_SERVER); - EXPECT_EQ(getMessageTypeFromString((PCHAR) SIGNALING_STATUS_RESPONSE, 0, &messageType), STATUS_SUCCESS); - EXPECT_EQ(messageType, SIGNALING_MESSAGE_TYPE_STATUS_RESPONSE); - EXPECT_EQ(getMessageTypeFromString((PCHAR) "test", 0, &messageType), STATUS_SUCCESS); - EXPECT_EQ(messageType, SIGNALING_MESSAGE_TYPE_UNKNOWN); -} - TEST_F(SignalingApiTest, getStringFromChannelTypeApiTest) { EXPECT_STREQ(getStringFromChannelType(SIGNALING_CHANNEL_TYPE_SINGLE_MASTER), SIGNALING_CHANNEL_TYPE_SINGLE_MASTER_STR);