Skip to content

Commit 5f752cc

Browse files
committed
Add unit test cases for FreeRTOS_multiply_int32 and FreeRTOS_add_int32
1 parent bb48c52 commit 5f752cc

File tree

4 files changed

+227
-0
lines changed

4 files changed

+227
-0
lines changed

test/unit-test/FreeRTOS_DHCPv6/FreeRTOS_DHCPv6_utest.c

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -729,6 +729,34 @@ static void prvPrepareAdvertiseNoServerID()
729729
prvAddOptionPreference( pdFALSE );
730730
}
731731

732+
/**
733+
* @brief Prepare buffer content as DHCPv6 advertise with extra option value 32.
734+
*/
735+
static void prvPrepareAdvertiseExtraOptionValue32()
736+
{
737+
/* We hard code the option sequence in advertise message.
738+
* 1. Client ID
739+
* 2. Server ID
740+
* 3. IA_NA
741+
* - Sub-option IA Address
742+
* - Sub-option IA Prefix
743+
* - Sub-option Status Code
744+
* 4. Status Code
745+
* 5. Preference
746+
* 6. Extra Option 32
747+
*/
748+
uint16_t usVal;
749+
750+
prvPrepareAdvertise();
751+
/* Add extra option with value 32. */
752+
usVal = 32;
753+
vAddBitOperation( eTestDHCPv6BitOperationRead16, &usVal, 2, "ExtraOption32" );
754+
usVal = 2U;
755+
vAddBitOperation( eTestDHCPv6BitOperationRead16, &usVal, 2, "ExtraOption32Length" );
756+
usVal = 0U;
757+
vAddBitOperation( eTestDHCPv6BitOperationReadCustom, &usVal, 2, "ExtraOptionStatusValue" );
758+
}
759+
732760
/**
733761
* @brief Prepare buffer content as DHCPv6 advertise.
734762
*/
@@ -2046,6 +2074,54 @@ void test_vDHCPv6Process_prvDHCPv6Analyse_LackServerID()
20462074
TEST_ASSERT_EQUAL( eWaitingOffer, xEndPoint.xDHCPData.eDHCPState );
20472075
}
20482076

2077+
/**
2078+
* @brief Check if vDHCPv6Process can skip setting bit map when the option value is 32.
2079+
*/
2080+
void test_vDHCPv6Process_prvDHCPv6Analyse_ExtraOptionValue32()
2081+
{
2082+
NetworkEndPoint_t xEndPoint;
2083+
DHCPMessage_IPv6_t xDHCPMessage;
2084+
struct xSOCKET xLocalDHCPv6Socket;
2085+
2086+
memset( &xEndPoint, 0, sizeof( NetworkEndPoint_t ) );
2087+
memset( &xLocalDHCPv6Socket, 0, sizeof( struct xSOCKET ) );
2088+
memset( &xDHCPMessage, 0, sizeof( DHCPMessage_IPv6_t ) );
2089+
2090+
pxNetworkEndPoints = &xEndPoint;
2091+
2092+
memcpy( xEndPoint.xMACAddress.ucBytes, ucDefaultMACAddress, sizeof( ucDefaultMACAddress ) );
2093+
memcpy( xEndPoint.ipv6_settings.xPrefix.ucBytes, &xDefaultNetPrefix.ucBytes, sizeof( IPv6_Address_t ) );
2094+
xEndPoint.ipv6_settings.uxPrefixLength = 64;
2095+
xEndPoint.bits.bIPv6 = pdTRUE;
2096+
xEndPoint.bits.bWantDHCP = pdTRUE;
2097+
2098+
xEndPoint.xDHCPData.eDHCPState = eWaitingOffer;
2099+
xEndPoint.xDHCPData.eExpectedState = eWaitingOffer;
2100+
xEndPoint.xDHCPData.ulTransactionId = TEST_DHCPV6_TRANSACTION_ID;
2101+
xEndPoint.xDHCPData.xDHCPSocket = &xLocalDHCPv6Socket;
2102+
memcpy( xEndPoint.xDHCPData.ucClientDUID, ucTestDHCPv6OptionClientID, sizeof( ucTestDHCPv6OptionClientID ) );
2103+
2104+
xEndPoint.pxDHCPMessage = &xDHCPMessage;
2105+
2106+
FreeRTOS_recvfrom_IgnoreAndReturn( 150 );
2107+
FreeRTOS_recvfrom_IgnoreAndReturn( 0 );
2108+
xTaskGetTickCount_IgnoreAndReturn( 0 );
2109+
2110+
prvPrepareAdvertiseExtraOptionValue32();
2111+
2112+
xApplicationGetRandomNumber_Stub( xStubxApplicationGetRandomNumber );
2113+
FreeRTOS_inet_pton6_IgnoreAndReturn( pdTRUE );
2114+
FreeRTOS_sendto_IgnoreAndReturn( 0 );
2115+
2116+
prvPrepareRequest();
2117+
2118+
vDHCPv6Process( pdFALSE, &xEndPoint );
2119+
2120+
/* The endpoint receives the DHCPv6 Advertise message from DHCPv6 server.
2121+
* Then change the state to eWaitingAcknowledge. */
2122+
TEST_ASSERT_EQUAL( eWaitingAcknowledge, xEndPoint.xDHCPData.eDHCPState );
2123+
}
2124+
20492125
/**
20502126
* @brief Check if vDHCPv6Process can drop packets while failing on initialization of bit configuration.
20512127
*/

