Skip to content

Commit 341d974

Browse files
committed
Fix UT coverage.
1 parent 3fee861 commit 341d974

File tree

10 files changed

+499
-39
lines changed

10 files changed

+499
-39
lines changed

source/FreeRTOS_IP.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1798,8 +1798,7 @@ static void prvProcessEthernetPacket( NetworkBufferDescriptor_t * const pxNetwor
17981798

17991799
break;
18001800
}
1801-
1802-
if( pxEthernetHeader->usFrameType == ipIPv6_FRAME_TYPE )
1801+
else if( pxEthernetHeader->usFrameType == ipIPv6_FRAME_TYPE )
18031802
{
18041803
#if ipconfigIS_ENABLED( ipconfigUSE_IPv6 )
18051804
if( pxNDWaitingNetworkBuffer == NULL )
@@ -1820,6 +1819,11 @@ static void prvProcessEthernetPacket( NetworkBufferDescriptor_t * const pxNetwor
18201819

18211820
break;
18221821
}
1822+
else
1823+
{
1824+
/* Unknown frame type, drop the packet. */
1825+
vReleaseNetworkBufferAndDescriptor( pxNetworkBuffer );
1826+
}
18231827

18241828
break;
18251829

source/FreeRTOS_ND.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -423,8 +423,6 @@
423423
*/
424424
void FreeRTOS_ClearND( const struct xNetworkEndPoint * pxEndPoint )
425425
{
426-
( void ) memset( xNDCache, 0, sizeof( xNDCache ) );
427-
428426
if( pxEndPoint != NULL )
429427
{
430428
BaseType_t x;

test/unit-test/FreeRTOS_ARP/FreeRTOS_ARP_utest.c

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1104,10 +1104,7 @@ void test_eARPProcessPacket_Reply_SenderAndTargetSame( void )
11041104
xARPHadIPClash = pdFALSE;
11051105

11061106
/* Let there be no timeout. Let the EndPoint be NULL */
1107-
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, &xNetworkBuffer );
1108-
vReleaseNetworkBufferAndDescriptor_Expect( &xNetworkBuffer );
1109-
xTaskGetTickCount_ExpectAndReturn( 0 );
1110-
vTaskSetTimeOutState_ExpectAnyArgs();
1107+
xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdFAIL );
11111108
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( NULL );
11121109

11131110
eResult = eARPProcessPacket( &xNetworkBuffer );
@@ -1118,10 +1115,7 @@ void test_eARPProcessPacket_Reply_SenderAndTargetSame( void )
11181115
/* Reset the flag. */
11191116
xARPHadIPClash = pdFALSE;
11201117
/* Let there be no timeout. */
1121-
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, &xNetworkBuffer );
1122-
vReleaseNetworkBufferAndDescriptor_Expect( &xNetworkBuffer );
1123-
xTaskGetTickCount_ExpectAndReturn( 0 );
1124-
vTaskSetTimeOutState_ExpectAnyArgs();
1118+
xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdFAIL );
11251119
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( &xEndPoint );
11261120

11271121
/* Call it again and do not expect the task functions to be called. */
@@ -1135,10 +1129,7 @@ void test_eARPProcessPacket_Reply_SenderAndTargetSame( void )
11351129
xEndPoint_2.ipv4_settings.ulIPAddress = ( uint32_t ) *( pxARPFrame->xARPHeader.ucSenderProtocolAddress + 0x11 );
11361130

11371131
/* Let there be no timeout. Let the EndPoint be NULL */
1138-
pxGetNetworkBufferWithDescriptor_ExpectAndReturn( sizeof( ARPPacket_t ), 0, &xNetworkBuffer );
1139-
vReleaseNetworkBufferAndDescriptor_Expect( &xNetworkBuffer );
1140-
xTaskGetTickCount_ExpectAndReturn( 0 );
1141-
vTaskSetTimeOutState_ExpectAnyArgs();
1132+
xTaskCheckForTimeOut_ExpectAnyArgsAndReturn( pdFAIL );
11421133
FreeRTOS_FindEndPointOnIP_IPv4_ExpectAnyArgsAndReturn( &xEndPoint_2 );
11431134

11441135
eResult = eARPProcessPacket( &xNetworkBuffer );

