Files
2021-11-11 09:41:49 +08:00

2821 lines
108 KiB
C

/*
* FreeRTOS V202107.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* https://www.FreeRTOS.org
* https://github.com/FreeRTOS
*
*/
/* stdlib includes. */
#include "string.h"
#include "stdio.h"
/* Cellular include. */
#include "cellular_config.h"
#include "cellular_config_defaults.h"
#include "cellular_platform.h"
#include "cellular_api.h"
#include "cellular_types.h"
#include "cellular_comm_interface.h"
/* Testing variable includes. */
#include "test_config.h"
/* Unity framework includes. */
#include "unity_fixture.h"
/*-----------------------------------------------------------*/
/* Testing configurations definitions. */
/* Retry until SIM is ready. */
#ifndef CELLULAR_MAX_SIM_RETRY
#define CELLULAR_MAX_SIM_RETRY ( 5U )
#endif
/*
* 2 GSM
* 3 UTRAN
* 4 LTE Cat M1
* 5 LTE Cat NB1
*/
#ifndef testCELLULAR_EDRX_RAT
#define testCELLULAR_EDRX_RAT ( 4 )
#endif
#ifndef testCELLULAR_SOCKET_CONNECTION_TIMEOUT_MS
#define testCELLULAR_SOCKET_CONNECTION_TIMEOUT_MS ( 150000U )
#endif
#ifndef testCELLULAR_SOCKET_SEND_TIMEOUT_MS
#define testCELLULAR_SOCKET_SEND_TIMEOUT_MS ( 60000U )
#endif
#ifndef testCELLULAR_SOCKET_CLOSE_TIMEOUT_MS
#define testCELLULAR_SOCKET_CLOSE_TIMEOUT_MS ( 60000U )
#endif
#ifndef testCELLULAR_SOCKET_RECEIVE_TIMEOUT_MS
#define testCELLULAR_SOCKET_RECEIVE_TIMEOUT_MS ( 5000U )
#endif
#ifndef testCELLULAR_MAX_NETWORK_REGISTER_RETRY
#define testCELLULAR_MAX_NETWORK_REGISTER_RETRY ( 40U )
#endif
#ifndef testCELLULAR_NETWORK_REGISTER_RETRY_INTERVAL_MS
#define testCELLULAR_NETWORK_REGISTER_RETRY_INTERVAL_MS ( 500U )
#endif
/* Retry until SIM is ready. */
#ifndef testCELLULAR_MAX_SIM_RETRY
#define testCELLULAR_MAX_SIM_RETRY ( 5U )
#endif
#ifndef testCELLULAR_SIM_RETRY_INTERVAL_MS
#define testCELLULAR_SIM_RETRY_INTERVAL_MS ( 500U )
#endif
#ifndef testCELLULAR_MAX_GET_PSM_RETRY
#define testCELLULAR_MAX_GET_PSM_RETRY ( 5U )
#endif
#ifndef testCELLULAR_GET_PSM_RETRY_INTERVAL_MS
#define testCELLULAR_GET_PSM_RETRY_INTERVAL_MS ( 500U )
#endif
#ifndef testCELLULAR_SOCKET_WAIT_INTERVAL_MS
#define testCELLULAR_SOCKET_WAIT_INTERVAL_MS ( 2000UL )
#endif
#ifndef testCELLULAR_GET_RAT_RETRY
#define testCELLULAR_GET_RAT_RETRY ( 5UL )
#endif
#ifndef testCELLULAR_GET_RAT_RETRY_INTERVAL_MS
#define testCELLULAR_GET_RAT_RETRY_INTERVAL_MS ( 200U )
#endif
#ifndef testCELLULAR_WAIT_PSM_ENTER_EVENT_RETRY
#define testCELLULAR_WAIT_PSM_ENTER_EVENT_RETRY ( 2U )
#endif
#ifndef testCELLULAR_MAX_PDN_STATSU_NUM
#define testCELLULAR_MAX_PDN_STATSU_NUM ( CELLULAR_PDN_CONTEXT_ID_MAX - CELLULAR_PDN_CONTEXT_ID_MIN + 1U )
#endif
/* Custom CELLULAR Test asserts. */
#define TEST_CELLULAR_ASSERT_REQUIRED_API( condition, result ) \
if( result == CELLULAR_UNSUPPORTED ) \
{ \
TEST_FAIL_MESSAGE( "Required CELLULAR API is not implemented." ); \
} \
else \
{ \
TEST_ASSERT( condition ); \
}
#define TEST_CELLULAR_ASSERT_REQUIRED_API_MSG( condition, result, message ) \
if( result == CELLULAR_UNSUPPORTED ) \
{ \
TEST_FAIL_MESSAGE( "Required CELLULAR API is not implemented." ); \
} \
else \
{ \
TEST_ASSERT_MESSAGE( condition, message ); \
}
#define TEST_CELLULAR_ASSERT_OPTIONAL_API( condition, result ) \
if( result == CELLULAR_UNSUPPORTED ) \
{ \
TEST_ASSERT( 1 ); \
} \
else \
{ \
TEST_ASSERT( condition ); \
}
#define TEST_CELLULAR_ASSERT_OPTIONAL_API_MSG( condition, result, message ) \
if( result == CELLULAR_UNSUPPORTED ) \
{ \
TEST_ASSERT( 1 ); \
} \
else \
{ \
TEST_ASSERT_MESSAGE( condition, message ); \
}
#define TEST_INVALID_CELLULAR_APN "VZWINTERNETVZWINTERNETVZWINTERNETVZWINTERNETVZWINTERNETVZWINTERN"
#define SOCKET_DATA_RECEIVED_CALLBACK_BIT ( 0x00000001U )
#define SOCKET_OPEN_CALLBACK_BIT ( 0x00000002U )
#define SOCKET_OPEN_FAILED_CALLBACK_BIT ( 0x00000004U )
#define SOCKET_CLOSED_CALLBACK_BIT ( 0x00000008U )
#define ECHO_SERVER_DATA_SEND_INTERVAL_MS ( 30000UL )
#define MODEM_EVENT_BOOTUP_OR_REBOOT_BIT ( 0x00000001U )
#define MODEM_EVENT_POWERED_DOWN_BIT ( 0x00000002U )
#define MODEM_EVENT_PSM_ENTER_BIT ( 0x00000004U )
#define SOCKET_OPEN_STATUS_UNKNOWN ( 0U )
#define SOCKET_OPEN_STATUS_OPENED ( 1U )
#define SOCKET_OPEN_STATUS_FAILED ( 2U )
#define SOCKET_OPERATION_POLLING_TIMES ( 4U )
#define MESSAGE_BUFFER_LENGTH ( 256U )
/* APN for the test network. */
#define testCELLULAR_APN CELLULAR_APN
/* PDN context id for cellular network. */
#define testCELLULAR_PDN_CONTEXT_ID ( CELLULAR_PDN_CONTEXT_ID )
/* The number of times to loop in the CELLULARConnectionLoop test. */
#define testCELLULARCONNECTION_LOOP_TIMES ( CELLULAR_NUM_SOCKET_MAX + 3U )
#define testCELLULARDATA_TRANSFER_LOOP_TIMES ( 10U )
/* RAT priority count for testing. This value should larger or equal to
* CELLULAR_MAX_RAT_PRIORITY_COUNT. */
#define TEST_MAX_RAT_PRIORITY_COUNT ( 3U )
#if CELLULAR_MAX_RAT_PRIORITY_COUNT > TEST_MAX_RAT_PRIORITY_COUNT
#error "TEST_MAX_RAT_PRIORITY_COUNT should not larger or equal to CELLULAR_MAX_RAT_PRIORITY_COUNT"
#endif
#ifndef testCELLULAR_DNS_SERVER_ADDRESS
#error "testCELLULAR_DNS_SERVER_ADDRESS is not defined"
#endif
#ifndef testCELLULAR_HOST_NAME
#error "testCELLULAR_HOST_NAME is not defined"
#endif
#ifndef testCELLULAR_HOST_NAME_ADDRESS
#error "testCELLULAR_HOST_NAME_ADDRESS is not defined"
#endif
#ifndef testCELLULAR_ECHO_SERVER_ADDRESS
#error "testCELLULAR_ECHO_SERVER_ADDRESS is not defined"
#endif
#ifndef testCELLULAR_ECHO_SERVER_PORT
#error "testCELLULAR_ECHO_SERVER_PORT is not defined"
#endif
#ifndef testCELLULAR_EDRX_ECHO_SERVER_ADDRESS
#error "testCELLULAR_EDRX_ECHO_SERVER_ADDRESS is not defined"
#endif
#ifndef testCELLULAR_EDRX_ECHO_SERVER_PORT
#error "testCELLULAR_EDRX_ECHO_SERVER_PORT is not defined"
#endif
#ifndef testCELLULAR_EDRX_ECHO_SERVER_DATA_SEND_INTERVAL_MS
#error "testCELLULAR_EDRX_ECHO_SERVER_DATA_SEND_INTERVAL_MS is not defined"
#endif
/*-----------------------------------------------------------*/
/**
* @brief the default Cellular comm interface in system.
*/
extern CellularCommInterface_t CellularCommInterface;
/*-----------------------------------------------------------*/
/* Test state variables. */
static uint8_t _dataReady = 0;
static CellularHandle_t _cellularHandle = NULL;
static bool _genericUrcCalled = false;
static PlatformEventGroupHandle_t _socketEventGroup = NULL;
static PlatformEventGroupHandle_t _modemEventGroup = NULL;
/* The callback context to check. */
static void * _socketDataReadyContext = NULL;
static void * _socketOpenContext = NULL;
static void * _socketClosedContext = NULL;
/* Socket data send pattern. */
static const char _socketDataSend[] = "hello from SJC31";
/*-----------------------------------------------------------*/
/* Network registration callback function. */
static void prvNetworkRegistrationCallback( CellularUrcEvent_t urcEvent,
const CellularServiceStatus_t * pServiceStatus,
void * pCallbackContext )
{
TEST_ASSERT( pCallbackContext == _cellularHandle );
if( pServiceStatus != NULL )
{
if( ( urcEvent == CELLULAR_URC_EVENT_NETWORK_CS_REGISTRATION ) ||
( urcEvent == CELLULAR_URC_EVENT_NETWORK_PS_REGISTRATION ) )
{
configPRINTF( ( "Network CS registration status received: %d. \r\n", pServiceStatus->csRegistrationStatus ) );
configPRINTF( ( "Network PS registration status received: %d. \r\n", pServiceStatus->psRegistrationStatus ) );
}
}
}
/*-----------------------------------------------------------*/
/* Signal strength changed callback function. */
static void prvSignalStrengthChangedCallback( CellularUrcEvent_t urcEvent,
const CellularSignalInfo_t * pSignalInfo,
void * pCallbackContext )
{
TEST_ASSERT( pCallbackContext == _cellularHandle );
if( ( pSignalInfo != NULL ) && ( urcEvent == CELLULAR_URC_EVENT_SIGNAL_CHANGED ) )
{
if( pSignalInfo->rssi != CELLULAR_INVALID_SIGNAL_VALUE )
{
configPRINTF( ( "RSSI received: %d. \r\n", pSignalInfo->rssi ) );
}
else
{
configPRINTF( ( "RSSI received: UNKNOWN. \r\n" ) );
}
if( pSignalInfo->rsrp != CELLULAR_INVALID_SIGNAL_VALUE )
{
configPRINTF( ( "RSRP received: %d. \r\n", pSignalInfo->rsrp ) );
}
else
{
configPRINTF( ( "RSRP received: UNKNOWN. \r\n" ) );
}
if( pSignalInfo->rsrq != CELLULAR_INVALID_SIGNAL_VALUE )
{
configPRINTF( ( "RSRQ received: %d. \r\n", pSignalInfo->rsrq ) );
}
else
{
configPRINTF( ( "RSRQ received: UNKNOWN. \r\n" ) );
}
if( pSignalInfo->ber != CELLULAR_INVALID_SIGNAL_VALUE )
{
configPRINTF( ( "BER received: %d. \r\n", pSignalInfo->ber ) );
}
else
{
configPRINTF( ( "BER received: UNKNOWN. \r\n" ) );
}
if( pSignalInfo->bars != CELLULAR_INVALID_SIGNAL_BAR_VALUE )
{
configPRINTF( ( "BARS received: %u. \r\n", pSignalInfo->bars ) );
}
else
{
configPRINTF( ( "BARS received: UNKNOWN. \r\n" ) );
}
}
}
/*-----------------------------------------------------------*/
/* Generic callback function to test Cellular_RegisterUrcGenericCallback API. */
static void prvGenericCallback( const char * pRawData,
void * pCallbackContext )
{
TEST_ASSERT( pCallbackContext == _cellularHandle );
configPRINTF( ( "prvGenericCallback : %s \r\n", pRawData ) );
_genericUrcCalled = true;
}
/*-----------------------------------------------------------*/
/* PDN event callback function. */
static void prvPdnEventCallback( CellularUrcEvent_t urcEvent,
uint8_t contextId,
void * pCallbackContext )
{
TEST_ASSERT( pCallbackContext == _cellularHandle );
if( contextId == testCELLULAR_PDN_CONTEXT_ID )
{
if( ( urcEvent == CELLULAR_URC_EVENT_PDN_ACTIVATED ) || ( urcEvent == CELLULAR_URC_EVENT_PDN_DEACTIVATED ) )
{
configPRINTF( ( "PDP Status changed. context ID %u event %d\r\n", contextId, urcEvent ) );
}
}
}
/*-----------------------------------------------------------*/
/* Callback functions for testing. */
static void prvCellularSocketDataReadyCallback( CellularSocketHandle_t socketHandle,
void * pCallbackContext )
{
PlatformEventGroupHandle_t eventGroupHandle = ( PlatformEventGroupHandle_t ) pCallbackContext;
TEST_ASSERT( socketHandle != NULL );
configPRINTF( ( "Data Ready on Socket \r\n" ) );
_dataReady = 1;
if( eventGroupHandle != NULL )
{
( void ) PlatformEventGroup_SetBits( eventGroupHandle, SOCKET_DATA_RECEIVED_CALLBACK_BIT );
}
_socketDataReadyContext = pCallbackContext;
}
/*-----------------------------------------------------------*/
/* Socket close event callback function. */
static void prvSocketClosedCallback( CellularSocketHandle_t socketHandle,
void * pCallbackContext )
{
PlatformEventGroupHandle_t eventGroupHandle = ( PlatformEventGroupHandle_t ) pCallbackContext;
TEST_ASSERT( socketHandle != NULL );
configPRINTF( ( "Socket is closed. \r\n" ) );
if( eventGroupHandle != NULL )
{
( void ) PlatformEventGroup_SetBits( eventGroupHandle, SOCKET_CLOSED_CALLBACK_BIT );
}
_socketClosedContext = pCallbackContext;
}
/*-----------------------------------------------------------*/
/* Socket open event callback function. */
static void prvCellularSocketOpenCallback( CellularUrcEvent_t urcEvent,
CellularSocketHandle_t socketHandle,
void * pCallbackContext )
{
PlatformEventGroupHandle_t eventGroupHandle = ( PlatformEventGroupHandle_t ) pCallbackContext;
TEST_ASSERT( socketHandle != NULL );
if( eventGroupHandle != NULL )
{
if( urcEvent == CELLULAR_URC_SOCKET_OPENED )
{
configPRINTF( ( "Socket open callback, Success\r\n" ) );
( void ) PlatformEventGroup_SetBits( eventGroupHandle, SOCKET_OPEN_CALLBACK_BIT );
}
else
{
configPRINTF( ( "Socket open callback, Failure\r\n" ) );
( void ) PlatformEventGroup_SetBits( eventGroupHandle, SOCKET_OPEN_FAILED_CALLBACK_BIT );
}
}
_socketOpenContext = pCallbackContext;
}
/*-----------------------------------------------------------*/
/* Modem event callback function. */
static void prvCellularModemEventCallback( CellularModemEvent_t modemEvent,
void * pCallbackContext )
{
( void ) pCallbackContext;
if( _modemEventGroup != NULL )
{
switch( modemEvent )
{
case CELLULAR_MODEM_EVENT_BOOTUP_OR_REBOOT:
( void ) PlatformEventGroup_SetBits( _modemEventGroup, MODEM_EVENT_BOOTUP_OR_REBOOT_BIT );
break;
case CELLULAR_MODEM_EVENT_POWERED_DOWN:
( void ) PlatformEventGroup_SetBits( _modemEventGroup, MODEM_EVENT_POWERED_DOWN_BIT );
break;
case CELLULAR_MODEM_EVENT_PSM_ENTER:
( void ) PlatformEventGroup_SetBits( _modemEventGroup, MODEM_EVENT_PSM_ENTER_BIT );
break;
default:
break;
}
}
}
/*-----------------------------------------------------------*/
/* Helper function to check sim card ready. */
static bool prvWaitSimCardReady( void )
{
bool simReady = false;
uint32_t tries = 0;
CellularSimCardStatus_t simStatus = { 0 };
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
for( tries = 0; tries < testCELLULAR_MAX_SIM_RETRY; tries++ )
{
xCellularStatus = Cellular_GetSimCardStatus( _cellularHandle, &simStatus );
if( ( CELLULAR_SUCCESS == xCellularStatus ) &&
( simStatus.simCardState == CELLULAR_SIM_CARD_INSERTED ) &&
( simStatus.simCardLockState == CELLULAR_SIM_CARD_READY ) )
{
simReady = true;
break;
}
Platform_Delay( testCELLULAR_SIM_RETRY_INTERVAL_MS );
}
return simReady;
}
/*-----------------------------------------------------------*/
/**
* @brief Connect to the CELLULAR and verify success.
*/
static BaseType_t prvConnectCellular( void )
{
BaseType_t xResult = pdPASS;
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
CellularServiceStatus_t serviceStatus = { 0 };
CellularCommInterface_t * pCommIntf = &CellularCommInterface;
CellularPdnConfig_t pdnConfig = { CELLULAR_PDN_CONTEXT_IPV4, CELLULAR_PDN_AUTH_NONE, testCELLULAR_APN, "", "" };
CellularPdnStatus_t PdnStatusBuffers[ testCELLULAR_MAX_PDN_STATSU_NUM ] = { 0 };
char localIP[ CELLULAR_IP_ADDRESS_MAX_SIZE ] = { '\0' };
uint32_t timeoutCount = 0;
uint8_t NumStatus = 0;
bool simReady = false;
CellularPsmSettings_t psmSettings = { 0 };
CellularEidrxSettings_t eidrxSettings = { 0 };
uint32_t i = 0;
/* Clean up the cellular handle before init. */
if( _cellularHandle != NULL )
{
( void ) Cellular_Cleanup( _cellularHandle );
_cellularHandle = NULL;
}
/* Initialize Cellular Comm Interface. */
xCellularStatus = Cellular_Init( &_cellularHandle, pCommIntf );
if( xCellularStatus != CELLULAR_SUCCESS )
{
configPRINTF( ( ">>> Cellular module can't initialized <<<\r\n" ) );
xResult = pdFAIL;
}
else
{
xResult = pdPASS;
}
if( ( xCellularStatus == CELLULAR_SUCCESS ) && ( xResult == pdPASS ) )
{
/* Wait until SIM is ready. */
simReady = prvWaitSimCardReady();
if( simReady == false )
{
xResult = pdFAIL;
}
}
if( ( xCellularStatus == CELLULAR_SUCCESS ) && ( xResult == pdPASS ) )
{
/* Setup PDN for EPS Network Registration. */
xCellularStatus = Cellular_SetPdnConfig( _cellularHandle, testCELLULAR_PDN_CONTEXT_ID, &pdnConfig );
if( xCellularStatus == CELLULAR_SUCCESS )
{
xResult = pdPASS;
}
else
{
xResult = pdFAIL;
}
}
/* Rescan network. */
if( xCellularStatus == CELLULAR_SUCCESS )
{
( void ) Cellular_RfOff( _cellularHandle );
xCellularStatus = Cellular_RfOn( _cellularHandle );
}
if( ( xCellularStatus == CELLULAR_SUCCESS ) && ( xResult == pdPASS ) )
{
/* Check network register status. */
xResult = pdFAIL;
for( timeoutCount = 0; timeoutCount < testCELLULAR_MAX_NETWORK_REGISTER_RETRY; timeoutCount++ )
{
xCellularStatus = Cellular_GetServiceStatus( _cellularHandle, &serviceStatus );
if( ( xCellularStatus == CELLULAR_SUCCESS ) &&
( ( serviceStatus.psRegistrationStatus == REGISTRATION_STATUS_REGISTERED_HOME ) ||
( serviceStatus.psRegistrationStatus == REGISTRATION_STATUS_ROAMING_REGISTERED ) ) )
{
xResult = pdPASS;
break;
}
Platform_Delay( testCELLULAR_NETWORK_REGISTER_RETRY_INTERVAL_MS );
}
if( xResult == pdFAIL )
{
configPRINTF( ( ">>> Cellular module can't be registered <<<\r\n" ) );
}
}
/* Disable PSM and EIDRX. */
if( ( xCellularStatus == CELLULAR_SUCCESS ) && ( xResult == pdPASS ) )
{
psmSettings.mode = 0;
psmSettings.periodicTauValue = 0;
psmSettings.periodicRauValue = 0;
psmSettings.gprsReadyTimer = 0;
psmSettings.activeTimeValue = 0;
xCellularStatus = Cellular_SetPsmSettings( _cellularHandle, &psmSettings );
}
/* Disable the EDRX mode. */
if( ( xCellularStatus == CELLULAR_SUCCESS ) && ( xResult == pdPASS ) )
{
eidrxSettings.mode = 0;
eidrxSettings.rat = testCELLULAR_EDRX_RAT;
eidrxSettings.requestedEdrxVaue = 0;
xCellularStatus = Cellular_SetEidrxSettings( _cellularHandle, &eidrxSettings );
}
if( ( xCellularStatus == CELLULAR_SUCCESS ) && ( xResult == pdPASS ) )
{
xCellularStatus = Cellular_RegisterUrcNetworkRegistrationEventCallback( _cellularHandle, &prvNetworkRegistrationCallback, _cellularHandle );
if( xCellularStatus == CELLULAR_SUCCESS )
{
xCellularStatus = Cellular_RegisterUrcPdnEventCallback( _cellularHandle, &prvPdnEventCallback, _cellularHandle );
}
if( xCellularStatus == CELLULAR_SUCCESS )
{
xCellularStatus = Cellular_SetPdnConfig( _cellularHandle, testCELLULAR_PDN_CONTEXT_ID, &pdnConfig );
}
if( xCellularStatus == CELLULAR_SUCCESS )
{
xCellularStatus = Cellular_ActivatePdn( _cellularHandle, testCELLULAR_PDN_CONTEXT_ID );
}
if( xCellularStatus == CELLULAR_SUCCESS )
{
xCellularStatus = Cellular_GetIPAddress( _cellularHandle, testCELLULAR_PDN_CONTEXT_ID, localIP, sizeof( localIP ) );
}
if( xCellularStatus == CELLULAR_SUCCESS )
{
xCellularStatus = Cellular_GetPdnStatus( _cellularHandle, PdnStatusBuffers, testCELLULAR_MAX_PDN_STATSU_NUM, &NumStatus );
}
if( xCellularStatus == CELLULAR_SUCCESS )
{
xCellularStatus = Cellular_SetDns( _cellularHandle, testCELLULAR_PDN_CONTEXT_ID, testCELLULAR_DNS_SERVER_ADDRESS );
/* Modem use dynamic DNS. */
if( xCellularStatus == CELLULAR_UNSUPPORTED )
{
xCellularStatus = CELLULAR_SUCCESS;
}
}
}
if( ( xCellularStatus == CELLULAR_SUCCESS ) && ( xResult == pdPASS ) )
{
for( i = 0; i < NumStatus; i++ )
{
if( ( PdnStatusBuffers[ i ].contextId == testCELLULAR_PDN_CONTEXT_ID ) && ( PdnStatusBuffers[ i ].state == 1 ) )
{
break;
}
}
if( i != NumStatus )
{
xResult = pdPASS;
}
}
else
{
xResult = pdFAIL;
}
return xResult;
}
/*-----------------------------------------------------------*/
/* Helper function to check if cellular network connected. */
static BaseType_t prvIsConnectedCellular( void )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
CellularPdnStatus_t PdnStatusBuffers[ testCELLULAR_MAX_PDN_STATSU_NUM ] = { 0 };
uint8_t NumStatus = 0;
BaseType_t xResult = pdFAIL;
uint32_t i = 0;
if( _cellularHandle != NULL )
{
xCellularStatus = Cellular_GetPdnStatus( _cellularHandle,
PdnStatusBuffers,
testCELLULAR_MAX_PDN_STATSU_NUM,
&NumStatus );
/* State 0 = Deactivated, 1 = Activated. */
if( xCellularStatus == CELLULAR_SUCCESS )
{
for( i = 0; i < NumStatus; i++ )
{
if( ( PdnStatusBuffers[ i ].contextId == testCELLULAR_PDN_CONTEXT_ID ) && ( PdnStatusBuffers[ i ].state == 1 ) )
{
xResult = pdPASS;
break;
}
}
}
}
else
{
xResult = pdFAIL;
}
return xResult;
}
/*-----------------------------------------------------------*/
/* Finish test help function. */
static BaseType_t prvFinishCellularTesting( void )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
BaseType_t xResult = pdPASS;
if( _cellularHandle != NULL )
{
xCellularStatus = Cellular_Cleanup( _cellularHandle );
}
if( xCellularStatus != CELLULAR_SUCCESS )
{
configPRINTF( ( ">>> Cellular module cleanup failed <<<\r\n" ) );
xResult = pdFAIL;
}
else
{
_cellularHandle = NULL;
xResult = pdPASS;
}
return xResult;
}
/*-----------------------------------------------------------*/
/* Setup socket connection. */
static CellularSocketHandle_t prvSocketConnectionSetup( uint16_t serverPort,
char * pServerAddress,
PlatformEventGroupHandle_t * pSocketEventGroup )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
CellularSocketAddress_t remoteSocketAddress = { 0 };
CellularSocketHandle_t socketHandle = NULL;
uint32_t sendTimeout = testCELLULAR_SOCKET_SEND_TIMEOUT_MS;
EventBits_t waitEventBits = 0;
PlatformEventGroupHandle_t socketEventGroup = NULL;
/* Setup the event group. */
socketEventGroup = xEventGroupCreate();
TEST_ASSERT_MESSAGE( socketEventGroup != NULL, "event group create failed" );
*pSocketEventGroup = socketEventGroup;
xEventGroupClearBits( socketEventGroup,
SOCKET_OPEN_CALLBACK_BIT | SOCKET_OPEN_FAILED_CALLBACK_BIT | SOCKET_DATA_RECEIVED_CALLBACK_BIT );
/* Setup the tcp connection. */
/* Create Socket. */
xCellularStatus = Cellular_CreateSocket( _cellularHandle,
testCELLULAR_PDN_CONTEXT_ID,
CELLULAR_SOCKET_DOMAIN_AF_INET,
CELLULAR_SOCKET_TYPE_DGRAM,
CELLULAR_SOCKET_PROTOCOL_TCP,
&socketHandle );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
/* Modify Socket. */
xCellularStatus = Cellular_SocketSetSockOpt( _cellularHandle,
socketHandle,
CELLULAR_SOCKET_OPTION_LEVEL_TRANSPORT,
CELLULAR_SOCKET_OPTION_SEND_TIMEOUT,
( uint8_t * ) &sendTimeout,
sizeof( sendTimeout ) );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
/* Data and Socket Event call back enabled. */
xCellularStatus = Cellular_SocketRegisterDataReadyCallback( _cellularHandle,
socketHandle,
&prvCellularSocketDataReadyCallback,
socketEventGroup );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
xCellularStatus = Cellular_SocketRegisterSocketOpenCallback( _cellularHandle,
socketHandle,
&prvCellularSocketOpenCallback,
socketEventGroup );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
xCellularStatus = Cellular_SocketRegisterClosedCallback( _cellularHandle,
socketHandle,
&prvSocketClosedCallback,
socketEventGroup );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
/* Connect Socket. */
remoteSocketAddress.port = serverPort;
remoteSocketAddress.ipAddress.ipAddressType = CELLULAR_IP_ADDRESS_V4;
strncpy( remoteSocketAddress.ipAddress.ipAddress, pServerAddress, CELLULAR_IP_ADDRESS_MAX_SIZE );
xCellularStatus = Cellular_SocketConnect( _cellularHandle,
socketHandle,
CELLULAR_ACCESSMODE_BUFFER,
&remoteSocketAddress );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
waitEventBits = xEventGroupWaitBits( socketEventGroup,
SOCKET_OPEN_CALLBACK_BIT | SOCKET_OPEN_FAILED_CALLBACK_BIT,
pdTRUE,
pdFALSE,
pdMS_TO_TICKS( testCELLULAR_SOCKET_CONNECTION_TIMEOUT_MS ) );
TEST_ASSERT_MESSAGE( ( waitEventBits & SOCKET_OPEN_CALLBACK_BIT ) != 0, "Socket connection timeout or failed" );
return socketHandle;
}
/*-----------------------------------------------------------*/
/* Close socket connection. */
static void prvSocketConnectionClose( CellularSocketHandle_t socketHandle,
PlatformEventGroupHandle_t socketEventGroup,
bool waitCallback )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
PlatformEventGroup_EventBits waitEventBits = 0;
/* Close the socket. */
xCellularStatus = Cellular_SocketRegisterDataReadyCallback( _cellularHandle,
socketHandle,
NULL,
NULL );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
xCellularStatus = Cellular_SocketRegisterSocketOpenCallback( _cellularHandle,
socketHandle,
NULL,
NULL );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
if( waitCallback == false )
{
xCellularStatus = Cellular_SocketRegisterClosedCallback( _cellularHandle,
socketHandle,
NULL,
NULL );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
}
xCellularStatus = Cellular_SocketClose( _cellularHandle, socketHandle );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
if( ( waitCallback == true ) && ( socketEventGroup != NULL ) )
{
waitEventBits = PlatformEventGroup_WaitBits( socketEventGroup,
SOCKET_CLOSED_CALLBACK_BIT,
pdTRUE,
pdFALSE,
pdMS_TO_TICKS( testCELLULAR_SOCKET_CLOSE_TIMEOUT_MS ) );
TEST_ASSERT_MESSAGE( ( waitEventBits & SOCKET_CLOSED_CALLBACK_BIT ) != 0, "Socket close timeout or failed" );
}
if( socketEventGroup != NULL )
{
vEventGroupDelete( socketEventGroup );
}
}
/*-----------------------------------------------------------*/
/* EDRX receive count test function. */
static uint32_t prvTestSocketReceiveCount( const uint32_t testTimeMs,
const uint32_t dataReceiveIntervalMs )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
CellularSocketHandle_t socketHandle = NULL;
uint32_t dataReceivedCount = 0;
uint32_t sentDataLen = 0;
uint8_t receiveBuff[ 100 ] = { 0 };
uint32_t receivedDataLen = 0;
uint32_t totalReceivedDataLen = 0;
TickType_t recvStartTime = 0;
PlatformEventGroupHandle_t socketEventGroup = NULL;
/* Setup the socket connection. */
socketHandle = prvSocketConnectionSetup( testCELLULAR_EDRX_ECHO_SERVER_PORT,
testCELLULAR_EDRX_ECHO_SERVER_ADDRESS,
&socketEventGroup );
/* Send a byte to the server to start echo in time interval. */
xCellularStatus = Cellular_SocketSend( _cellularHandle,
socketHandle,
( const uint8_t * ) _socketDataSend,
strlen( _socketDataSend ),
&sentDataLen );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
recvStartTime = xTaskGetTickCount();
/* Echo server will send data after received data. Wait 5 seconds for the first data. */
configPRINTF( ( "start receive time %d, test time ms %d\r\n", recvStartTime, testTimeMs ) );
Platform_Delay( 5000UL );
while( 1 )
{
totalReceivedDataLen = 0;
while( 1 )
{
xCellularStatus = Cellular_SocketRecv( _cellularHandle,
socketHandle,
receiveBuff,
sizeof( receiveBuff ),
&receivedDataLen );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
if( receivedDataLen == 0 )
{
break;
}
totalReceivedDataLen = totalReceivedDataLen + receivedDataLen;
}
if( totalReceivedDataLen != 0 )
{
configPRINTF( ( "Bytes received %d\r\n", totalReceivedDataLen ) );
dataReceivedCount = dataReceivedCount + 1;
}
if( ( xTaskGetTickCount() - recvStartTime ) > pdMS_TO_TICKS( testTimeMs ) )
{
break;
}
Platform_Delay( dataReceiveIntervalMs );
}
prvSocketConnectionClose( socketHandle, socketEventGroup, false );
return dataReceivedCount;
}
/*-----------------------------------------------------------*/
/* Unity TEST initializations. */
TEST_GROUP( Full_CELLULAR_API );
/*-----------------------------------------------------------*/
TEST_SETUP( Full_CELLULAR_API )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
CellularModemInfo_t modemInfo = { 0 };
CellularSimCardInfo_t simCardInfo = { 0 };
CellularSimCardStatus_t simStatus = { 0 };
CellularSignalInfo_t signalInfo = { 0 };
char localIP[ CELLULAR_IP_ADDRESS_MAX_SIZE ] = { '\0' };
CellularPlmnInfo_t networkInfo = { 0 };
CellularServiceStatus_t serviceStatus = { 0 };
CellularTime_t networkTime = { 0 };
CellularPsmSettings_t psmSettings = { 0 };
CellularEidrxSettingsList_t eidrxSettingsList = { 0 };
CellularRat_t pRatPriorities[ CELLULAR_MAX_RAT_PRIORITY_COUNT ] = { CELLULAR_RAT_INVALID };
uint8_t receivedRatPrioritiesLength = 0;
uint32_t ratIndex = 0;
configPRINTF( ( "\r\n==================================================================================\r\n" ) );
xCellularStatus = Cellular_GetModemInfo( _cellularHandle, &modemInfo );
if( xCellularStatus == CELLULAR_SUCCESS )
{
configPRINTF(
( " FW: %s \r\n IMEI: %s \r\n MfrID/ModId: %s/%s \r\n", modemInfo.firmwareVersion, modemInfo.imei, modemInfo.manufactureId, modemInfo.modelId ) );
}
else
{
configPRINTF( ( " FW: \r\n IMEI: \r\n MfrID/ModId: \r\n" ) );
}
xCellularStatus = Cellular_GetSimCardInfo( _cellularHandle, &simCardInfo );
if( xCellularStatus == CELLULAR_SUCCESS )
{
configPRINTF(
( " ICCID: %s \r\n IMSI: %s \r\n HPLMN: %s-%s \r\n", simCardInfo.iccid, simCardInfo.imsi, simCardInfo.plmn.mcc, simCardInfo.plmn.mnc ) );
}
else
{
configPRINTF( ( " ICCID: \r\n IMSI: \r\n HPLMN: \r\n" ) );
}
xCellularStatus = Cellular_GetSimCardStatus( _cellularHandle, &simStatus );
if( xCellularStatus == CELLULAR_SUCCESS )
{
configPRINTF( ( " SIM Status: %d \r\n SIM Lock: %d \r\n", simStatus.simCardState, simStatus.simCardLockState ) );
}
else
{
configPRINTF( ( " SIM Status: \r\n SIM Lock: \r\n" ) );
}
xCellularStatus = Cellular_GetServiceStatus( _cellularHandle, &serviceStatus );
if( xCellularStatus == CELLULAR_SUCCESS )
{
configPRINTF(
( " rat: %d \r\n cs: %d \r\n ps: %d \r\n mode: %d \r\n csRej: %d \r\n psRej: %d \r\n plmn: %s%s \r\n", serviceStatus.rat, serviceStatus.csRegistrationStatus, serviceStatus.psRegistrationStatus, serviceStatus.networkRegistrationMode, serviceStatus.csRejectionCause, serviceStatus.psRejectionCause, serviceStatus.plmnInfo.mcc, serviceStatus.plmnInfo.mnc ) );
}
else
{
configPRINTF( ( " rat: \r\n cs: \r\n ps: \r\n mode: \r\n csRej: \r\n psRej: \r\n plmn: \r\n" ) );
}
xCellularStatus = Cellular_GetRegisteredNetwork( _cellularHandle, &networkInfo );
if( xCellularStatus == CELLULAR_SUCCESS )
{
configPRINTF( ( " Network: %s-%s \r\n", networkInfo.mcc, networkInfo.mnc ) );
}
else
{
configPRINTF( ( " Network: \r\n" ) );
}
/* Cellular_GetSignalInfo should be called after Cellular_GetServiceStatus to set libAtData.rat to get correct bar level. */
xCellularStatus = Cellular_GetSignalInfo( _cellularHandle, &signalInfo );
if( xCellularStatus == CELLULAR_SUCCESS )
{
configPRINTF(
( " Signal Bars: %d \r\n Signal RSSI: %d \r\n Signal RSRP: %d \r\n Signal RSRQ: %d \r\n", signalInfo.bars, signalInfo.rssi, signalInfo.rsrp, signalInfo.rsrq ) );
}
else
{
configPRINTF(
( " Signal Bars: N/A\r\n Signal RSSI: N/A\r\n Signal RSRP: N/A\r\n Signal RSRQ: N/A\r\n" ) );
}
xCellularStatus = Cellular_GetNetworkTime( _cellularHandle, &networkTime );
if( xCellularStatus == CELLULAR_SUCCESS )
{
configPRINTF(
( " Network time: %d/%d/%d %d:%d:%d \r\n", networkTime.month, networkTime.day, networkTime.year, networkTime.hour, networkTime.minute, networkTime.second ) );
}
else
{
configPRINTF( ( " Network time: \r\n" ) );
}
xCellularStatus = Cellular_GetRatPriority( _cellularHandle,
pRatPriorities, CELLULAR_MAX_RAT_PRIORITY_COUNT, &receivedRatPrioritiesLength );
if( xCellularStatus == CELLULAR_SUCCESS )
{
for( ratIndex = 0; ratIndex < receivedRatPrioritiesLength; ratIndex++ )
{
configPRINTF( ( " RAT Priority: %u %u\r\n", ratIndex, pRatPriorities[ ratIndex ] ) );
}
}
xCellularStatus = Cellular_GetIPAddress( _cellularHandle, testCELLULAR_PDN_CONTEXT_ID, localIP, sizeof( localIP ) );
if( xCellularStatus == CELLULAR_SUCCESS )
{
configPRINTF( ( " IP address: %s \r\n", localIP ) );
}
else
{
configPRINTF( ( " IP address: \r\n" ) );
}
xCellularStatus = Cellular_GetPsmSettings( _cellularHandle, &psmSettings );
if( xCellularStatus == CELLULAR_SUCCESS )
{
configPRINTF( ( " PSM mode: %d \r\n PSM TAU Value: %d \r\n PSM RAU Value: %d \r\n PSM GPRS Timer: %d \r\n PSM Active Value: %d \r\n",
psmSettings.mode,
psmSettings.periodicTauValue,
psmSettings.periodicRauValue,
psmSettings.gprsReadyTimer,
psmSettings.activeTimeValue ) );
}
else
{
configPRINTF(
( " PSM mode: \r\n PSM TAU Value: \r\n PSM RAU Value: \r\n PSM GPRS Timer: \r\n PSM Active Value: \r\n" ) );
}
xCellularStatus = Cellular_GetEidrxSettings( _cellularHandle, &eidrxSettingsList );
if( xCellularStatus == CELLULAR_SUCCESS )
{
for( int i = 0; i < eidrxSettingsList.count; i++ )
{
configPRINTF( ( " eDRX index: %d eDRX mode: %d eDRX rat:%d eDRX UE Value:%d eDRX NW value:%d \r\n",
i,
eidrxSettingsList.eidrxList[ i ].mode,
eidrxSettingsList.eidrxList[ i ].rat,
eidrxSettingsList.eidrxList[ i ].requestedEdrxVaue,
eidrxSettingsList.eidrxList[ i ].nwProvidedEdrxVaue ) );
}
}
else
{
configPRINTF( ( " eDRX index: eDRX mode: eDRX rat: eDRX UE Value: eDRX NW value: \r\n" ) );
}
configPRINTF( ( "\r\n==================================================================================\r\n" ) );
}
/*-----------------------------------------------------------*/
TEST_TEAR_DOWN( Full_CELLULAR_API )
{
configPRINTF( ( "\r\n==================================================================================\r\n" ) );
}
/*-----------------------------------------------------------*/
TEST_GROUP_RUNNER( Full_CELLULAR_API )
{
/* List of all tests under this group */
/* In sequence tests. */
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_Configure );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_Activate );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_GetNetworkTime );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_GetHostByName );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_TCPDataTransfer );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_EidrxSettings );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_PsmSettings );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_RatPriority );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_AtCommandRawAndGenericUrc );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_AirplaneMode );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_Deactivate );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_UnConfigure );
/* Null parameter tests. */
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_GetModemInfo_NullParameters );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_GetSimCardInfo_NullParameters );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_GetSimCardStatus_NullParameters );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_GetServiceStatus_NullParameters );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_GetSignalInfo_NullParameters );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_GetRegisteredNetwork_NullParameters );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_GetPsmSettings_NullParameters );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_GetEidrxSettings_NullParameters );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_GetPdnStatus_NullParameters );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_GetIPAddress_NullParameters );
/* Invalid parameters tests. */
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_SetRatPriority_InvalidMode );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_SetPsmSettings_InvalidMode );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_SetEidrxSettings_InvalidMode );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_SetPdnConfig_InvalidMode );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_SetDns_InvalidMode );
/* Stability tests. */
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_Data_Loop );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_MultipleSocketConnection );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_AirplaneMode_Loop );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_Power_Loop );
/* PSM and eDRX tests. */
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_EidrxEchoTimes );
RUN_TEST_CASE( Full_CELLULAR_API, Cellular_PsmStatus );
prvFinishCellularTesting();
}
/*-----------------------------------------------------------*/
/**
* @brief Configure CELLULAR.
*/
TEST( Full_CELLULAR_API, Cellular_Configure )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
CellularSimCardStatus_t simStatus = { 0 };
CellularCommInterface_t * pCommIntf = &CellularCommInterface;
uint8_t tries = 0;
uint8_t simReady = 0;
if( TEST_PROTECT() )
{
xCellularStatus = Cellular_Init( &_cellularHandle, pCommIntf );
TEST_CELLULAR_ASSERT_REQUIRED_API_MSG( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus,
">>> Cellular module can't be initialized <<<" );
/* Wait until SIM is ready. */
for( tries = 0; tries < testCELLULAR_MAX_SIM_RETRY; tries++ )
{
xCellularStatus = Cellular_GetSimCardStatus( _cellularHandle, &simStatus );
TEST_CELLULAR_ASSERT_REQUIRED_API_MSG( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus,
">>> Cellular SIM failure <<<" );
if( ( simStatus.simCardState == CELLULAR_SIM_CARD_INSERTED ) &&
( simStatus.simCardLockState == CELLULAR_SIM_CARD_READY ) )
{
simReady = 1;
break;
}
Platform_Delay( testCELLULAR_SIM_RETRY_INTERVAL_MS );
}
TEST_ASSERT( simReady != 0 );
/* Enable Callbacks. */
xCellularStatus = Cellular_RegisterUrcSignalStrengthChangedCallback( _cellularHandle, &prvSignalStrengthChangedCallback, _cellularHandle );
TEST_CELLULAR_ASSERT_OPTIONAL_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
xCellularStatus = Cellular_RegisterUrcNetworkRegistrationEventCallback( _cellularHandle, &prvNetworkRegistrationCallback, _cellularHandle );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
xCellularStatus = Cellular_RegisterUrcPdnEventCallback( _cellularHandle, &prvPdnEventCallback, _cellularHandle );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief CELLULAR Activate.
*/
TEST( Full_CELLULAR_API, Cellular_Activate )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
CellularServiceStatus_t serviceStatus = { 0 };
CellularPdnConfig_t pdnConfig =
{ CELLULAR_PDN_CONTEXT_IPV4, CELLULAR_PDN_AUTH_NONE, testCELLULAR_APN, "", "" };
CellularPdnStatus_t PdnStatusBuffers[ testCELLULAR_MAX_PDN_STATSU_NUM ] = { 0 };
char localIP[ CELLULAR_IP_ADDRESS_MAX_SIZE ] = { '\0' };
uint32_t timeoutCount = 0;
uint8_t numStatus = 0;
CellularPsmSettings_t psmSettings = { 0 };
CellularEidrxSettings_t eidrxSettings = { 0 };
uint32_t i = 0;
if( TEST_PROTECT() )
{
/* Setup PDN for EPS Network Registration. */
xCellularStatus = Cellular_SetPdnConfig( _cellularHandle, testCELLULAR_PDN_CONTEXT_ID, &pdnConfig );
TEST_CELLULAR_ASSERT_REQUIRED_API_MSG( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus,
">>> PDN configuration failed <<<" );
/* Rescan network. */
if( xCellularStatus == CELLULAR_SUCCESS )
{
xCellularStatus = Cellular_RfOff( _cellularHandle );
}
Platform_Delay( 5000 );
if( xCellularStatus == CELLULAR_SUCCESS )
{
for( timeoutCount = 0; timeoutCount < testCELLULAR_MAX_NETWORK_REGISTER_RETRY; timeoutCount++ )
{
xCellularStatus = Cellular_RfOn( _cellularHandle );
if( xCellularStatus == CELLULAR_SUCCESS )
{
break;
}
}
}
TEST_ASSERT( xCellularStatus == CELLULAR_SUCCESS );
/* Verify registration. */
for( timeoutCount = 0; timeoutCount < testCELLULAR_MAX_NETWORK_REGISTER_RETRY; timeoutCount++ )
{
xCellularStatus = Cellular_GetServiceStatus( _cellularHandle, &serviceStatus );
TEST_CELLULAR_ASSERT_REQUIRED_API_MSG( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus,
">>> Cellular module can't be registered <<<" );
if( ( serviceStatus.psRegistrationStatus == REGISTRATION_STATUS_REGISTERED_HOME ) ||
( serviceStatus.psRegistrationStatus == REGISTRATION_STATUS_ROAMING_REGISTERED ) )
{
break;
}
Platform_Delay( testCELLULAR_NETWORK_REGISTER_RETRY_INTERVAL_MS );
}
if( timeoutCount >= testCELLULAR_MAX_NETWORK_REGISTER_RETRY )
{
TEST_FAIL_MESSAGE( ">>> Cellular module can't be registered <<<" );
}
/* Configure and Activate PDN, set DNS and verify IP. */
xCellularStatus = Cellular_ActivatePdn( _cellularHandle, testCELLULAR_PDN_CONTEXT_ID );
TEST_CELLULAR_ASSERT_REQUIRED_API_MSG( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus,
">>> Cellular module can't be activated <<<" );
/* Get PDN & IP and verify. */
xCellularStatus = Cellular_GetIPAddress( _cellularHandle, testCELLULAR_PDN_CONTEXT_ID, localIP, sizeof( localIP ) );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
xCellularStatus = Cellular_GetPdnStatus( _cellularHandle,
PdnStatusBuffers,
testCELLULAR_MAX_PDN_STATSU_NUM,
&numStatus );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
for( i = 0; i < numStatus; i++ )
{
if( PdnStatusBuffers[ i ].contextId == testCELLULAR_PDN_CONTEXT_ID )
{
TEST_ASSERT_EQUAL_INT32_MESSAGE( 1, PdnStatusBuffers[ i ].state,
">>> Cellular module failed to be activated <<<" );
break;
}
}
TEST_ASSERT_MESSAGE( i != numStatus, ">>> Cellular module failed to be activated, no activate PDN found <<<" );
/* Set DNS. */
xCellularStatus = Cellular_SetDns( _cellularHandle, testCELLULAR_PDN_CONTEXT_ID, testCELLULAR_DNS_SERVER_ADDRESS );
TEST_CELLULAR_ASSERT_OPTIONAL_API_MSG( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus,
">>> DNS configuration failed <<<" );
/* Disable PSM and eDRX for the following tests. */
psmSettings.mode = 0;
psmSettings.periodicTauValue = 0;
psmSettings.periodicRauValue = 0;
psmSettings.gprsReadyTimer = 0;
psmSettings.activeTimeValue = 0;
xCellularStatus = Cellular_SetPsmSettings( _cellularHandle, &psmSettings );
TEST_CELLULAR_ASSERT_REQUIRED_API_MSG( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus,
">>> Disable PSM failed <<<" );
eidrxSettings.mode = 0;
eidrxSettings.rat = testCELLULAR_EDRX_RAT;
eidrxSettings.requestedEdrxVaue = 0;
xCellularStatus = Cellular_SetEidrxSettings( _cellularHandle, &eidrxSettings );
TEST_CELLULAR_ASSERT_REQUIRED_API_MSG( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus,
">>> Disable EDRX failed <<<" );
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Get network time.
*/
TEST( Full_CELLULAR_API, Cellular_GetNetworkTime )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
CellularTime_t networkTime = { 0 };
if( TEST_PROTECT() )
{
xCellularStatus = Cellular_GetNetworkTime( _cellularHandle, &networkTime );
TEST_CELLULAR_ASSERT_REQUIRED_API_MSG( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus,
">>> Get network time failed <<<" );
/* Verify the value range. */
TEST_ASSERT_MESSAGE( ( ( networkTime.month >= 1 ) && ( networkTime.month <= 12 ) ),
">>> Get network time month value error <<<" );
TEST_ASSERT_MESSAGE( ( ( networkTime.day >= 1 ) && ( networkTime.day <= 31 ) ),
">>> Get network time day value error <<<" );
TEST_ASSERT_MESSAGE( ( ( networkTime.hour >= 0 ) && ( networkTime.hour <= 24 ) ),
">>> Get network time hour value error <<<" );
TEST_ASSERT_MESSAGE( ( ( networkTime.minute >= 0 ) && ( networkTime.minute <= 59 ) ),
">>> Get network time minute value error <<<" );
TEST_ASSERT_MESSAGE( ( ( networkTime.second >= 0 ) && ( networkTime.second <= 59 ) ),
">>> Get network time second value error <<<" );
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Host name resolve test.
*/
TEST( Full_CELLULAR_API, Cellular_GetHostByName )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
char pIpAddress[ CELLULAR_IP_ADDRESS_MAX_SIZE ] = { '\0' };
if( TEST_PROTECT() )
{
/* DNS query IP. */
xCellularStatus = Cellular_GetHostByName(
_cellularHandle,
testCELLULAR_PDN_CONTEXT_ID,
testCELLULAR_HOST_NAME,
pIpAddress );
TEST_CELLULAR_ASSERT_OPTIONAL_API_MSG( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus,
">>> DNS query IP failed <<<" );
if( xCellularStatus == CELLULAR_SUCCESS )
{
TEST_ASSERT_MESSAGE( strncmp( pIpAddress, testCELLULAR_HOST_NAME_ADDRESS, CELLULAR_IP_ADDRESS_MAX_SIZE ) == 0,
">>> DNS query IP incorrect <<<" );
}
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief TCP Data Transfer.
*/
TEST( Full_CELLULAR_API, Cellular_TCPDataTransfer )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
CellularSocketHandle_t socketHandle = NULL;
uint8_t tries = 0;
uint32_t sentDataLen = 0;
char receiveBuff[ 100 ] = { 0 };
uint32_t receivedDataLen = 0;
if( TEST_PROTECT() )
{
/* Setup the test variable. */
_dataReady = 0;
_socketOpenContext = NULL;
_socketDataReadyContext = NULL;
_socketClosedContext = NULL;
/* Setup server connection. */
socketHandle = prvSocketConnectionSetup( testCELLULAR_ECHO_SERVER_PORT,
testCELLULAR_ECHO_SERVER_ADDRESS,
&_socketEventGroup );
TEST_ASSERT_MESSAGE( _socketOpenContext == _socketEventGroup, "Socket open context check failed" );
/* Send Data on Socket. */
for( tries = 0; tries < SOCKET_OPERATION_POLLING_TIMES; tries++ )
{
xCellularStatus = Cellular_SocketSend( _cellularHandle,
socketHandle,
( const uint8_t * ) _socketDataSend,
strlen( _socketDataSend ),
&sentDataLen );
if( xCellularStatus == CELLULAR_SUCCESS )
{
break;
}
}
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
/* Receive Data on Socket in polling method. */
for( tries = 0; tries < SOCKET_OPERATION_POLLING_TIMES; tries++ )
{
Platform_Delay( testCELLULAR_SOCKET_WAIT_INTERVAL_MS );
if( _dataReady == 1 )
{
xCellularStatus = Cellular_SocketRecv( _cellularHandle,
socketHandle,
( uint8_t * ) receiveBuff,
sizeof( receiveBuff ),
&receivedDataLen );
TEST_ASSERT_MESSAGE( _socketDataReadyContext == _socketEventGroup, "Socket data ready context check failed" );
break;
}
}
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
/* Compare Data on Socket. */
TEST_ASSERT_MESSAGE( strncmp( _socketDataSend, receiveBuff, strlen( _socketDataSend ) ) == 0,
"Cellular_TCPDataTransfer received data compare failed" );
/* Close Socket. */
#ifdef CELLULAR_ASYNC_SOCKET_CLOSE
prvSocketConnectionClose( socketHandle, _socketEventGroup, true );
TEST_ASSERT_MESSAGE( _socketClosedContext == _socketEventGroup, "Socket close context check failed" );
#else
prvSocketConnectionClose( socketHandle, _socketEventGroup, false );
#endif
_socketEventGroup = NULL;
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Enable CELLULAR Idle Discontinuous Reception.
*/
TEST( Full_CELLULAR_API, Cellular_EidrxSettings )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
CellularEidrxSettings_t eidrxSettings = { 0 };
CellularEidrxSettingsList_t eidrxSettingsList = { 0 };
uint8_t drxValue = 5; /* 5 = ( 0 1 0 1 ) 81.92 seconds. */
int i = 0;
if( TEST_PROTECT() )
{
/* Disable the EDRX mode. */
eidrxSettings.mode = 0;
eidrxSettings.rat = testCELLULAR_EDRX_RAT;
eidrxSettings.requestedEdrxVaue = 0;
xCellularStatus = Cellular_SetEidrxSettings( _cellularHandle, &eidrxSettings );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
/* Enabling the EDRX mode and verify. */
eidrxSettings.mode = 1; /* Enable the use of e-I-DRX. */
eidrxSettings.rat = testCELLULAR_EDRX_RAT;
eidrxSettings.requestedEdrxVaue = drxValue;
xCellularStatus = Cellular_SetEidrxSettings( _cellularHandle, &eidrxSettings );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
xCellularStatus = Cellular_GetEidrxSettings( _cellularHandle, &eidrxSettingsList );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
TEST_ASSERT_MESSAGE( eidrxSettingsList.count > 0, "eidrxSettingsList count is 0" );
for( i = 0; i < eidrxSettingsList.count; i++ )
{
if( eidrxSettingsList.eidrxList[ i ].rat == testCELLULAR_EDRX_RAT )
{
TEST_ASSERT_EQUAL_INT32( eidrxSettingsList.eidrxList[ i ].requestedEdrxVaue, drxValue );
}
}
/* Disabling the EDRX mode and verify. */
eidrxSettings.mode = 3; /* Disable the use of e-I-DRX and discard all parameters for e-I-DRX or,
* if available, reset to the manufacturer specific default values. */
eidrxSettings.rat = testCELLULAR_EDRX_RAT;
eidrxSettings.requestedEdrxVaue = 0;
xCellularStatus = Cellular_SetEidrxSettings( _cellularHandle, &eidrxSettings );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
xCellularStatus = Cellular_GetEidrxSettings( _cellularHandle, &eidrxSettingsList );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Enable CELLULAR Power Saving Mode attributes.
*/
TEST( Full_CELLULAR_API, Cellular_PsmSettings )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
CellularPsmSettings_t psmSettings = { 0 };
uint32_t psmTau = 4; /* 4 * 10 minutes = 40 minutes. */
uint32_t psmTimer = 14; /* 14 * 2 seconds = 28 Seconds. */
uint32_t tries = 0;
if( TEST_PROTECT() )
{
/* Disabling the PSM mode if ON. */
xCellularStatus = Cellular_GetPsmSettings( _cellularHandle, &psmSettings );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
if( psmSettings.mode == 1 )
{
psmSettings.mode = 0;
psmSettings.periodicTauValue = 0;
psmSettings.periodicRauValue = 0;
psmSettings.gprsReadyTimer = 0;
psmSettings.activeTimeValue = 0;
xCellularStatus = Cellular_SetPsmSettings( _cellularHandle, &psmSettings );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
}
/* Enabling the PSM mode and verify. */
psmSettings.mode = 1;
psmSettings.periodicTauValue = psmTau;
psmSettings.periodicRauValue = 0;
psmSettings.gprsReadyTimer = 0;
psmSettings.activeTimeValue = psmTimer;
xCellularStatus = Cellular_SetPsmSettings( _cellularHandle, &psmSettings );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
for( tries = 0; tries < testCELLULAR_MAX_GET_PSM_RETRY; tries++ )
{
xCellularStatus = Cellular_GetPsmSettings( _cellularHandle, &psmSettings );
if( ( xCellularStatus == CELLULAR_SUCCESS ) && ( psmSettings.mode == 1 ) )
{
break;
}
Platform_Delay( testCELLULAR_GET_PSM_RETRY_INTERVAL_MS );
}
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
TEST_ASSERT_EQUAL_INT32( psmSettings.mode, 1 );
/* Disabling the PSM mode and verify. */
psmSettings.mode = 0;
psmSettings.periodicTauValue = 0;
psmSettings.periodicRauValue = 0;
psmSettings.gprsReadyTimer = 0;
psmSettings.activeTimeValue = 0;
xCellularStatus = Cellular_SetPsmSettings( _cellularHandle, &psmSettings );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
for( tries = 0; tries < testCELLULAR_MAX_GET_PSM_RETRY; tries++ )
{
xCellularStatus = Cellular_GetPsmSettings( _cellularHandle, &psmSettings );
if( ( xCellularStatus == CELLULAR_SUCCESS ) && ( psmSettings.mode == 0 ) )
{
break;
}
Platform_Delay( testCELLULAR_GET_PSM_RETRY_INTERVAL_MS );
}
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
TEST_ASSERT_EQUAL_INT32( psmSettings.mode, 0 );
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Setting and checking CELLULAR RAT priority.
*/
TEST( Full_CELLULAR_API, Cellular_RatPriority )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
const CellularRat_t pRatPriorities1[ TEST_MAX_RAT_PRIORITY_COUNT ] =
{ CELLULAR_RAT_NBIOT, CELLULAR_RAT_CATM1, CELLULAR_RAT_GSM };
const CellularRat_t pRatPriorities2[ TEST_MAX_RAT_PRIORITY_COUNT ] =
{ CELLULAR_RAT_CATM1, CELLULAR_RAT_NBIOT, CELLULAR_RAT_GSM };
CellularRat_t pRatPriorities[ TEST_MAX_RAT_PRIORITY_COUNT ] = { CELLULAR_RAT_INVALID };
uint8_t receivedRatPrioritiesLength = 0;
int i = 0;
uint32_t tries = 0;
bool ratFlag = true;
if( TEST_PROTECT() )
{
/* Set the first priority and verify. */
xCellularStatus = Cellular_SetRatPriority( _cellularHandle,
( const CellularRat_t * ) pRatPriorities1,
CELLULAR_MAX_RAT_PRIORITY_COUNT );
TEST_CELLULAR_ASSERT_OPTIONAL_API_MSG( ( CELLULAR_SUCCESS == xCellularStatus ) || ( CELLULAR_NOT_ALLOWED == xCellularStatus ),
xCellularStatus,
"Set RAT priority failed" );
/* Set RAT priority may not be supported in the cellular module. */
if( xCellularStatus == CELLULAR_SUCCESS )
{
for( tries = 0; tries < testCELLULAR_GET_RAT_RETRY; tries++ )
{
xCellularStatus = Cellular_GetRatPriority( _cellularHandle,
pRatPriorities,
CELLULAR_MAX_RAT_PRIORITY_COUNT,
&receivedRatPrioritiesLength );
TEST_ASSERT_MESSAGE( CELLULAR_SUCCESS == xCellularStatus, "Get RAT priority failed" );
/* Check the return priority length if RAT priority is supported. */
if( xCellularStatus == CELLULAR_SUCCESS )
{
TEST_ASSERT_MESSAGE( receivedRatPrioritiesLength > 0, "Get RAT priority failed" );
ratFlag = true;
for( i = 0; i < receivedRatPrioritiesLength; i++ )
{
if( pRatPriorities1[ i ] != pRatPriorities[ i ] )
{
configPRINTF( ( "%d : Set RAT [%d] != Get RAT [ %d ]\r\n",
i, pRatPriorities1[ i ], pRatPriorities[ i ] ) );
ratFlag = false;
break;
}
}
if( ratFlag == true )
{
break;
}
}
else
{
break;
}
Platform_Delay( testCELLULAR_GET_RAT_RETRY_INTERVAL_MS );
}
TEST_ASSERT_MESSAGE( ratFlag == true, "RATs priority compare failed" );
/* Restore the second priority. */
xCellularStatus = Cellular_SetRatPriority( _cellularHandle,
( const CellularRat_t * ) pRatPriorities2,
CELLULAR_MAX_RAT_PRIORITY_COUNT );
TEST_ASSERT_MESSAGE( CELLULAR_SUCCESS == xCellularStatus, "Set RAT priority failed" );
}
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Send AT command with receive the generic URC.
*/
TEST( Full_CELLULAR_API, Cellular_AtCommandRawAndGenericUrc )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
if( TEST_PROTECT() )
{
_genericUrcCalled = false;
xCellularStatus = Cellular_RegisterUrcGenericCallback( _cellularHandle,
prvGenericCallback, _cellularHandle );
TEST_CELLULAR_ASSERT_REQUIRED_API_MSG( xCellularStatus == CELLULAR_SUCCESS, xCellularStatus,
"Register URC generic callback failed" );
/* Send the 3GPP get network time AT command.
* The returned network time string is handled in generic URC handler. */
xCellularStatus = Cellular_ATCommandRaw( _cellularHandle,
NULL,
"AT+CCLK?",
CELLULAR_AT_NO_RESULT,
NULL,
NULL,
0U );
TEST_CELLULAR_ASSERT_REQUIRED_API_MSG( xCellularStatus == CELLULAR_SUCCESS, xCellularStatus,
"Send AT command raw failed" );
/* The maximum response time is 300ms. */
Platform_Delay( 300U );
TEST_ASSERT_MESSAGE( _genericUrcCalled == true, "Generic URC is not called" );
xCellularStatus = Cellular_RegisterUrcGenericCallback( _cellularHandle,
NULL,
NULL );
TEST_CELLULAR_ASSERT_REQUIRED_API_MSG( xCellularStatus == CELLULAR_SUCCESS, xCellularStatus,
"Register URC generic callback failed" );
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Setting CELLULAR Airplane Mode On and off.
*/
TEST( Full_CELLULAR_API, Cellular_AirplaneMode )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
CellularServiceStatus_t serviceStatus = { 0 };
bool simReady = false;
uint32_t tries = 0;
if( TEST_PROTECT() )
{
/* RF Off. */
xCellularStatus = Cellular_RfOff( _cellularHandle );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
/* Wait until SIM is ready. */
simReady = prvWaitSimCardReady();
TEST_ASSERT( simReady == true );
/* Check network registration status. Airplane mode the register status should be
* CELLULAR_NETWORK_REGISTRATION_STATUS_NOT_REGISTERED_NOT_SEARCHING */
for( tries = 0; tries < testCELLULAR_MAX_NETWORK_REGISTER_RETRY; tries++ )
{
xCellularStatus = Cellular_GetServiceStatus( _cellularHandle, &serviceStatus );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
if( ( serviceStatus.psRegistrationStatus != REGISTRATION_STATUS_REGISTERED_HOME ) &&
( serviceStatus.psRegistrationStatus != REGISTRATION_STATUS_ROAMING_REGISTERED ) )
{
break;
}
Platform_Delay( testCELLULAR_NETWORK_REGISTER_RETRY_INTERVAL_MS );
}
configPRINTF( ( "serviceStatus.psRegistrationStatus %d\r\n", serviceStatus.psRegistrationStatus ) );
/* Add also psRegistrationStatus=4 if +CGREG: 2,0 and +CEREG: 2,4. */
TEST_ASSERT_MESSAGE( ( serviceStatus.psRegistrationStatus == REGISTRATION_STATUS_NO_REGISTERED_SEARCHING ) ||
( serviceStatus.psRegistrationStatus == REGISTRATION_STATUS_UNKNOWN ),
"Airplane mode network registration check failed" );
/* RF On. */
xCellularStatus = Cellular_RfOn( _cellularHandle );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
/* Wait until SIM is ready. */
simReady = prvWaitSimCardReady();
TEST_ASSERT( simReady == true );
/* Check network registration status. Airplane mode the register status should be
* CELLULAR_NETWORK_REGISTRATION_STATUS_REGISTERED_HOME or
* CELLULAR_NETWORK_REGISTRATION_STATUS_REGISTERED_ROAMING */
for( tries = 0; tries < testCELLULAR_MAX_NETWORK_REGISTER_RETRY; tries++ )
{
xCellularStatus = Cellular_GetServiceStatus( _cellularHandle, &serviceStatus );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
if( ( serviceStatus.psRegistrationStatus == REGISTRATION_STATUS_REGISTERED_HOME ) ||
( serviceStatus.psRegistrationStatus == REGISTRATION_STATUS_ROAMING_REGISTERED ) )
{
break;
}
Platform_Delay( testCELLULAR_NETWORK_REGISTER_RETRY_INTERVAL_MS );
}
configPRINTF( ( "serviceStatus.psRegistrationStatus %d\r\n", serviceStatus.psRegistrationStatus ) );
TEST_ASSERT_MESSAGE(
( serviceStatus.psRegistrationStatus == REGISTRATION_STATUS_REGISTERED_HOME ) ||
( serviceStatus.psRegistrationStatus == REGISTRATION_STATUS_ROAMING_REGISTERED ),
"Airplane mode network registration check failed\r\n" );
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Deactivate CELLULAR.
*/
TEST( Full_CELLULAR_API, Cellular_Deactivate )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
CellularPdnStatus_t pdnStatusBuffers[ testCELLULAR_MAX_PDN_STATSU_NUM ] = { 0 };
uint8_t numStatus = 0;
uint32_t i = 0;
if( TEST_PROTECT() )
{
/* Activate PDN for deactivate test. */
xCellularStatus = Cellular_GetPdnStatus( _cellularHandle,
pdnStatusBuffers,
testCELLULAR_MAX_PDN_STATSU_NUM,
&numStatus );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
for( i = 0; i < numStatus; i++ )
{
if( pdnStatusBuffers[ i ].contextId == testCELLULAR_PDN_CONTEXT_ID )
{
if( pdnStatusBuffers[ testCELLULAR_PDN_CONTEXT_ID ].state == 1 )
{
break;
}
}
}
if( i == numStatus )
{
xCellularStatus = Cellular_ActivatePdn( _cellularHandle, testCELLULAR_PDN_CONTEXT_ID );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
}
/* Deactivate PDN and verify. */
xCellularStatus = Cellular_DeactivatePdn( _cellularHandle, testCELLULAR_PDN_CONTEXT_ID );
/* Check also if in LTE network, modem allows default bearer context to be deactivated. */
TEST_CELLULAR_ASSERT_REQUIRED_API( ( CELLULAR_SUCCESS == xCellularStatus ) ||
( CELLULAR_NOT_ALLOWED == xCellularStatus ), xCellularStatus );
if( xCellularStatus != CELLULAR_NOT_ALLOWED )
{
xCellularStatus = Cellular_GetPdnStatus( _cellularHandle,
pdnStatusBuffers,
testCELLULAR_MAX_PDN_STATSU_NUM,
&numStatus );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
if( numStatus != 0 )
{
for( i = 0; i < numStatus; i++ )
{
if( pdnStatusBuffers[ i ].contextId == testCELLULAR_PDN_CONTEXT_ID )
{
TEST_ASSERT_MESSAGE( ( pdnStatusBuffers[ i ].state == 0 ), "Deactive PDN should return 0" );
break;
}
}
TEST_ASSERT_MESSAGE( i != numStatus, "No deactivated PDN context found" );
}
}
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief CELLULAR unconfigure.
*/
TEST( Full_CELLULAR_API, Cellular_UnConfigure )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
if( TEST_PROTECT() )
{
/* Remove call backs. */
xCellularStatus = Cellular_RegisterUrcSignalStrengthChangedCallback( _cellularHandle, NULL, NULL );
TEST_CELLULAR_ASSERT_OPTIONAL_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
xCellularStatus = Cellular_RegisterUrcNetworkRegistrationEventCallback( _cellularHandle, NULL, NULL );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
xCellularStatus = Cellular_RegisterUrcPdnEventCallback( _cellularHandle, NULL, NULL );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
xCellularStatus = Cellular_RegisterModemEventCallback( _cellularHandle, NULL, NULL );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
/* Clean up. */
xCellularStatus = Cellular_Cleanup( _cellularHandle );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
if( xCellularStatus == CELLULAR_SUCCESS )
{
_cellularHandle = NULL;
}
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Call Cellular_GetModemInfo( _cellularHandle ) with Null parameters and verify failure.
*/
TEST( Full_CELLULAR_API, Cellular_GetModemInfo_NullParameters )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
if( prvIsConnectedCellular() == pdFAIL )
{
TEST_ASSERT( prvConnectCellular() == pdPASS );
}
if( TEST_PROTECT() )
{
xCellularStatus = Cellular_GetModemInfo( _cellularHandle, NULL );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS != xCellularStatus, xCellularStatus );
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Call Cellular_Cellular_GetSimCardInfo( _cellularHandle ) with Null parameters and verify failure.
*/
TEST( Full_CELLULAR_API, Cellular_GetSimCardInfo_NullParameters )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
if( prvIsConnectedCellular() == pdFAIL )
{
TEST_ASSERT( prvConnectCellular() == pdPASS );
}
if( TEST_PROTECT() )
{
xCellularStatus = Cellular_GetSimCardInfo( _cellularHandle, NULL );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS != xCellularStatus, xCellularStatus );
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Call Cellular_GetSimCardStatus( _cellularHandle ) with Null parameters and verify failure.
*/
TEST( Full_CELLULAR_API, Cellular_GetSimCardStatus_NullParameters )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
if( prvIsConnectedCellular() == pdFAIL )
{
TEST_ASSERT( prvConnectCellular() == pdPASS );
}
if( TEST_PROTECT() )
{
xCellularStatus = Cellular_GetSimCardStatus( _cellularHandle, NULL );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS != xCellularStatus, xCellularStatus );
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Call Cellular_GetServiceStatus( _cellularHandle ) with Null parameters and verify failure.
*/
TEST( Full_CELLULAR_API, Cellular_GetServiceStatus_NullParameters )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
if( prvIsConnectedCellular() == pdFAIL )
{
TEST_ASSERT( prvConnectCellular() == pdPASS );
}
if( TEST_PROTECT() )
{
xCellularStatus = Cellular_GetServiceStatus( _cellularHandle, NULL );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS != xCellularStatus, xCellularStatus );
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Call Cellular_GetSignalInfo( _cellularHandle ) with Null parameters and verify failure.
*/
TEST( Full_CELLULAR_API, Cellular_GetSignalInfo_NullParameters )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
if( prvIsConnectedCellular() == pdFAIL )
{
TEST_ASSERT( prvConnectCellular() == pdPASS );
}
if( TEST_PROTECT() )
{
xCellularStatus = Cellular_GetSignalInfo( _cellularHandle, NULL );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS != xCellularStatus, xCellularStatus );
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Call Cellular_GetRegisteredNetwork( _cellularHandle ) with Null parameters and verify failure.
*/
TEST( Full_CELLULAR_API, Cellular_GetRegisteredNetwork_NullParameters )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
if( prvIsConnectedCellular() == pdFAIL )
{
TEST_ASSERT( prvConnectCellular() == pdPASS );
}
if( TEST_PROTECT() )
{
xCellularStatus = Cellular_GetRegisteredNetwork( _cellularHandle, NULL );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS != xCellularStatus, xCellularStatus );
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Call Cellular_GetPsmSettings( _cellularHandle ) with Null parameters and verify failure.
*/
TEST( Full_CELLULAR_API, Cellular_GetPsmSettings_NullParameters )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
if( prvIsConnectedCellular() == pdFAIL )
{
TEST_ASSERT( prvConnectCellular() == pdPASS );
}
if( TEST_PROTECT() )
{
xCellularStatus = Cellular_GetPsmSettings( _cellularHandle, NULL );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS != xCellularStatus, xCellularStatus );
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Call Cellular_GetEidrxSettings( _cellularHandle ) with Null parameters and verify failure.
*/
TEST( Full_CELLULAR_API, Cellular_GetEidrxSettings_NullParameters )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
if( prvIsConnectedCellular() == pdFAIL )
{
TEST_ASSERT( prvConnectCellular() == pdPASS );
}
if( TEST_PROTECT() )
{
xCellularStatus = Cellular_GetEidrxSettings( _cellularHandle, NULL );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS != xCellularStatus, xCellularStatus );
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Call Cellular_GetPdnStatus( _cellularHandle ) with Null parameters and verify failure.
*/
TEST( Full_CELLULAR_API, Cellular_GetPdnStatus_NullParameters )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
uint8_t numStatus = 0;
if( prvIsConnectedCellular() == pdFAIL )
{
TEST_ASSERT( prvConnectCellular() == pdPASS );
}
if( TEST_PROTECT() )
{
xCellularStatus = Cellular_GetPdnStatus( _cellularHandle, NULL, testCELLULAR_PDN_CONTEXT_ID, &numStatus );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS != xCellularStatus, xCellularStatus );
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Call Cellular_GetIPAddress( _cellularHandle ) with Null parameters and verify failure.
*/
TEST( Full_CELLULAR_API, Cellular_GetIPAddress_NullParameters )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
if( prvIsConnectedCellular() == pdFAIL )
{
TEST_ASSERT( prvConnectCellular() == pdPASS );
}
if( TEST_PROTECT() )
{
xCellularStatus = Cellular_GetIPAddress( _cellularHandle,
testCELLULAR_PDN_CONTEXT_ID,
NULL,
CELLULAR_IP_ADDRESS_MAX_SIZE );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS != xCellularStatus, xCellularStatus );
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Call Cellular_SetRatPriority( _cellularHandle ) with an invalid mode and verify failure.
*/
TEST( Full_CELLULAR_API, Cellular_SetRatPriority_InvalidMode )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
const CellularRat_t ratPriorities[ TEST_MAX_RAT_PRIORITY_COUNT ] = { 9, 8, 1 }; /* Invalid value 1. */
if( prvIsConnectedCellular() == pdFAIL )
{
TEST_ASSERT( prvConnectCellular() == pdPASS );
}
if( TEST_PROTECT() )
{
xCellularStatus = Cellular_SetRatPriority( _cellularHandle,
( const CellularRat_t * ) &ratPriorities,
5 /* Invalid value. */ );
TEST_CELLULAR_ASSERT_OPTIONAL_API( CELLULAR_SUCCESS != xCellularStatus, xCellularStatus );
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Call Cellular_SetPsmSettings( _cellularHandle ) with an invalid mode and verify failure.
*/
TEST( Full_CELLULAR_API, Cellular_SetPsmSettings_InvalidMode )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
CellularPsmSettings_t psmSettings = { 0 };
psmSettings.activeTimeValue = 28;
psmSettings.gprsReadyTimer = 0;
psmSettings.mode = 2; /* Invalid value. */
psmSettings.periodicRauValue = 0;
psmSettings.periodicTauValue = 4;
if( prvIsConnectedCellular() == pdFAIL )
{
TEST_ASSERT( prvConnectCellular() == pdPASS );
}
if( TEST_PROTECT() )
{
xCellularStatus = Cellular_SetPsmSettings( _cellularHandle, &psmSettings );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS != xCellularStatus, xCellularStatus );
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Call Cellular_SetEidrxSettings( _cellularHandle ) with an invalid mode and verify failure.
*/
TEST( Full_CELLULAR_API, Cellular_SetEidrxSettings_InvalidMode )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
CellularEidrxSettings_t eidrxSettings = { 0 };
eidrxSettings.mode = 1;
eidrxSettings.rat = 6; /* invalid value. */
eidrxSettings.requestedEdrxVaue = 1;
if( prvIsConnectedCellular() == pdFAIL )
{
TEST_ASSERT( prvConnectCellular() == pdPASS );
}
if( TEST_PROTECT() )
{
xCellularStatus = Cellular_SetEidrxSettings( _cellularHandle, &eidrxSettings );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS != xCellularStatus, xCellularStatus );
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Call Cellular_SetPdnConfig( _cellularHandle ) with an invalid mode and verify failure.
*/
TEST( Full_CELLULAR_API, Cellular_SetPdnConfig_InvalidMode )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
/* Set the invalid PDN context type. */
CellularPdnConfig_t pdnConfig =
{ CELLULAR_PDN_CONTEXT_TYPE_MAX, CELLULAR_PDN_AUTH_NONE, TEST_INVALID_CELLULAR_APN, "", "" };
if( prvIsConnectedCellular() == pdFAIL )
{
TEST_ASSERT( prvConnectCellular() == pdPASS );
}
if( TEST_PROTECT() )
{
xCellularStatus = Cellular_SetPdnConfig( _cellularHandle, testCELLULAR_PDN_CONTEXT_ID, &pdnConfig );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS != xCellularStatus, xCellularStatus );
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Call Cellular_SetDns( _cellularHandle ) with an invalid mode and verify failure.
*/
TEST( Full_CELLULAR_API, Cellular_SetDns_InvalidMode )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
if( prvIsConnectedCellular() == pdFAIL )
{
TEST_ASSERT( prvConnectCellular() == pdPASS );
}
if( TEST_PROTECT() )
{
xCellularStatus = Cellular_SetDns( _cellularHandle, testCELLULAR_PDN_CONTEXT_ID, "123" );
TEST_CELLULAR_ASSERT_OPTIONAL_API( CELLULAR_SUCCESS != xCellularStatus, xCellularStatus );
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief CELLULAR data transfer loop.
*/
TEST( Full_CELLULAR_API, Cellular_Data_Loop )
{
uint8_t index = 0;
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
CellularSocketHandle_t socketHandle = NULL;
uint32_t sentDataLen = 0;
char receiveBuff[ 100 ] = { 0 };
uint32_t receivedDataLen = 0;
char cBuffer[ MESSAGE_BUFFER_LENGTH ] = { '\0' };
PlatformEventGroupHandle_t socketEventGroup = NULL;
PlatformEventGroup_EventBits eventBits = 0;
if( prvIsConnectedCellular() == pdFAIL )
{
TEST_ASSERT( prvConnectCellular() == pdPASS );
}
if( TEST_PROTECT() )
{
for( index = 0; index < testCELLULARCONNECTION_LOOP_TIMES; ++index )
{
socketHandle = prvSocketConnectionSetup( testCELLULAR_ECHO_SERVER_PORT,
testCELLULAR_ECHO_SERVER_ADDRESS,
&socketEventGroup );
/* Send Data on Socket. */
xCellularStatus = Cellular_SocketSend( _cellularHandle, socketHandle, ( const uint8_t * ) _socketDataSend, strlen( _socketDataSend ),
&sentDataLen );
snprintf( cBuffer, sizeof( cBuffer ), "Failed Cellular_SocketSend( _cellularHandle ) in iteration %d", index );
TEST_CELLULAR_ASSERT_REQUIRED_API_MSG( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus, cBuffer );
/* Receive Data on Socket. */
eventBits = PlatformEventGroup_WaitBits( socketEventGroup,
SOCKET_DATA_RECEIVED_CALLBACK_BIT,
true,
false,
pdMS_TO_TICKS( testCELLULAR_SOCKET_RECEIVE_TIMEOUT_MS ) );
TEST_ASSERT( ( eventBits & SOCKET_DATA_RECEIVED_CALLBACK_BIT ) != 0 );
xCellularStatus = Cellular_SocketRecv( _cellularHandle,
socketHandle,
( uint8_t * ) receiveBuff,
sizeof( receiveBuff ),
&receivedDataLen );
snprintf( cBuffer, sizeof( cBuffer ), "Failed Cellular_SocketRecv( _cellularHandle ) in iteration %d", index );
TEST_CELLULAR_ASSERT_REQUIRED_API_MSG( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus, cBuffer );
/* Compare Data on Socket. */
TEST_ASSERT_MESSAGE( strncmp( _socketDataSend, receiveBuff, strlen( _socketDataSend ) ) == 0,
"Cellular_Data_Loop received data compare failed" );
/* Close Socket. */
#ifdef CELLULAR_ASYNC_SOCKET_CLOSE
if( index < ( CELLULAR_NUM_SOCKET_MAX - 1 ) )
{
prvSocketConnectionClose( socketHandle, socketEventGroup, false );
}
else
{
prvSocketConnectionClose( socketHandle, socketEventGroup, true );
}
#else
prvSocketConnectionClose( socketHandle, socketEventGroup, false );
#endif
}
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief CELLULAR data transfer multiple connection.
*/
TEST( Full_CELLULAR_API, Cellular_MultipleSocketConnection )
{
uint8_t index = 0;
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
CellularSocketHandle_t socketHandles[ CELLULAR_NUM_SOCKET_MAX ] = { 0 };
uint32_t sentDataLen = 0;
char receiveBuff[ 100 ] = { 0 };
uint32_t receivedDataLen = 0;
char cBuffer[ MESSAGE_BUFFER_LENGTH ] = { '\0' };
PlatformEventGroupHandle_t socketEventGroups[ CELLULAR_NUM_SOCKET_MAX ] = { 0 };
PlatformEventGroup_EventBits eventBits = 0;
uint32_t loopCount = 0;
/* This test needs all the available socket. Reinitialize the cellular modem. */
TEST_ASSERT( prvConnectCellular() == pdPASS );
if( TEST_PROTECT() )
{
/* Open sockets. */
for( index = 0; index < CELLULAR_NUM_SOCKET_MAX; ++index )
{
socketHandles[ index ] = prvSocketConnectionSetup( testCELLULAR_ECHO_SERVER_PORT,
testCELLULAR_ECHO_SERVER_ADDRESS,
&socketEventGroups[ index ] );
}
/* Do more data transfer. */
for( loopCount = 0; loopCount < testCELLULARDATA_TRANSFER_LOOP_TIMES; loopCount++ )
{
for( index = 0; index < CELLULAR_NUM_SOCKET_MAX; ++index )
{
/* Send Data on Socket. */
xCellularStatus = Cellular_SocketSend( _cellularHandle,
socketHandles[ index ],
( const uint8_t * ) _socketDataSend,
strlen( _socketDataSend ),
&sentDataLen );
snprintf( cBuffer, sizeof( cBuffer ), "Failed Cellular_SocketSend( _cellularHandle ) in iteration %d", index );
TEST_CELLULAR_ASSERT_REQUIRED_API_MSG( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus, cBuffer );
/* Receive Data on Socket. */
eventBits = PlatformEventGroup_WaitBits( socketEventGroups[ index ],
SOCKET_DATA_RECEIVED_CALLBACK_BIT,
true,
false,
pdMS_TO_TICKS( testCELLULAR_SOCKET_RECEIVE_TIMEOUT_MS ) );
TEST_ASSERT( ( eventBits & SOCKET_DATA_RECEIVED_CALLBACK_BIT ) != 0 );
xCellularStatus = Cellular_SocketRecv( _cellularHandle,
socketHandles[ index ],
( uint8_t * ) receiveBuff,
sizeof( receiveBuff ),
&receivedDataLen );
snprintf( cBuffer, sizeof( cBuffer ), "Failed Cellular_SocketRecv( _cellularHandle ) in iteration %d", index );
TEST_CELLULAR_ASSERT_REQUIRED_API_MSG( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus, cBuffer );
/* Compare Data on Socket. */
TEST_ASSERT_MESSAGE( strncmp( _socketDataSend, receiveBuff, strlen( _socketDataSend ) ) == 0,
"Cellular_Data_Loop received data compare failed" );
}
}
/* Close Socket. */
for( index = 0; index < CELLULAR_NUM_SOCKET_MAX; ++index )
{
prvSocketConnectionClose( socketHandles[ index ], socketEventGroups[ index ], false );
}
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief CELLULAR airplane mode loop.
*/
TEST( Full_CELLULAR_API, Cellular_AirplaneMode_Loop )
{
char cBuffer[ MESSAGE_BUFFER_LENGTH ] = { '\0' };
uint8_t index = 0;
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
bool simReady = false;
if( prvIsConnectedCellular() == pdFAIL )
{
TEST_ASSERT( prvConnectCellular() == pdPASS );
}
if( TEST_PROTECT() )
{
for( index = 0; index < testCELLULARCONNECTION_LOOP_TIMES; ++index )
{
/* RF Off. */
xCellularStatus = Cellular_RfOff( _cellularHandle );
snprintf( cBuffer, sizeof( cBuffer ), "Failed Cellular_RfOff( _cellularHandle ) in iteration %d", index );
TEST_CELLULAR_ASSERT_REQUIRED_API_MSG( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus, cBuffer );
/* Wait until SIM is ready. */
simReady = prvWaitSimCardReady();
TEST_ASSERT( simReady == true );
/* RF On. */
xCellularStatus = Cellular_RfOn( _cellularHandle );
snprintf( cBuffer, sizeof( cBuffer ), "Failed Cellular_RfOn( _cellularHandle ) in iteration %d", index );
TEST_CELLULAR_ASSERT_REQUIRED_API_MSG( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus, cBuffer );
/* Wait until SIM is ready. */
simReady = prvWaitSimCardReady();
TEST_ASSERT( simReady == true );
}
( void ) Cellular_Cleanup( _cellularHandle );
_cellularHandle = NULL;
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief CELLULAR power cycle loop.
*/
TEST( Full_CELLULAR_API, Cellular_Power_Loop )
{
uint8_t index = 0;
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
CellularCommInterface_t * pCommIntf = &CellularCommInterface;
if( TEST_PROTECT() )
{
/* Clean previous setting. */
( void ) Cellular_Cleanup( _cellularHandle );
_cellularHandle = NULL;
for( index = 0; index < testCELLULARCONNECTION_LOOP_TIMES; ++index )
{
xCellularStatus = Cellular_Init( &_cellularHandle, pCommIntf );
TEST_CELLULAR_ASSERT_REQUIRED_API_MSG( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus,
">>> Cellular module can't be initialized <<<" );
/* Clean up. */
xCellularStatus = Cellular_Cleanup( _cellularHandle );
_cellularHandle = NULL;
TEST_CELLULAR_ASSERT_REQUIRED_API_MSG( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus,
">>> Cellular module can't be cleanup <<<" );
}
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/**
* @brief Test eDRX settings on echo server received times.
*
* ------------------------------|--------------------------------
* t1 | t2
* EDRX = 0 | EDRX = 1
* ( RX is on ) | ( RX is off periodically )
* ( Data reception is normal ) | ( Data reception is delayed )
* ------------------------------|--------------------------------
*/
TEST( Full_CELLULAR_API, Cellular_EidrxEchoTimes )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
CellularEidrxSettings_t eidrxSettings = { 0 };
CellularEidrxSettingsList_t eidrxSettingsList = { 0 };
uint8_t drxValue = 5; /* 5 = ( 0 1 0 1 ) 81.92 seconds. */
const uint32_t testTimoutMs = 80000U; /* Test waiting socket receive time. */
uint32_t normalReceiveTimes = 0;
uint32_t edrxReceiveTimes = 0;
if( prvIsConnectedCellular() == pdFAIL )
{
TEST_ASSERT( prvConnectCellular() == pdPASS );
}
if( TEST_PROTECT() )
{
/* Disable the EDRX mode. */
eidrxSettings.mode = 0;
eidrxSettings.rat = testCELLULAR_EDRX_RAT;
eidrxSettings.requestedEdrxVaue = 0;
xCellularStatus = Cellular_SetEidrxSettings( _cellularHandle, &eidrxSettings );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
/* Send the data to the server and wait for response. */
normalReceiveTimes = prvTestSocketReceiveCount( testTimoutMs, testCELLULAR_EDRX_ECHO_SERVER_DATA_SEND_INTERVAL_MS );
configPRINTF( ( "Normal echo test receive times %d\r\n", normalReceiveTimes ) );
Platform_Delay( testCELLULAR_EDRX_ECHO_SERVER_DATA_SEND_INTERVAL_MS );
/* Enabling the EDRX mode and verify. */
eidrxSettings.mode = 1;
eidrxSettings.rat = testCELLULAR_EDRX_RAT;
eidrxSettings.requestedEdrxVaue = drxValue;
xCellularStatus = Cellular_SetEidrxSettings( _cellularHandle, &eidrxSettings );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
xCellularStatus = Cellular_GetEidrxSettings( _cellularHandle, &eidrxSettingsList );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
/* Send the data to the server and wait for response.
* Data receive times is less in eDRX mode. */
edrxReceiveTimes = prvTestSocketReceiveCount( testTimoutMs, testCELLULAR_EDRX_ECHO_SERVER_DATA_SEND_INTERVAL_MS );
configPRINTF( ( "EDRX echo test receive times %d\r\n", edrxReceiveTimes ) );
TEST_ASSERT_MESSAGE( ( edrxReceiveTimes < normalReceiveTimes ),
"EDRX receive more times than normal" );
/* Disabling the EDRX mode. */
eidrxSettings.mode = 3;
eidrxSettings.rat = testCELLULAR_EDRX_RAT;
eidrxSettings.requestedEdrxVaue = 0;
configPRINTF( ( "Disable and reset EDRX settings\r\n" ) );
xCellularStatus = Cellular_SetEidrxSettings( _cellularHandle, &eidrxSettings );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
xCellularStatus = Cellular_GetEidrxSettings( _cellularHandle, &eidrxSettingsList );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
}
else
{
TEST_FAIL();
}
}
/*-----------------------------------------------------------*/
/*
* @brief Check cellular power saving mode status.
*
* --------------------|---------------------
* t1 | t2
* PSM = 0 | PSM = 1
* (at cmd works) | (at cmd fails)
* --------------------|---------------------
*/
TEST( Full_CELLULAR_API, Cellular_PsmStatus )
{
CellularError_t xCellularStatus = CELLULAR_SUCCESS;
CellularPsmSettings_t psmSettings = { 0 };
uint32_t psmTau = 4; /* 4 * 10 minutes = 40 minutes. */
uint32_t psmTimer = 14; /* 14 * 2 seconds = 28 Seconds. */
uint32_t tries = 0;
EventBits_t waitEventBits = 0;
if( prvIsConnectedCellular() == pdFAIL )
{
TEST_ASSERT( prvConnectCellular() == pdPASS );
}
if( TEST_PROTECT() )
{
/* Setup the modem event. */
_modemEventGroup = xEventGroupCreate();
TEST_ASSERT_MESSAGE( _modemEventGroup != NULL, "Create event group fail" );
xEventGroupClearBits( _modemEventGroup,
MODEM_EVENT_BOOTUP_OR_REBOOT_BIT | MODEM_EVENT_POWERED_DOWN_BIT | MODEM_EVENT_PSM_ENTER_BIT );
xCellularStatus = Cellular_RegisterModemEventCallback( _cellularHandle, prvCellularModemEventCallback, NULL );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
/* Disabling the PSM mode if ON. */
xCellularStatus = Cellular_GetPsmSettings( _cellularHandle, &psmSettings );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
if( psmSettings.mode == 1 )
{
psmSettings.mode = 0;
psmSettings.periodicTauValue = 0;
psmSettings.periodicRauValue = 0;
psmSettings.gprsReadyTimer = 0;
psmSettings.activeTimeValue = 0;
xCellularStatus = Cellular_SetPsmSettings( _cellularHandle, &psmSettings );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
}
/* Enabling the PSM mode and verify. */
psmSettings.mode = 1;
psmSettings.periodicTauValue = psmTau;
psmSettings.periodicRauValue = 0;
psmSettings.gprsReadyTimer = 0;
psmSettings.activeTimeValue = psmTimer;
xCellularStatus = Cellular_SetPsmSettings( _cellularHandle, &psmSettings );
TEST_CELLULAR_ASSERT_REQUIRED_API( CELLULAR_SUCCESS == xCellularStatus, xCellularStatus );
for( tries = 0; tries < testCELLULAR_MAX_GET_PSM_RETRY; tries++ )
{
xCellularStatus = Cellular_GetPsmSettings( _cellularHandle, &psmSettings );
if( xCellularStatus == CELLULAR_SUCCESS )
{
configPRINTF( ( "PSM mode polling %u\r\n", psmSettings.mode ) );
if( psmSettings.mode == 1 )
{
break;
}
}
Platform_Delay( testCELLULAR_GET_PSM_RETRY_INTERVAL_MS );
}
if( xCellularStatus == CELLULAR_SUCCESS )
{
TEST_ASSERT_EQUAL_INT32( psmSettings.mode, 1 );
configPRINTF( ( "PSM active time %u\r\n", psmSettings.activeTimeValue ) );
}
/* Wait until active timer expired. */
for( tries = 0; tries < testCELLULAR_WAIT_PSM_ENTER_EVENT_RETRY; tries++ )
{
configPRINTF( ( "Waiting PSM enter event %u\r\n", tries ) );
waitEventBits = xEventGroupWaitBits( _modemEventGroup,
MODEM_EVENT_PSM_ENTER_BIT,
pdTRUE,
pdFALSE,
pdMS_TO_TICKS( psmSettings.activeTimeValue * 1000UL ) );
if( ( waitEventBits & MODEM_EVENT_PSM_ENTER_BIT ) != 0 )
{
break;
}
}
/* Wait 5 seconds after PSM mode entered. */
Platform_Delay( 5000 );
/* Send the AT command to cellular module should return error. */
xCellularStatus = Cellular_ATCommandRaw( _cellularHandle,
NULL,
"AT",
CELLULAR_AT_NO_RESULT,
NULL,
NULL,
0U );
if( CELLULAR_SUCCESS == xCellularStatus )
{
configPRINTF( ( "Cellular modem still reply to AT. Ignore this test. \r\n" ) );
TEST_IGNORE();
}
}
else
{
TEST_FAIL();
}
if( _modemEventGroup != NULL )
{
vEventGroupDelete( _modemEventGroup );
_modemEventGroup = NULL;
}
}
/*-----------------------------------------------------------*/