test/unit-test/FreeRTOS_IP_Utils/FreeRTOS_IP_Utils_utest.c

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2908,6 +2908,65 @@ void test_FreeRTOS_min_size_t( void )
29082908
}
29092909
}
29102910

2911+
/**
2912+
* @brief test_FreeRTOS_add_int32
2913+
* To validate FreeRTOS_add_int32.
2914+
*/
2915+
void test_FreeRTOS_add_int32( void )
2916+
{
2917+
int32_t lResult;
2918+
2919+
lResult = FreeRTOS_add_int32( 1, 2 );
2920+
TEST_ASSERT_EQUAL( 3, lResult );
2921+
2922+
lResult = FreeRTOS_add_int32( ipINT32_MAX_VALUE, 1 );
2923+
TEST_ASSERT_EQUAL( ipINT32_MAX_VALUE, lResult );
2924+
2925+
lResult = FreeRTOS_add_int32( ipINT32_MIN_VALUE, -1 );
2926+
TEST_ASSERT_EQUAL( ipINT32_MIN_VALUE, lResult );
2927+
2928+
lResult = FreeRTOS_add_int32( -1, 1 );
2929+
TEST_ASSERT_EQUAL( 0, lResult );
2930+
}
2931+
2932+
/**
2933+
* @brief test_FreeRTOS_multiply_int32
2934+
* To validate FreeRTOS_multiply_int32.
2935+
*/
2936+
void test_FreeRTOS_multiply_int32( void )
2937+
{
2938+
int32_t lResult;
2939+
2940+
/* a > 0 */
2941+
lResult = FreeRTOS_multiply_int32( ipINT32_MAX_VALUE, ipINT32_MAX_VALUE );
2942+
TEST_ASSERT_EQUAL( ipINT32_MAX_VALUE, lResult );
2943+
2944+
lResult = FreeRTOS_multiply_int32( 10, ipINT32_MIN_VALUE );
2945+
TEST_ASSERT_EQUAL( ipINT32_MIN_VALUE, lResult );
2946+
2947+
lResult = FreeRTOS_multiply_int32( 10, 10 );
2948+
TEST_ASSERT_EQUAL( 100, lResult );
2949+
2950+
lResult = FreeRTOS_multiply_int32( 10, -1 );
2951+
TEST_ASSERT_EQUAL( -10, lResult );
2952+
2953+
lResult = FreeRTOS_multiply_int32( 10, 0 );
2954+
TEST_ASSERT_EQUAL( 0, lResult );
2955+
2956+
/* a <= 0 */
2957+
lResult = FreeRTOS_multiply_int32( ipINT32_MIN_VALUE, 10 );
2958+
TEST_ASSERT_EQUAL( ipINT32_MIN_VALUE, lResult );
2959+
2960+
lResult = FreeRTOS_multiply_int32( ipINT32_MIN_VALUE, ipINT32_MIN_VALUE );
2961+
TEST_ASSERT_EQUAL( ipINT32_MAX_VALUE, lResult );
2962+
2963+
lResult = FreeRTOS_multiply_int32( -1, 10 );
2964+
TEST_ASSERT_EQUAL( -10, lResult );
2965+
2966+
lResult = FreeRTOS_multiply_int32( -2, -2 );
2967+
TEST_ASSERT_EQUAL( 4, lResult );
2968+
}
2969+
29112970
/**
29122971
* @brief test_FreeRTOS_round_up
29132972
* To validate FreeRTOS_round_up.

test/unit-test/FreeRTOS_TCP_Reception/FreeRTOS_TCP_Reception_utest.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,36 @@ void test_prvSingleStepTCPHeaderOptions_Invalid_Length_WS( void )
557557
TEST_ASSERT_EQUAL( -1, result );
558558
}
559559

560+
/* Test for prvSingleStepTCPHeaderOptions function with valid WSopt value. */
561+
void test_prvSingleStepTCPHeaderOptions_Valid_WS( void )
562+
{
563+
int32_t result;
564+
565+
/* Setup TCP option for tests */
566+
pxNetworkBuffer = &xNetworkBuffer;
567+
pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
568+
size_t uxTCPHeaderOffset = ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv4_HEADER;
569+
570+
ProtocolHeaders_t * pxProtocolHeader = ( ( ProtocolHeaders_t * )
571+
&( pxNetworkBuffer->pucEthernetBuffer[ ( size_t ) ipSIZE_OF_ETH_HEADER + ipSIZE_OF_IPv4_HEADER ] ) );
572+
TCPHeader_t * pxTCPHeader = &( pxProtocolHeader->xTCPHeader );
573+
574+
pxTCPHeader->ucTCPOffset = 0x80;
575+
pxNetworkBuffer->xDataLength = 0x50;
576+
/* Input TCP option is tcpTCP_OPT_WSOPT, length 3 bytes, and the value is 6. */
577+
uint8_t ucTCPOptions[] = { 0x03, 0x03, 0x06 };
578+
memcpy( ( void * ) pxTCPHeader->ucOptdata, ( void * ) &ucTCPOptions, sizeof( ucTCPOptions ) );
579+
580+
result = prvSingleStepTCPHeaderOptions(
581+
pxTCPHeader->ucOptdata,
582+
3,
583+
pxSocket,
584+
pdTRUE );
585+
586+
TEST_ASSERT_EQUAL( 3, result );
587+
TEST_ASSERT_EQUAL( 6, pxSocket->u.xTCP.ucPeerWinScaleFactor );
588+
}
589+
560590
static uint32_t ulCalled = 0;
561591
static void xLocalFunctionPointer( Socket_t xSocket,
562592
size_t xLength )