test/unit-test/FreeRTOS_ARP/ut.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ list(APPEND mock_define_list
3939

4040
# list the files you would like to test here
4141
list(APPEND real_source_files
42-
${CMAKE_BINARY_DIR}/Annexed_TCP_Sources/${project_name}.c
42+
${MODULE_ROOT_DIR}/source/FreeRTOS_ARP.c
4343
)
4444
# list the directories the module under test includes
4545
list(APPEND real_include_directories

test/unit-test/FreeRTOS_ARP_DataLenLessThanMinPacket/ut.cmake

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ list(APPEND mock_define_list
4141
# list the files you would like to test here
4242
set(real_source_files "")
4343
list(APPEND real_source_files
44-
${CMAKE_BINARY_DIR}/Annexed_TCP_Sources/FreeRTOS_ARP.c
44+
${MODULE_ROOT_DIR}/source/FreeRTOS_ARP.c
4545
)
4646
# list the directories the module under test includes
4747
set(real_include_directories "")

test/unit-test/FreeRTOS_IP/FreeRTOS_IP_utest.c

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2387,6 +2387,122 @@ void test_prvProcessEthernetPacket_InterfaceNull( void )
23872387
prvProcessEthernetPacket( pxNetworkBuffer );
23882388
}
23892389

2390+
/**
2391+
* @brief test_prvProcessEthernetPacket_IPv4FrameType_NeedARPResolution
2392+
* To validate the flow to handle IPv4 packets and it needs ARP resolution.
2393+
* But we already have one ARP packet pending so that buffer got released
2394+
* at the end.
2395+
*/
2396+
void test_prvProcessEthernetPacket_IPv4FrameType_NeedARPResolution( void )
2397+
{
2398+
NetworkBufferDescriptor_t xNetworkBuffer;
2399+
NetworkBufferDescriptor_t * pxNetworkBuffer = &xNetworkBuffer;
2400+
uint8_t ucEthernetBuffer[ ipconfigTCP_MSS ] = { 0 };
2401+
EthernetHeader_t * pxEthernetHeader;
2402+
IPPacket_t * pxIPPacket;
2403+
IPHeader_t * pxIPHeader;
2404+
struct xNetworkInterface xInterface;
2405+
NetworkEndPoint_t xNetworkEndPoint = { 0 };
2406+
2407+
pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
2408+
pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
2409+
pxNetworkBuffer->pxInterface = &xInterface;
2410+
pxNetworkBuffer->pxEndPoint = &xNetworkEndPoint;
2411+
2412+
pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
2413+
pxEthernetHeader->usFrameType = ipIPv4_FRAME_TYPE;
2414+
2415+
pxIPPacket = ( IPPacket_t * ) pxNetworkBuffer->pucEthernetBuffer;
2416+
pxIPHeader = &( pxIPPacket->xIPHeader );
2417+
pxIPHeader->ucVersionHeaderLength = 0x45;
2418+
2419+
pxARPWaitingNetworkBuffer = ( NetworkBufferDescriptor_t * ) 0x1234ABCD;
2420+
2421+
prvAllowIPPacketIPv4_ExpectAndReturn( pxIPPacket, pxNetworkBuffer, ( pxIPHeader->ucVersionHeaderLength & 0x0FU ) << 2, eProcessBuffer );
2422+
xCheckRequiresResolution_ExpectAndReturn( pxNetworkBuffer, pdTRUE );
2423+
vReleaseNetworkBufferAndDescriptor_Expect( pxNetworkBuffer );
2424+
2425+
prvProcessEthernetPacket( pxNetworkBuffer );
2426+
}
2427+
2428+
/**
2429+
* @brief test_prvProcessEthernetPacket_IPv6FrameType_NeedNDResolution
2430+
* To validate the flow to handle IPv4 packets and it needs ND resolution.
2431+
* But we already have one ND packet pending so that buffer got released
2432+
* at the end.
2433+
*/
2434+
void test_prvProcessEthernetPacket_IPv6FrameType_NeedNDResolution( void )
2435+
{
2436+
NetworkBufferDescriptor_t xNetworkBuffer;
2437+
NetworkBufferDescriptor_t * pxNetworkBuffer = &xNetworkBuffer;
2438+
uint8_t ucEthernetBuffer[ ipconfigTCP_MSS ] = { 0 };
2439+
EthernetHeader_t * pxEthernetHeader;
2440+
IPPacket_IPv6_t * pxIPv6Packet;
2441+
IPHeader_IPv6_t * pxIPv6Header;
2442+
struct xNetworkInterface xInterface;
2443+
NetworkEndPoint_t xNetworkEndPoint = { 0 };
2444+
2445+
pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
2446+
pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
2447+
pxNetworkBuffer->pxInterface = &xInterface;
2448+
pxNetworkBuffer->pxEndPoint = &xNetworkEndPoint;
2449+
2450+
pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
2451+
pxEthernetHeader->usFrameType = ipIPv6_FRAME_TYPE;
2452+
2453+
pxIPv6Packet = ( IPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
2454+
pxIPv6Header = &( pxIPv6Packet->xIPHeader );
2455+
pxIPv6Header->ucNextHeader = ipPROTOCOL_TCP;
2456+
2457+
pxNDWaitingNetworkBuffer = ( NetworkBufferDescriptor_t * ) 0x1234ABCD;
2458+
2459+
prvAllowIPPacketIPv6_ExpectAndReturn( pxIPv6Header, pxNetworkBuffer, ipSIZE_OF_IPv6_HEADER, eProcessBuffer );
2460+
xGetExtensionOrder_ExpectAndReturn( ipPROTOCOL_TCP, 0, -1 );
2461+
xCheckRequiresResolution_ExpectAndReturn( pxNetworkBuffer, pdTRUE );
2462+
vReleaseNetworkBufferAndDescriptor_Expect( pxNetworkBuffer );
2463+
2464+
prvProcessEthernetPacket( pxNetworkBuffer );
2465+
}
2466+
2467+
/**
2468+
* @brief test_prvProcessEthernetPacket_IPv6FrameType_NeedNDResolution2
2469+
* To validate the flow to handle IPv6 packets and it needs ND resolution.
2470+
* And we don't have any pending ND packet.
2471+
*/
2472+
void test_prvProcessEthernetPacket_IPv6FrameType_NeedNDResolution2( void )
2473+
{
2474+
NetworkBufferDescriptor_t xNetworkBuffer;
2475+
NetworkBufferDescriptor_t * pxNetworkBuffer = &xNetworkBuffer;
2476+
uint8_t ucEthernetBuffer[ ipconfigTCP_MSS ] = { 0 };
2477+
EthernetHeader_t * pxEthernetHeader;
2478+
IPPacket_IPv6_t * pxIPv6Packet;
2479+
IPHeader_IPv6_t * pxIPv6Header;
2480+
struct xNetworkInterface xInterface;
2481+
NetworkEndPoint_t xNetworkEndPoint = { 0 };
2482+
2483+
pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
2484+
pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
2485+
pxNetworkBuffer->pxInterface = &xInterface;
2486+
pxNetworkBuffer->pxEndPoint = &xNetworkEndPoint;
2487+
2488+
pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
2489+
pxEthernetHeader->usFrameType = ipIPv6_FRAME_TYPE;
2490+
2491+
pxIPv6Packet = ( IPPacket_IPv6_t * ) pxNetworkBuffer->pucEthernetBuffer;
2492+
pxIPv6Header = &( pxIPv6Packet->xIPHeader );
2493+
pxIPv6Header->ucNextHeader = ipPROTOCOL_TCP;
2494+
2495+
pxNDWaitingNetworkBuffer = NULL;
2496+
2497+
prvAllowIPPacketIPv6_ExpectAndReturn( pxIPv6Header, pxNetworkBuffer, ipSIZE_OF_IPv6_HEADER, eProcessBuffer );
2498+
xGetExtensionOrder_ExpectAndReturn( ipPROTOCOL_TCP, 0, -1 );
2499+
xCheckRequiresResolution_ExpectAndReturn( pxNetworkBuffer, pdTRUE );
2500+
vIPTimerStartNDResolution_ExpectAnyArgs();
2501+
2502+
prvProcessEthernetPacket( pxNetworkBuffer );
2503+
2504+
TEST_ASSERT_EQUAL_PTR( pxNetworkBuffer, pxNDWaitingNetworkBuffer );
2505+
}
23902506

23912507
/**
23922508
* @brief test_prvProcessIPPacket_HeaderLengthSmaller

test/unit-test/FreeRTOS_IP_DiffConfig3/FreeRTOSIPConfig.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@
263263
* because the packet will already have been passed into the stack). If the
264264
* Ethernet driver does all the necessary filtering in hardware then software
265265
* filtering can be removed by using a value other than 1 or 0. */
266-
#define ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES 1
266+
#define ipconfigETHERNET_DRIVER_FILTERS_FRAME_TYPES 0
267267

268268
/* When ipconfigETHERNET_DRIVER_FILTERS_PACKETS is enabled, the network
269269
* interface will inspect the incoming packets to see if they can be
@@ -348,4 +348,6 @@
348348
#define ipconfigIP_PASS_PACKETS_WITH_IP_OPTIONS ( 0 )
349349
#define ipconfigZERO_COPY_TX_DRIVER ( 1 )
350350

351+
#define ipconfigPROCESS_CUSTOM_ETHERNET_FRAMES ( 1 )
352+
351353
#endif /* FREERTOS_IP_CONFIG_H */

test/unit-test/FreeRTOS_IP_DiffConfig3/FreeRTOS_IP_DiffConfig3_utest.c

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@
4646
#include "mock_FreeRTOS_IP_Timers.h"
4747
#include "mock_FreeRTOS_DHCP.h"
4848
#include "mock_FreeRTOS_DHCPv6.h"
49+
#include "mock_NetworkBufferManagement.h"
50+
#include "mock_FreeRTOS_Routing.h"
4951

5052
#include "FreeRTOS_IP.h"
5153

@@ -84,6 +86,14 @@ void tearDown( void )
8486

8587
/* ======================== Stub Callback Functions ========================= */
8688

89+
eFrameProcessingResult_t eApplicationProcessCustomFrameHook( NetworkBufferDescriptor_t * const pxNetworkBuffer )
90+
{
91+
( void ) ( pxNetworkBuffer );
92+
93+
/* Force hook function to return waiting resultion for unknown Ethernet frame type. */
94+
return eWaitingResolution;
95+
}
96+
8797
/* ============================== Test Cases ============================== */
8898

8999
/**
@@ -179,3 +189,60 @@ void test_prvProcessIPEventsAndTimers_eDHCPEvent_RA( void )
179189

180190
prvProcessIPEventsAndTimers();
181191
}
192+
193+
/**
194+
* @brief test_prvProcessEthernetPacket_UnknownFrameType_NeedResolution
195+
* But we release the network buffer because the frame type is unknown.
196+
*/
197+
void test_prvProcessEthernetPacket_UnknownFrameType_NeedResolution( void )
198+
{
199+
NetworkBufferDescriptor_t xNetworkBuffer;
200+
NetworkBufferDescriptor_t * pxNetworkBuffer = &xNetworkBuffer;
201+
uint8_t ucEthernetBuffer[ ipconfigTCP_MSS ] = { 0 };
202+
EthernetHeader_t * pxEthernetHeader;
203+
IPPacket_IPv6_t * pxIPv6Packet;
204+
IPHeader_IPv6_t * pxIPv6Header;
205+
struct xNetworkInterface xInterface;
206+
NetworkEndPoint_t xNetworkEndPoint = { 0 };
207+
208+
pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
209+
pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
210+
pxNetworkBuffer->pxInterface = &xInterface;
211+
pxNetworkBuffer->pxEndPoint = &xNetworkEndPoint;
212+
213+
pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
214+
pxEthernetHeader->usFrameType = 0xFFFF;
215+
216+
vReleaseNetworkBufferAndDescriptor_Expect( pxNetworkBuffer );
217+
218+
prvProcessEthernetPacket( pxNetworkBuffer );
219+
}
220+
221+
/**
222+
* @brief test_prvProcessEthernetPacket_UnknownFrameType_NeedResolution
223+
* But we release the network buffer because the frame type is unknown.
224+
*/
225+
void test_prvProcessEthernetPacket_IPv4FrameType_CheckFrameFail( void )
226+
{
227+
NetworkBufferDescriptor_t xNetworkBuffer;
228+
NetworkBufferDescriptor_t * pxNetworkBuffer = &xNetworkBuffer;
229+
uint8_t ucEthernetBuffer[ ipconfigTCP_MSS ] = { 0 };
230+
EthernetHeader_t * pxEthernetHeader;
231+
IPPacket_IPv6_t * pxIPv6Packet;
232+
IPHeader_IPv6_t * pxIPv6Header;
233+
struct xNetworkInterface xInterface;
234+
NetworkEndPoint_t xNetworkEndPoint = { 0 };
235+
236+
pxNetworkBuffer->xDataLength = ipconfigTCP_MSS;
237+
pxNetworkBuffer->pucEthernetBuffer = ucEthernetBuffer;
238+
pxNetworkBuffer->pxInterface = &xInterface;
239+
pxNetworkBuffer->pxEndPoint = &xNetworkEndPoint;
240+
241+
pxEthernetHeader = ( EthernetHeader_t * ) pxNetworkBuffer->pucEthernetBuffer;
242+
pxEthernetHeader->usFrameType = ipIPv4_FRAME_TYPE;
243+
244+
FreeRTOS_FindEndPointOnMAC_ExpectAndReturn( &pxEthernetHeader->xDestinationAddress, NULL, NULL );
245+
vReleaseNetworkBufferAndDescriptor_Expect( pxNetworkBuffer );
246+
247+
prvProcessEthernetPacket( pxNetworkBuffer );
248+
}

0 commit comments

Comments
 (0)