1
0
mirror of https://github.com/FreeRTOS/FreeRTOS-Plus-TCP synced 2025-10-24 20:29:40 +08:00
Files
FreeRTOS-Plus-TCP/test/unit-test/FreeRTOS_Stream_Buffer/FreeRTOS_Stream_Buffer_utest.c
Aniruddha Kanhere 1ab6eb8885 Update version numbers and licensing info (#541)
* Update source location for coverity

* Add coverage checker

* Add build check with default configuration

* Fix build combination and DNS error

* uncrustified and fixed cmakelists

* This commit updates version number in all files to Development-Branch

* Update version number macros

* This commit fixes a typo in version number macro

* Added a 'critical section' to prevent a race condition in stream buffers

* Uncrustify: triggered by comment.

* Fixed unit-tests by adding mocked functions

* Initial commit of file README.md

* Update README.md

* Fix the title of README file in coverity

* Addressed issue comments

* Update command

* Add details about remaining exception

* Move file to original location

* Remove use of sudo in commands

* Fix links; added coverity version note

* Update README.md

* Remove CMake installation instructions

* Update manifest/history and copyright year

* Update kernel version to 10.4.5

* Update remaining copyright year instances

* Update the version number macros

* Update license header titles

* Remove kernel license header and add TCP header

Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: Gaurav-Aggarwal-AWS <33462878+aggarg@users.noreply.github.com>
2022-08-12 16:21:44 -07:00

1278 lines
41 KiB
C

/*
* FreeRTOS+TCP <DEVELOPMENT BRANCH>
* Copyright (C) 2022 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* SPDX-License-Identifier: MIT
*
* 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.
*
* http://aws.amazon.com/freertos
* http://www.FreeRTOS.org
*/
/* Include Unity header */
#include "unity.h"
/* Include standard libraries */
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include "mock_task.h"
#include "mock_semphr.h"
#include "mock_FreeRTOS_IP.h"
#include "mock_FreeRTOS_Sockets.h"
#include "mock_FreeRTOS_IP_Private.h"
#include "mock_FreeRTOS_UDP_IP.h"
#include "FreeRTOS_Stream_Buffer.h"
#include "catch_assert.h"
#include "FreeRTOSIPConfig.h"
/*
* @brief Function to calculate smaller of the two numbers given.
*/
static size_t FreeRTOS_min_stub( size_t a,
size_t b,
int callback_count )
{
/* Avoid compiler warnings about unused variable. */
( void ) callback_count;
if( a < b )
{
return a;
}
else
{
return b;
}
}
/*
* @brief Test when upper and lower values are same.
*/
void test_uxStreamBufferSpace_SameLocation( void )
{
StreamBuffer_t xLocalBuffer;
xLocalBuffer.LENGTH = 10;
size_t xReturn;
size_t uxUpper = 0;
size_t uxLower = 0;
xReturn = uxStreamBufferSpace( &xLocalBuffer, uxUpper, uxLower );
TEST_ASSERT_EQUAL( xLocalBuffer.LENGTH + uxUpper - uxLower - 1, xReturn );
}
/*
* @brief Test when upper is greater than lower value.
*/
void test_uxStreamBufferSpace_UpperGTLower( void )
{
StreamBuffer_t xLocalBuffer;
xLocalBuffer.LENGTH = 10;
size_t xReturn;
size_t uxUpper = 5;
size_t uxLower = 0;
xReturn = uxStreamBufferSpace( &xLocalBuffer, uxUpper, uxLower );
TEST_ASSERT_EQUAL( uxUpper - uxLower - 1, xReturn );
}
/*
* @brief Test when upper is smaller than lower value.
*/
void test_uxStreamBufferSpace_UpperLTLower( void )
{
StreamBuffer_t xLocalBuffer;
xLocalBuffer.LENGTH = 10;
size_t xReturn;
size_t uxUpper = 0;
size_t uxLower = 5;
xReturn = uxStreamBufferSpace( &xLocalBuffer, uxUpper, uxLower );
TEST_ASSERT_EQUAL( xLocalBuffer.LENGTH + uxUpper - uxLower - 1, xReturn );
}
/*
* @brief Test when upper and lower are same value.
*/
void test_uxStreamBufferDistance_SameLocation( void )
{
StreamBuffer_t xLocalBuffer;
xLocalBuffer.LENGTH = 10;
size_t xReturn;
size_t uxUpper = 0;
size_t uxLower = 0;
xReturn = uxStreamBufferDistance( &xLocalBuffer, uxUpper, uxLower );
TEST_ASSERT_EQUAL( uxUpper - uxLower, xReturn );
}
/*
* @brief Test when upper is greater than lower value.
*/
void test_uxStreamBufferDistance_UpperGTLower( void )
{
StreamBuffer_t xLocalBuffer;
xLocalBuffer.LENGTH = 10;
size_t xReturn;
size_t uxUpper = 5;
size_t uxLower = 0;
xReturn = uxStreamBufferDistance( &xLocalBuffer, uxUpper, uxLower );
TEST_ASSERT_EQUAL( uxUpper - uxLower, xReturn );
}
/*
* @brief Test when upper is smaller than lower value.
*/
void test_uxStreamBufferDistance_UpperLTLower( void )
{
StreamBuffer_t xLocalBuffer;
xLocalBuffer.LENGTH = 10;
size_t xReturn;
size_t uxUpper = 0;
size_t uxLower = 5;
xReturn = uxStreamBufferDistance( &xLocalBuffer, uxUpper, uxLower );
TEST_ASSERT_EQUAL( xLocalBuffer.LENGTH + uxUpper - uxLower, xReturn );
}
/*
* @brief Test the wrapper and assert on the output.
*/
void test_uxStreamBufferGetSpace( void )
{
size_t uxHead = 10;
size_t uxTail = 5;
size_t uxReturn;
StreamBuffer_t xLocalBuffer;
xLocalBuffer.LENGTH = 10;
xLocalBuffer.uxHead = uxHead;
xLocalBuffer.uxTail = uxTail;
uxReturn = uxStreamBufferGetSpace( &xLocalBuffer );
TEST_ASSERT_EQUAL( uxHead - uxTail - 1, uxReturn );
}
/*
* @brief Test the wrapper and assert on the output.
*/
void test_uxStreamBufferFrontSpace( void )
{
size_t uxFront = 10;
size_t uxTail = 5;
size_t uxReturn;
StreamBuffer_t xLocalBuffer;
xLocalBuffer.LENGTH = 10;
xLocalBuffer.uxFront = uxFront;
xLocalBuffer.uxTail = uxTail;
uxReturn = uxStreamBufferFrontSpace( &xLocalBuffer );
TEST_ASSERT_EQUAL( uxFront - uxTail - 1, uxReturn );
}
/*
* @brief Test the wrapper and assert on the output.
*/
void test_uxStreamBufferGetSize( void )
{
size_t uxHead = 10;
size_t uxTail = 5;
size_t uxReturn;
StreamBuffer_t xLocalBuffer;
xLocalBuffer.LENGTH = 10;
xLocalBuffer.uxHead = uxHead;
xLocalBuffer.uxTail = uxTail;
uxReturn = uxStreamBufferGetSize( &xLocalBuffer );
TEST_ASSERT_EQUAL( uxHead - uxTail, uxReturn );
}
/*
* @brief Test the wrapper and assert on the output.
*/
void test_uxStreamBufferMidSpace( void )
{
size_t uxHead = 10;
size_t uxMid = 5;
size_t uxReturn;
StreamBuffer_t xLocalBuffer;
xLocalBuffer.LENGTH = 10;
xLocalBuffer.uxHead = uxHead;
xLocalBuffer.uxMid = uxMid;
uxReturn = uxStreamBufferMidSpace( &xLocalBuffer );
TEST_ASSERT_EQUAL( uxHead - uxMid, uxReturn );
}
/*
* @brief Clear the stream buffer and test the values.
*/
void test_vStreamBufferClear( void )
{
StreamBuffer_t xLocalBuffer;
xLocalBuffer.LENGTH = 10;
xLocalBuffer.uxHead = 10;
xLocalBuffer.uxTail = 10;
xLocalBuffer.uxFront = 10;
xLocalBuffer.uxMid = 10;
vStreamBufferClear( &xLocalBuffer );
/* Make sure that all values except the length are reset to 0. */
TEST_ASSERT_EQUAL( 10, xLocalBuffer.LENGTH );
TEST_ASSERT_EQUAL( 0, xLocalBuffer.uxHead );
TEST_ASSERT_EQUAL( 0, xLocalBuffer.uxTail );
TEST_ASSERT_EQUAL( 0, xLocalBuffer.uxFront );
TEST_ASSERT_EQUAL( 0, xLocalBuffer.uxMid );
}
/*
* @brief Test moving the mid of the stream buffer when the
* count is less than the distance.
*/
void test_vStreamBufferMoveMid_CountLTDistance( void )
{
size_t Mid = 5;
size_t uxCount = 2;
StreamBuffer_t xLocalBuffer;
xLocalBuffer.LENGTH = 10;
xLocalBuffer.uxHead = 9;
xLocalBuffer.uxMid = Mid;
vStreamBufferMoveMid( &xLocalBuffer, uxCount );
TEST_ASSERT_EQUAL( Mid + uxCount, xLocalBuffer.uxMid );
}
/*
* @brief Test moving the mid of the stream buffer when the
* count is greater than the distance.
*/
void test_vStreamBufferMoveMid_CountGTDistance( void )
{
size_t Mid = 5;
size_t uxCount = 5;
StreamBuffer_t xLocalBuffer;
xLocalBuffer.LENGTH = 10;
xLocalBuffer.uxHead = 9;
xLocalBuffer.uxMid = Mid;
vStreamBufferMoveMid( &xLocalBuffer, uxCount );
/* Since we wanted to move mid further than the head, now mid will
* point to head as well. */
TEST_ASSERT_EQUAL( xLocalBuffer.uxHead, xLocalBuffer.uxMid );
}
/*
* @brief Test moving the mid of the stream buffer when the
* count is equal to the distance and there is a rollover.
*/
void test_vStreamBufferMoveMid_CountEQDistance_RollOver( void )
{
size_t Mid = 5;
size_t uxCount = 8;
StreamBuffer_t xLocalBuffer;
xLocalBuffer.LENGTH = 10;
xLocalBuffer.uxHead = 3;
xLocalBuffer.uxMid = Mid;
vStreamBufferMoveMid( &xLocalBuffer, uxCount );
/* Since we wanted to move mid equal to the distance, and the head has rolled over,
* mid will also roll over. */
TEST_ASSERT_EQUAL( xLocalBuffer.uxHead, xLocalBuffer.uxMid );
}
/*
* @brief Test when left and right are zero.
*/
void test_xStreamBufferLessThenEqual_LeftRightZero( void )
{
StreamBuffer_t xLocalBuffer;
xLocalBuffer.LENGTH = 10;
xLocalBuffer.uxTail = 10;
BaseType_t xResult;
xResult = xStreamBufferLessThenEqual( &xLocalBuffer, 0, 0 );
TEST_ASSERT_EQUAL( pdTRUE, xResult );
}
/*
* @brief Test when left and right are non zero but equal and are less
* than tail pointer.
*/
void test_xStreamBufferLessThenEqual_LeftRightNonZeroButEqual( void )
{
StreamBuffer_t xLocalBuffer;
xLocalBuffer.LENGTH = 10;
xLocalBuffer.uxTail = 10;
BaseType_t xResult;
size_t uxValue = 2;
xResult = xStreamBufferLessThenEqual( &xLocalBuffer, uxValue, uxValue );
TEST_ASSERT_EQUAL( pdTRUE, xResult );
}
/*
* @brief Test when left and right are equal but are greater than tail.
*/
void test_xStreamBufferLessThenEqual_LeftRightEqualButGreaterThanTail( void )
{
StreamBuffer_t xLocalBuffer;
xLocalBuffer.LENGTH = 10;
xLocalBuffer.uxTail = 5;
BaseType_t xResult;
size_t uxValue = 6;
xResult = xStreamBufferLessThenEqual( &xLocalBuffer, uxValue, uxValue );
TEST_ASSERT_EQUAL( pdTRUE, xResult );
}
/*
* @brief Test when Left is greater than right and both are greater than tail.
*/
void test_xStreamBufferLessThenEqual_LeftGTRightBothGreaterThanTail( void )
{
StreamBuffer_t xLocalBuffer;
xLocalBuffer.LENGTH = 10;
xLocalBuffer.uxTail = 5;
BaseType_t xResult;
size_t uxLeft = 7;
size_t uxRight = 6;
xResult = xStreamBufferLessThenEqual( &xLocalBuffer, uxLeft, uxRight );
TEST_ASSERT_EQUAL( pdFALSE, xResult );
}
/*
* @brief Test when left is greater than right and tail. Right is smaller
* than the tail.
*/
void test_xStreamBufferLessThenEqual_LeftGTRightAndTail( void )
{
StreamBuffer_t xLocalBuffer;
xLocalBuffer.LENGTH = 10;
xLocalBuffer.uxTail = 5;
BaseType_t xResult;
size_t uxLeft = 7;
size_t uxRight = 4;
xResult = xStreamBufferLessThenEqual( &xLocalBuffer, uxLeft, uxRight );
TEST_ASSERT_EQUAL( pdTRUE, xResult );
}
/*
* @brief Test when left is less than both right and tail. Right is greater
* than the tail.
*/
void test_xStreamBufferLessThenEqual_LeftLTRightAndTail( void )
{
StreamBuffer_t xLocalBuffer;
xLocalBuffer.LENGTH = 10;
xLocalBuffer.uxTail = 5;
BaseType_t xResult;
size_t uxLeft = 4;
size_t uxRight = 7;
xResult = xStreamBufferLessThenEqual( &xLocalBuffer, uxLeft, uxRight );
TEST_ASSERT_EQUAL( pdFALSE, xResult );
}
/*
* @brief Test getting a pointer to the data.
*/
void test_uxStreamBufferGetPtr( void )
{
StreamBuffer_t xLocalBuffer;
xLocalBuffer.LENGTH = 10;
xLocalBuffer.uxTail = 5;
size_t uxResult;
size_t uxLeft = 4;
size_t uxRight = 7;
uint8_t * pucData;
FreeRTOS_min_size_t_Stub( FreeRTOS_min_stub );
uxResult = uxStreamBufferGetPtr( &xLocalBuffer, &pucData );
TEST_ASSERT_EQUAL( 5, uxResult );
TEST_ASSERT_EQUAL_PTR( xLocalBuffer.ucArray + xLocalBuffer.uxTail, pucData );
}
/*
* @brief Test adding to the stream buffer when everything is zeroed out.
*/
void test_uxStreamBufferAdd_EverythingResetToZero( void )
{
const uint16_t usBufferSize = 1024;
/* Now we need to get a buffer which can store up to 1024 bytes. */
StreamBuffer_t * pxLocalBuffer = malloc( sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
size_t uxOffset = 0;
uint8_t pucData[ 512 ];
size_t uxByteCount = 0;
size_t uxReturn;
/* Add in a known pattern. */
memset( pucData, 0xAA, 512 );
/* Clear the Buffer. */
memset( pxLocalBuffer, 0, sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
pxLocalBuffer->LENGTH = usBufferSize;
pxLocalBuffer->uxHead = 0;
pxLocalBuffer->uxTail = 0;
pxLocalBuffer->uxMid = 0;
pxLocalBuffer->uxFront = 0;
FreeRTOS_min_size_t_Stub( FreeRTOS_min_stub );
uxReturn = uxStreamBufferAdd( pxLocalBuffer, uxOffset, pucData, uxByteCount );
TEST_ASSERT_EQUAL( 0, uxReturn );
/* Check that the data is still untouched i.e. 0. */
TEST_ASSERT_EACH_EQUAL_UINT8( 0, pxLocalBuffer->ucArray, usBufferSize );
/* Free the allocated data. */
free( pxLocalBuffer );
}
/*
* @brief Test adding to the buffer when it is already full with
* zero offset.
*/
void test_uxStreamBufferAdd_BufferFullZeroOffset( void )
{
const uint16_t usBufferSize = 1024;
/* Now we need to get a buffer which can store up to 1024 bytes. */
StreamBuffer_t * pxLocalBuffer = malloc( sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
size_t uxOffset = 0;
uint8_t pucData[ 512 ];
size_t uxByteCount = 0;
size_t uxReturn;
/* Add in a known pattern. */
memset( pucData, 0xAA, 512 );
/* Clear the Buffer. */
memset( pxLocalBuffer, 0, sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
pxLocalBuffer->LENGTH = usBufferSize;
pxLocalBuffer->uxHead = 100;
pxLocalBuffer->uxTail = pxLocalBuffer->uxHead + 1;
pxLocalBuffer->uxMid = 0;
pxLocalBuffer->uxFront = 0;
FreeRTOS_min_size_t_Stub( FreeRTOS_min_stub );
uxReturn = uxStreamBufferAdd( pxLocalBuffer, uxOffset, pucData, uxByteCount );
TEST_ASSERT_EQUAL( 0, uxReturn );
/* Check that the data is still untouched i.e. 0. */
TEST_ASSERT_EACH_EQUAL_UINT8( 0, pxLocalBuffer->ucArray, usBufferSize );
/* Free the allocated data. */
free( pxLocalBuffer );
}
/*
* @brief Test adding to the buffer when it is already full with
* positive offset.
*/
void test_uxStreamBufferAdd_BufferFullPositiveOffset( void )
{
const uint16_t usBufferSize = 1024;
/* Now we need to get a buffer which can store up to 1024 bytes. */
StreamBuffer_t * pxLocalBuffer = malloc( sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
size_t uxOffset = 10;
uint8_t pucData[ 512 ];
size_t uxByteCount = 0;
size_t uxReturn;
/* Add in a known pattern. */
memset( pucData, 0xAA, 512 );
/* Clear the Buffer. */
memset( pxLocalBuffer, 0, sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
pxLocalBuffer->LENGTH = usBufferSize;
pxLocalBuffer->uxHead = 100;
pxLocalBuffer->uxTail = pxLocalBuffer->uxHead + 1;
pxLocalBuffer->uxMid = 0;
pxLocalBuffer->uxFront = 0;
FreeRTOS_min_size_t_Stub( FreeRTOS_min_stub );
uxReturn = uxStreamBufferAdd( pxLocalBuffer, uxOffset, pucData, uxByteCount );
TEST_ASSERT_EQUAL( 0, uxReturn );
/* Check that the data is still untouched i.e. 0. */
TEST_ASSERT_EACH_EQUAL_UINT8( 0, pxLocalBuffer->ucArray, usBufferSize );
/* Free the allocated data. */
free( pxLocalBuffer );
}
/*
* @brief Test adding to the buffer when it has more space than the data.
* And it has zero offset where data write causes head to rollover.
*/
void test_uxStreamBufferAdd_BufferHasMoreSpaceThanData_ZeroOffset_DataWriteCausesRollover_FrontAheadOfHead( void )
{
const uint16_t usBufferSize = 1024;
/* Now we need to get a buffer which can store up to 1024 bytes. */
StreamBuffer_t * pxLocalBuffer = malloc( sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
size_t uxOffset = 0;
uint8_t pucData[ 512 ];
size_t uxByteCount = sizeof( pucData );
size_t uxReturn;
size_t uxBytesToBeWritten = 512;
const size_t uxBytesWrittenInFirstGo = 24;
/* Clear everything. */
memset( pxLocalBuffer, 0, sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
/* Fill the Data (0xAB) */
memset( pucData, 0xAB, sizeof( pucData ) );
pxLocalBuffer->LENGTH = usBufferSize;
/* Set Head at almost the end for rollover to happen. */
pxLocalBuffer->uxHead = 1000;
/* Only 600 bytes available. */
pxLocalBuffer->uxTail = pxLocalBuffer->uxHead + 600 + 1;
/* Rollover adjustment. */
pxLocalBuffer->uxTail -= pxLocalBuffer->LENGTH;
pxLocalBuffer->uxMid = 0;
/* Front is already ahead of the Head. */
pxLocalBuffer->uxFront = 500;
FreeRTOS_min_size_t_Stub( FreeRTOS_min_stub );
vTaskSuspendAll_Expect();
xTaskResumeAll_ExpectAndReturn( pdTRUE );
uxReturn = uxStreamBufferAdd( pxLocalBuffer, uxOffset, pucData, uxByteCount );
/* Only these many bytes should be written. */
TEST_ASSERT_EQUAL( uxBytesToBeWritten, uxReturn );
/* Assert that data was indeed written. Here in 2 steps. */
TEST_ASSERT_EQUAL_MEMORY( pucData, pxLocalBuffer->ucArray + 1000, uxBytesWrittenInFirstGo );
/* Rollover! */
TEST_ASSERT_EQUAL_MEMORY( pucData, pxLocalBuffer->ucArray + 0, uxBytesToBeWritten - uxBytesWrittenInFirstGo );
/* Make sure that the rest of buffer is untouched. i.e. zero.*/
TEST_ASSERT_EACH_EQUAL_UINT8( 0,
pxLocalBuffer->ucArray + uxBytesToBeWritten - uxBytesWrittenInFirstGo,
usBufferSize - uxBytesToBeWritten );
/* Make sure that the head is moved since data was written. */
TEST_ASSERT_EQUAL( 488, pxLocalBuffer->uxHead );
/* Free the allocated data. */
free( pxLocalBuffer );
}
/*
* @brief Test adding to the buffer when it has less space than data with
* zero offset.
*/
void test_uxStreamBufferAdd_BufferHasLessSpaceThanData_ZeroOffset( void )
{
const uint16_t usBufferSize = 1024;
/* Now we need to get a buffer which can store up to 1024 bytes. */
StreamBuffer_t * pxLocalBuffer = malloc( sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
size_t uxOffset = 0;
uint8_t pucData[ 512 ];
size_t uxByteCount = sizeof( pucData );
size_t uxReturn;
/* Clear everything. */
memset( pxLocalBuffer, 0, sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
/* Fill the Data (0xAB) */
memset( pucData, 0xAB, sizeof( pucData ) );
pxLocalBuffer->LENGTH = usBufferSize;
/* Set Head at 0 for simplicity. */
pxLocalBuffer->uxHead = 0;
/* Only 500 bytes available. */
pxLocalBuffer->uxTail = pxLocalBuffer->uxHead + 500 + 1;
pxLocalBuffer->uxMid = 0;
pxLocalBuffer->uxFront = 0;
FreeRTOS_min_size_t_Stub( FreeRTOS_min_stub );
vTaskSuspendAll_Expect();
xTaskResumeAll_ExpectAndReturn( pdTRUE );
uxReturn = uxStreamBufferAdd( pxLocalBuffer, uxOffset, pucData, uxByteCount );
/* Only 500 bytes should be written. */
TEST_ASSERT_EQUAL( 500, uxReturn );
/* Assert that data was indeed written. */
TEST_ASSERT_EQUAL_MEMORY( pxLocalBuffer->ucArray + uxOffset, pucData, 500 - uxOffset );
/* Free the allocated data. */
free( pxLocalBuffer );
}
/*
* @brief Test adding to the buffer when it has less space than the data.
* And it has non-zero offset.
*/
void test_uxStreamBufferAdd_BufferHasLessSpaceThanData_NonZeroOffset( void )
{
const uint16_t usBufferSize = 1024;
/* Now we need to get a buffer which can store up to 1024 bytes. */
StreamBuffer_t * pxLocalBuffer = malloc( sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
size_t uxOffset = 10;
uint8_t pucData[ 512 ];
size_t uxByteCount = sizeof( pucData );
size_t uxReturn;
size_t uxBytesToBeWritten = 500;
/* Clear everything. */
memset( pxLocalBuffer, 0, sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
/* Fill the Data (0xAB) */
memset( pucData, 0xAB, sizeof( pucData ) );
pxLocalBuffer->LENGTH = usBufferSize;
/* Set Head at 0 for simplicity. */
pxLocalBuffer->uxHead = 0;
/* Only 500 bytes available. */
pxLocalBuffer->uxTail = pxLocalBuffer->uxHead + uxBytesToBeWritten + 1;
pxLocalBuffer->uxMid = 0;
pxLocalBuffer->uxFront = 0;
FreeRTOS_min_size_t_Stub( FreeRTOS_min_stub );
vTaskSuspendAll_Expect();
xTaskResumeAll_ExpectAndReturn( pdTRUE );
uxReturn = uxStreamBufferAdd( pxLocalBuffer, uxOffset, pucData, uxByteCount );
/* Only these many bytes should be written. */
TEST_ASSERT_EQUAL( uxBytesToBeWritten - uxOffset, uxReturn );
/* Assert that data was indeed written. */
TEST_ASSERT_EQUAL_MEMORY( pucData, pxLocalBuffer->ucArray + uxOffset, uxBytesToBeWritten - uxOffset );
/* Make sure that rest of the buffer is untouched. i.e. zero.*/
TEST_ASSERT_EACH_EQUAL_UINT8( 0, pxLocalBuffer->ucArray + uxBytesToBeWritten, usBufferSize - uxBytesToBeWritten );
/* Make sure that the head is not moved since data was written at an offset. */
TEST_ASSERT_EQUAL( 0, pxLocalBuffer->uxHead );
/* Free the allocated data. */
free( pxLocalBuffer );
}
/*
* @brief Test adding to the buffer when it has less space than the data.
* And it has non-zero offset which causes rollover.
*/
void test_uxStreamBufferAdd_BufferHasLessSpaceThanData_NonZeroOffsetCausesRollover( void )
{
const uint16_t usBufferSize = 1024;
/* Now we need to get a buffer which can store up to 1024 bytes. */
StreamBuffer_t * pxLocalBuffer = malloc( sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
size_t uxOffset = 100;
uint8_t pucData[ 512 ];
size_t uxByteCount = sizeof( pucData );
size_t uxReturn;
size_t uxBytesToBeWritten = 500;
/* Clear everything. */
memset( pxLocalBuffer, 0, sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
/* Fill the Data (0xAB) */
memset( pucData, 0xAB, sizeof( pucData ) );
pxLocalBuffer->LENGTH = usBufferSize;
/* Set Head at almost the end for rollover to happen. */
pxLocalBuffer->uxHead = 1000;
/* Only 500 bytes available. */
pxLocalBuffer->uxTail = pxLocalBuffer->uxHead + uxBytesToBeWritten + 1;
/* Rollover adjustment. */
pxLocalBuffer->uxTail -= pxLocalBuffer->LENGTH;
pxLocalBuffer->uxMid = 0;
pxLocalBuffer->uxFront = 0;
FreeRTOS_min_size_t_Stub( FreeRTOS_min_stub );
vTaskSuspendAll_Expect();
xTaskResumeAll_ExpectAndReturn( pdTRUE );
uxReturn = uxStreamBufferAdd( pxLocalBuffer, uxOffset, pucData, uxByteCount );
/* Only these many bytes should be written. */
TEST_ASSERT_EQUAL( uxBytesToBeWritten - uxOffset, uxReturn );
/* Assert that data was indeed written. */
TEST_ASSERT_EQUAL_MEMORY( pucData, pxLocalBuffer->ucArray + 76, uxBytesToBeWritten - uxOffset );
/* Make sure that the rest of buffer is untouched. i.e. zero.*/
TEST_ASSERT_EACH_EQUAL_UINT8( 0, pxLocalBuffer->ucArray + uxBytesToBeWritten, usBufferSize - uxBytesToBeWritten );
/* Make sure that the head is not moved since data was written at an offset. */
TEST_ASSERT_EQUAL( 1000, pxLocalBuffer->uxHead );
/* Free the allocated data. */
free( pxLocalBuffer );
}
/*
* @brief Test adding to the buffer when it has less space than the data.
* And it has zero offset where data write causes head to rollover.
*/
void test_uxStreamBufferAdd_BufferHasLessSpaceThanData_ZeroOffset_DataWriteCausesRollover( void )
{
const uint16_t usBufferSize = 1024;
/* Now we need to get a buffer which can store up to 1024 bytes. */
StreamBuffer_t * pxLocalBuffer = malloc( sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
size_t uxOffset = 0;
uint8_t pucData[ 512 ];
size_t uxByteCount = sizeof( pucData );
size_t uxReturn;
size_t uxBytesToBeWritten = 500;
const size_t uxBytesWrittenInFirstGo = 24;
/* Clear everything. */
memset( pxLocalBuffer, 0, sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
/* Fill the Data (0xAB) */
memset( pucData, 0xAB, sizeof( pucData ) );
pxLocalBuffer->LENGTH = usBufferSize;
/* Set Head at almost the end for rollover to happen. */
pxLocalBuffer->uxHead = 1000;
/* Only 500 bytes available. */
pxLocalBuffer->uxTail = pxLocalBuffer->uxHead + uxBytesToBeWritten + 1;
/* Rollover adjustment. */
pxLocalBuffer->uxTail -= pxLocalBuffer->LENGTH;
pxLocalBuffer->uxMid = 0;
pxLocalBuffer->uxFront = 0;
FreeRTOS_min_size_t_Stub( FreeRTOS_min_stub );
vTaskSuspendAll_Expect();
xTaskResumeAll_ExpectAndReturn( pdTRUE );
uxReturn = uxStreamBufferAdd( pxLocalBuffer, uxOffset, pucData, uxByteCount );
/* Only these many bytes should be written. */
TEST_ASSERT_EQUAL( uxBytesToBeWritten - uxOffset, uxReturn );
/* Assert that data was indeed written. Here in 2 steps. */
TEST_ASSERT_EQUAL_MEMORY( pucData, pxLocalBuffer->ucArray + 1000, uxBytesWrittenInFirstGo );
/* Rollover! */
TEST_ASSERT_EQUAL_MEMORY( pucData, pxLocalBuffer->ucArray + 0, uxBytesToBeWritten - uxBytesWrittenInFirstGo );
/* Make sure that the rest of buffer is untouched. i.e. zero.*/
TEST_ASSERT_EACH_EQUAL_UINT8( 0,
pxLocalBuffer->ucArray + uxBytesToBeWritten - uxBytesWrittenInFirstGo,
usBufferSize - uxBytesToBeWritten );
/* Make sure that the head is moved since data was written. */
TEST_ASSERT_EQUAL( pxLocalBuffer->uxTail - 1, pxLocalBuffer->uxHead );
/* Free the allocated data. */
free( pxLocalBuffer );
}
/*
* @brief Test adding to the buffer when NULL pointer is passed with
* zero offset and data write causes a head pointer roll over.
*/
void test_uxStreamBufferAdd_NULLData_BufferHasLessSpaceThanData_ZeroOffset_DataWriteCausesRollover( void )
{
const uint16_t usBufferSize = 1024;
/* Now we need to get a buffer which can store up to 1024 bytes. */
StreamBuffer_t * pxLocalBuffer = malloc( sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
size_t uxOffset = 0;
uint8_t pucData[ 512 ];
size_t uxByteCount = sizeof( pucData );
size_t uxReturn;
size_t uxBytesToBeWritten = 500;
size_t uxNewHeadLocationAfterRollover = uxBytesToBeWritten - 24;
/* Clear everything. */
memset( pxLocalBuffer, 0, sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
/* Fill the Data (0xAB) */
memset( pucData, 0xAB, sizeof( pucData ) );
pxLocalBuffer->LENGTH = usBufferSize;
/* Set Head at almost the end for rollover to happen. */
pxLocalBuffer->uxHead = 1000;
/* Only 500 bytes available. */
pxLocalBuffer->uxTail = pxLocalBuffer->uxHead + uxBytesToBeWritten + 1;
/* Rollover adjustment. */
pxLocalBuffer->uxTail -= pxLocalBuffer->LENGTH;
pxLocalBuffer->uxMid = 0;
pxLocalBuffer->uxFront = 0;
FreeRTOS_min_size_t_Stub( FreeRTOS_min_stub );
vTaskSuspendAll_Expect();
xTaskResumeAll_ExpectAndReturn( pdTRUE );
uxReturn = uxStreamBufferAdd( pxLocalBuffer, uxOffset, NULL, uxByteCount );
/* Nothing should be written but tail will be updated. */
TEST_ASSERT_EQUAL( uxBytesToBeWritten, uxReturn );
/* Make sure that the rest of buffer is untouched. i.e. zero.*/
TEST_ASSERT_EACH_EQUAL_UINT8( 0, pxLocalBuffer->ucArray, usBufferSize );
/* Make sure that the head is moved as well. */
TEST_ASSERT_EQUAL( uxNewHeadLocationAfterRollover, pxLocalBuffer->uxHead );
/* Make sure that the front pointer is moved as well. */
TEST_ASSERT_EQUAL( uxNewHeadLocationAfterRollover, pxLocalBuffer->uxFront );
/* Free the allocated data. */
free( pxLocalBuffer );
}
/*
* @brief Test adding to the buffer when NULL pointer is passed with
* zero offset and when the data write causes head roll over
* with front pointer greater than the head pointer.
*/
void test_uxStreamBufferAdd_NULLData_BufferHasLessSpaceThanData_ZeroOffset_DataWriteCausesRollover_Front( void )
{
const uint16_t usBufferSize = 1024;
/* Now we need to get a buffer which can store up to 1024 bytes. */
StreamBuffer_t * pxLocalBuffer = malloc( sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
size_t uxOffset = 0;
uint8_t pucData[ 512 ];
size_t uxByteCount = sizeof( pucData );
size_t uxReturn;
size_t uxBytesToBeWritten = 500;
size_t uxNewHeadLocationAfterRollover = uxBytesToBeWritten - 24;
/* Clear everything. */
memset( pxLocalBuffer, 0, sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
/* Fill the Data (0xAB) */
memset( pucData, 0xAB, sizeof( pucData ) );
pxLocalBuffer->LENGTH = usBufferSize;
/* Set Head at almost the end for rollover to happen. */
pxLocalBuffer->uxHead = 1000;
/* Only 500 bytes available. */
pxLocalBuffer->uxTail = pxLocalBuffer->uxHead + uxBytesToBeWritten + 1;
/* Rollover adjustment. */
pxLocalBuffer->uxTail -= pxLocalBuffer->LENGTH;
pxLocalBuffer->uxMid = 0;
pxLocalBuffer->uxFront = pxLocalBuffer->uxHead - 2;
FreeRTOS_min_size_t_Stub( FreeRTOS_min_stub );
vTaskSuspendAll_Expect();
xTaskResumeAll_ExpectAndReturn( pdTRUE );
uxReturn = uxStreamBufferAdd( pxLocalBuffer, uxOffset, NULL, uxByteCount );
/* Nothing should be written but tail should be updated. */
TEST_ASSERT_EQUAL( uxBytesToBeWritten, uxReturn );
/* Make sure that the rest of buffer is untouched. i.e. zero.*/
TEST_ASSERT_EACH_EQUAL_UINT8( 0, pxLocalBuffer->ucArray, usBufferSize );
/* Make sure that the head is moved as well. */
TEST_ASSERT_EQUAL( uxNewHeadLocationAfterRollover, pxLocalBuffer->uxHead );
TEST_ASSERT_EQUAL( pxLocalBuffer->uxHead, pxLocalBuffer->uxFront );
/* Free the allocated data. */
free( pxLocalBuffer );
}
/*
* @brief Test reading from the stream buffer when all values are reset
* to 0.
*/
void test_uxStreamBufferGet_ResetEverything( void )
{
const uint16_t usBufferSize = 1024;
/* Now we need to get a buffer which can store up to 1024 bytes. */
StreamBuffer_t * pxLocalBuffer = malloc( sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
size_t uxOffset = 0;
uint8_t pucData[ 512 ];
size_t uxMaxCount = 0;
size_t uxReturn;
BaseType_t xPeek = 0;
/* Clear everything. */
memset( pxLocalBuffer, 0, sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
/* Fill the Data (0xAB) */
memset( pucData, 0xAB, sizeof( pucData ) );
pxLocalBuffer->LENGTH = usBufferSize;
FreeRTOS_min_size_t_Stub( FreeRTOS_min_stub );
uxReturn = uxStreamBufferGet( pxLocalBuffer, uxOffset, pucData, uxMaxCount, xPeek );
/* Nothing should be written. */
TEST_ASSERT_EQUAL( 0, uxReturn );
/* Make sure that the rest of buffer is untouched. i.e. zero.*/
TEST_ASSERT_EACH_EQUAL_UINT8( 0, pxLocalBuffer->ucArray, usBufferSize );
/* Free the allocated data. */
free( pxLocalBuffer );
}
/*
* @brief Test reading from the stream buffer when there are just enough
* bytes and we are reading without offset.
*/
void test_uxStreamBufferGet_BytesRequiredEQBytesPresent_NoOffset( void )
{
const uint16_t usBufferSize = 1024;
/* Now we need to get a buffer which can store up to 1024 bytes. */
StreamBuffer_t * pxLocalBuffer = malloc( sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
size_t uxOffset = 0;
uint8_t pucData[ 512 ];
size_t uxMaxCount = 500;
size_t uxBufferSpace = 500;
size_t uxReturn;
BaseType_t xPeek = 0;
/* Clear everything and fill it with 0x11. */
memset( pxLocalBuffer, 0x11, sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
/* Fill the Data (0xAB) */
memset( pucData, 0xAB, sizeof( pucData ) );
pxLocalBuffer->LENGTH = usBufferSize;
/* Set Tail to 0 for simplicity. */
pxLocalBuffer->uxTail = 0;
/* Only these many bytes available. */
pxLocalBuffer->uxHead = pxLocalBuffer->uxTail + uxBufferSpace;
pxLocalBuffer->uxMid = 0;
pxLocalBuffer->uxFront = 0;
FreeRTOS_min_size_t_Stub( FreeRTOS_min_stub );
uxReturn = uxStreamBufferGet( pxLocalBuffer, uxOffset, pucData, uxMaxCount, xPeek );
/* 500 bytes should be written. */
TEST_ASSERT_EQUAL( uxBufferSpace, uxReturn );
TEST_ASSERT_EQUAL( uxBufferSpace, pxLocalBuffer->uxTail );
TEST_ASSERT_EQUAL_MEMORY( pxLocalBuffer->ucArray, pucData, uxMaxCount );
/* Make sure that the rest of buffer is untouched. i.e. zero.*/
TEST_ASSERT_EACH_EQUAL_UINT8( 0xAB, pucData + uxMaxCount, sizeof( pucData ) - uxMaxCount );
/* Free the allocated data. */
free( pxLocalBuffer );
}
/*
* @brief Test reading from the stream buffer when there are just enough
* bytes and we are reading with a positive offset.
*/
void test_uxStreamBufferGet_BytesRequiredEQBytesPresent_PositiveOffset( void )
{
const uint16_t usBufferSize = 1024;
/* Now we need to get a buffer which can store up to 1024 bytes. */
StreamBuffer_t * pxLocalBuffer = malloc( sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
size_t uxOffset = 50;
uint8_t pucData[ 512 ];
size_t uxMaxCount = 500;
size_t uxBufferSpace = 500;
size_t uxReturn;
BaseType_t xPeek = 0;
/* Clear everything and fill it with 0x11. */
memset( pxLocalBuffer, 0x11, sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
/* Fill the Data (0xAB) */
memset( pucData, 0xAB, sizeof( pucData ) );
pxLocalBuffer->LENGTH = usBufferSize;
/* Set Tail to 0 for simplicity. */
pxLocalBuffer->uxTail = 0;
/* Only these many bytes available. */
pxLocalBuffer->uxHead = pxLocalBuffer->uxTail + uxBufferSpace;
pxLocalBuffer->uxMid = 0;
pxLocalBuffer->uxFront = 0;
FreeRTOS_min_size_t_Stub( FreeRTOS_min_stub );
uxReturn = uxStreamBufferGet( pxLocalBuffer, uxOffset, pucData, uxMaxCount, xPeek );
/* 500 bytes should be written. */
TEST_ASSERT_EQUAL( uxBufferSpace - uxOffset, uxReturn );
/* Since we are reading at an offset, the tail should not be moved. */
TEST_ASSERT_EQUAL( 0, pxLocalBuffer->uxTail );
/* See if the data is copied. */
TEST_ASSERT_EQUAL_MEMORY( pxLocalBuffer->ucArray, pucData, uxBufferSpace - uxOffset );
/* Free the allocated data. */
free( pxLocalBuffer );
}
/*
* @brief Test reading from the stream buffer when there are just enough
* bytes and we are reading with positive offset and the tail is
* about to rollover the stream buffer.
*/
void test_uxStreamBufferGet_BytesRequiredEQBytesPresent_PositiveOffset_TailAboutToRollOver( void )
{
const uint16_t usBufferSize = 1024;
/* Now we need to get a buffer which can store up to 1024 bytes. */
StreamBuffer_t * pxLocalBuffer = malloc( sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
size_t uxOffset = 50;
uint8_t pucData[ 512 ];
size_t uxMaxCount = 500;
size_t uxBufferSpace = 500;
size_t uxReturn;
BaseType_t xPeek = 0;
/* Clear everything and fill it with 0x11. */
memset( pxLocalBuffer, 0x11, sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
/* Fill the Data (0xAB) */
memset( pucData, 0xAB, sizeof( pucData ) );
pxLocalBuffer->LENGTH = usBufferSize;
/* Set Tail to 0 for simplicity. */
pxLocalBuffer->uxTail = 1000;
/* Only these many bytes available. */
pxLocalBuffer->uxHead = pxLocalBuffer->uxTail + uxBufferSpace;
/* Rollover adjustment. */
pxLocalBuffer->uxHead -= pxLocalBuffer->LENGTH;
pxLocalBuffer->uxMid = 0;
pxLocalBuffer->uxFront = 0;
FreeRTOS_min_size_t_Stub( FreeRTOS_min_stub );
uxReturn = uxStreamBufferGet( pxLocalBuffer, uxOffset, pucData, uxMaxCount, xPeek );
/* 500 bytes should be written. */
TEST_ASSERT_EQUAL( uxBufferSpace - uxOffset, uxReturn );
/* Since we are reading at an offset, the tail should not be moved. */
TEST_ASSERT_EQUAL( 1000, pxLocalBuffer->uxTail );
/* See if the data is copied. */
TEST_ASSERT_EQUAL_MEMORY( pxLocalBuffer->ucArray, pucData, uxBufferSpace - uxOffset );
/* Free the allocated data. */
free( pxLocalBuffer );
}
/*
* @brief Test reading from the stream buffer when there are just enough
* bytes and we are reading without offset and the tail is about
* to rollover.
*/
void test_uxStreamBufferGet_BytesRequiredEQBytesPresent_ZeroOffset_TailAboutToRollOver( void )
{
const uint16_t usBufferSize = 1024;
/* Now we need to get a buffer which can store up to 1024 bytes. */
StreamBuffer_t * pxLocalBuffer = malloc( sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
size_t uxOffset = 0;
uint8_t pucData[ 512 ];
size_t uxMaxCount = 500;
size_t uxBufferSpace = 500;
size_t uxReturn;
BaseType_t xPeek = 0;
/* Clear everything and fill it with 0x11. */
memset( pxLocalBuffer, 0x11, sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
/* Fill the Data (0xAB) */
memset( pucData, 0xAB, sizeof( pucData ) );
pxLocalBuffer->LENGTH = usBufferSize;
/* Set Tail to 0 for simplicity. */
pxLocalBuffer->uxTail = 1000;
/* Only these many bytes available. */
pxLocalBuffer->uxHead = pxLocalBuffer->uxTail + uxBufferSpace;
/* Rollover adjustment. */
pxLocalBuffer->uxHead -= pxLocalBuffer->LENGTH;
pxLocalBuffer->uxMid = 0;
pxLocalBuffer->uxFront = 0;
FreeRTOS_min_size_t_Stub( FreeRTOS_min_stub );
uxReturn = uxStreamBufferGet( pxLocalBuffer, uxOffset, pucData, uxMaxCount, xPeek );
/* 500 bytes should be written. */
TEST_ASSERT_EQUAL( uxBufferSpace - uxOffset, uxReturn );
/* the tail should be moved. */
TEST_ASSERT_EQUAL( uxMaxCount - 24, pxLocalBuffer->uxTail );
/* See if the data is copied. */
TEST_ASSERT_EQUAL_MEMORY( pxLocalBuffer->ucArray, pucData, uxBufferSpace - uxOffset );
/* Free the allocated data. */
free( pxLocalBuffer );
}
/*
* @brief Test reading from the stream buffer when there are just enough
* bytes and we are reading without any offset and the tail is about
* to roll over. But, as a twist, we are just peeking into the buffer.
*/
void test_uxStreamBufferGet_BytesRequiredEQBytesPresent_ZeroOffset_TailAboutToRollOver_ButJustPeeking( void )
{
const uint16_t usBufferSize = 1024;
/* Now we need to get a buffer which can store up to 1024 bytes. */
StreamBuffer_t * pxLocalBuffer = malloc( sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
size_t uxOffset = 0;
uint8_t pucData[ 512 ];
size_t uxMaxCount = 500;
size_t uxBufferSpace = 500;
size_t uxReturn;
/* We are just peeking. */
BaseType_t xPeek = 1;
/* Clear everything and fill it with 0x11. */
memset( pxLocalBuffer, 0x11, sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
/* Fill the Data (0xAB) */
memset( pucData, 0xAB, sizeof( pucData ) );
pxLocalBuffer->LENGTH = usBufferSize;
/* Set Tail to 0 for simplicity. */
pxLocalBuffer->uxTail = 1000;
/* Only these many bytes available. */
pxLocalBuffer->uxHead = pxLocalBuffer->uxTail + uxBufferSpace;
/* Rollover adjustment. */
pxLocalBuffer->uxHead -= pxLocalBuffer->LENGTH;
pxLocalBuffer->uxMid = 0;
pxLocalBuffer->uxFront = 0;
FreeRTOS_min_size_t_Stub( FreeRTOS_min_stub );
uxReturn = uxStreamBufferGet( pxLocalBuffer, uxOffset, pucData, uxMaxCount, xPeek );
/* 500 bytes should be written. */
TEST_ASSERT_EQUAL( uxBufferSpace - uxOffset, uxReturn );
/* the tail should not be moved. */
TEST_ASSERT_EQUAL( 1000, pxLocalBuffer->uxTail );
/* See if the data is copied. */
TEST_ASSERT_EQUAL_MEMORY( pxLocalBuffer->ucArray, pucData, uxBufferSpace - uxOffset );
/* Free the allocated data. */
free( pxLocalBuffer );
}
/*
* @brief Test reading from the stream buffer when we provide a NULL buffer to
* copy data.
*/
void test_uxStreamBufferGet_NULLPointer( void )
{
const uint16_t usBufferSize = 1024;
/* Now we need to get a buffer which can store up to 1024 bytes. */
StreamBuffer_t * pxLocalBuffer = malloc( sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
size_t uxOffset = 0;
uint8_t pucData[ 512 ];
size_t uxMaxCount = 500;
size_t uxBufferSpace = 500;
size_t uxReturn;
BaseType_t xPeek = 0;
/* Clear everything and fill it with 0x11. */
memset( pxLocalBuffer, 0x11, sizeof( StreamBuffer_t ) - sizeof( pxLocalBuffer->ucArray ) + usBufferSize );
/* Fill the Data (0xAB) */
memset( pucData, 0xAB, sizeof( pucData ) );
pxLocalBuffer->LENGTH = usBufferSize;
/* Set Tail to 0 for simplicity. */
pxLocalBuffer->uxTail = 1000;
/* Only these many bytes available. */
pxLocalBuffer->uxHead = pxLocalBuffer->uxTail + uxBufferSpace;
/* Rollover adjustment. */
pxLocalBuffer->uxHead -= pxLocalBuffer->LENGTH;
pxLocalBuffer->uxMid = 0;
pxLocalBuffer->uxFront = 0;
FreeRTOS_min_size_t_Stub( FreeRTOS_min_stub );
uxReturn = uxStreamBufferGet( pxLocalBuffer, uxOffset, NULL, uxMaxCount, xPeek );
/* No bytes should be read. But still the tail moves forward. */
TEST_ASSERT_EQUAL( 500, uxReturn );
/* The tail should be moved. */
TEST_ASSERT_EQUAL( 476, pxLocalBuffer->uxTail );
/* Make sure that the rest of buffer is untouched. i.e. zero.*/
TEST_ASSERT_EACH_EQUAL_UINT8( 0xAB, pucData, sizeof( pucData ) );
/* Free the allocated data. */
free( pxLocalBuffer );
}