test/unit-test/FreeRTOS_TCP_WIN/FreeRTOS_TCP_WIN_utest.c

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@
4949
#include "mock_FreeRTOS_IP.h"
5050
#include "mock_task.h"
5151

52+
#define winSRTT_INCREMENT_NEW 2 /**< New increment for the smoothed RTT. */
53+
#define winSRTT_INCREMENT_CURRENT 6 /**< Current increment for the smoothed RTT. */
54+
#define winSRTT_DECREMENT_NEW 1 /**< New decrement for the smoothed RTT. */
55+
#define winSRTT_DECREMENT_CURRENT 7 /**< Current decrement for the smoothed RTT. */
5256

5357
static void initializeList( List_t * const pxList );
5458

@@ -2477,6 +2481,9 @@ void test_ulTCPWindowTxSack( void )
24772481
/* --->ulTimerGetAge */
24782482
xTaskGetTickCount_ExpectAndReturn( 23 );
24792483
/* -->prvTCPWindowTxCheckAck_CalcSRTT */
2484+
FreeRTOS_multiply_int32_ExpectAndReturn( 23, winSRTT_DECREMENT_NEW, 23 * winSRTT_DECREMENT_NEW );
2485+
FreeRTOS_multiply_int32_ExpectAndReturn( xWindow.lSRTT, winSRTT_DECREMENT_CURRENT, xWindow.lSRTT * winSRTT_DECREMENT_CURRENT );
2486+
FreeRTOS_add_int32_ExpectAndReturn( xWindow.lSRTT * winSRTT_DECREMENT_CURRENT, 23 * winSRTT_DECREMENT_NEW, xWindow.lSRTT * winSRTT_DECREMENT_CURRENT + 23 * winSRTT_DECREMENT_NEW );
24802487
/* ->prvTCPWindowTxCheckAck */
24812488
uxListRemove_ExpectAnyArgsAndReturn( pdTRUE );
24822489
/* ulTCPWindowTxSack */
@@ -2521,6 +2528,10 @@ void test_ulTCPWindowTxSack_prvTCPWindowFastRetransmit_1( void )
25212528
/* -->prvTCPWindowTxCheckAck_CalcSRTT */
25222529
/* --->ulTimerGetAge */
25232530
xTaskGetTickCount_ExpectAndReturn( 69 );
2531+
FreeRTOS_multiply_int32_ExpectAndReturn( 69, winSRTT_INCREMENT_NEW, 69 * winSRTT_INCREMENT_NEW );
2532+
FreeRTOS_multiply_int32_ExpectAndReturn( xWindow.lSRTT, winSRTT_INCREMENT_CURRENT, xWindow.lSRTT * winSRTT_INCREMENT_CURRENT );
2533+
FreeRTOS_add_int32_ExpectAndReturn( xWindow.lSRTT * winSRTT_INCREMENT_CURRENT, 69 * winSRTT_INCREMENT_NEW, xWindow.lSRTT * winSRTT_INCREMENT_CURRENT + 69 * winSRTT_INCREMENT_NEW );
2534+
25242535
/* <--prvTCPWindowTxCheckAck_CalcSRTT */
25252536
/* <-prvTCPWindowTxCheckAck */
25262537
/* ulTCPWindowTxSack */
@@ -2701,3 +2712,54 @@ void test_ulTCPWindowTxSack_prvTCPWindowFastRetransmit_4_LoggingLTZero( void )
27012712

27022713
xTCPWindowLoggingLevel = xBackup;
27032714
}
2715+
2716+
2717+
void test_ulTCPWindowTxSack_prvTCPWindowFastRetransmit_5_ulTimerGetAgeReturnNegative( void )
2718+
{
2719+
uint32_t ulAckCount;
2720+
TCPWindow_t xWindow;
2721+
uint32_t ulFirst = 33;
2722+
uint32_t ulLast = 63;
2723+
TCPSegment_t mockSegment;
2724+
ListItem_t mockListItem;
2725+
2726+
initializeListItem( &mockListItem );
2727+
2728+
xWindow.tx.ulCurrentSequenceNumber = 32;
2729+
xWindow.lSRTT = ipconfigTCP_SRTT_MINIMUM_VALUE_MS + 30;
2730+
mockSegment.u.bits.bAcked = pdFALSE_UNSIGNED;
2731+
mockSegment.lDataLength = 30;
2732+
2733+
mockSegment.u.bits.ucTransmitCount = 1U;
2734+
mockSegment.ulSequenceNumber = 33;
2735+
mockListItem.pxContainer = &xWindow.xPriorityQueue;
2736+
mockSegment.xQueueItem = mockListItem;
2737+
mockSegment.xQueueItem.pxContainer = NULL;
2738+
mockSegment.u.bits.ucDupAckCount = 1U;
2739+
2740+
/* ->prvTCPWindowTxCheckAck */
2741+
listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) &mockListItem );
2742+
listGET_LIST_ITEM_OWNER_ExpectAnyArgsAndReturn( &mockSegment );
2743+
listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) &xWindow.xTxSegments.xListEnd );
2744+
/* -->prvTCPWindowTxCheckAck_CalcSRTT */
2745+
/* --->ulTimerGetAge */
2746+
xTaskGetTickCount_ExpectAndReturn( 0xFFFFFFFF ); /* prvTCPWindowTxCheckAck_CalcSRTT replaces negative value with ipINT32_MAX_VALUE. */
2747+
FreeRTOS_multiply_int32_ExpectAndReturn( ipINT32_MAX_VALUE, winSRTT_INCREMENT_NEW, ipINT32_MAX_VALUE );
2748+
FreeRTOS_multiply_int32_ExpectAndReturn( xWindow.lSRTT, winSRTT_INCREMENT_CURRENT, xWindow.lSRTT * winSRTT_INCREMENT_CURRENT );
2749+
FreeRTOS_add_int32_ExpectAndReturn( xWindow.lSRTT * winSRTT_INCREMENT_CURRENT, ipINT32_MAX_VALUE, ipINT32_MAX_VALUE );
2750+
2751+
/* <--prvTCPWindowTxCheckAck_CalcSRTT */
2752+
/* <-prvTCPWindowTxCheckAck */
2753+
/* ulTCPWindowTxSack */
2754+
/* ->prvTCPWindowFastRetransmit */
2755+
listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) &mockListItem );
2756+
listGET_LIST_ITEM_OWNER_ExpectAnyArgsAndReturn( &mockSegment );
2757+
/* exit the loop */
2758+
listGET_NEXT_ExpectAnyArgsAndReturn( ( ListItem_t * ) &xWindow.xWaitQueue.xListEnd );
2759+
2760+
ulAckCount = ulTCPWindowTxSack( &xWindow,
2761+
ulFirst,
2762+
ulLast );
2763+
TEST_ASSERT_EQUAL( 0, ulAckCount );
2764+
TEST_ASSERT_EQUAL( 268435455, xWindow.lSRTT ); /* Expected result is: ( 0x7FFFFFFF / 8 ). */
2765+
}

0 commit comments

Comments
 (0)