From 035141e2abe255de3c86aebaea38a048578954b7 Mon Sep 17 00:00:00 2001 From: Mark VanderVoord Date: Sun, 7 Jul 2019 14:15:35 -0400 Subject: [PATCH] - Added capacity accessor for easier testing - Made test size-agnostic for easier boundary checking. --- src/cmock.c | 8 ++++++++ src/cmock.h | 1 + test/c/TestCMockC.c | 20 +++++++++++++++----- test/c/TestCMockC.yml | 1 + test/c/TestCMockC_Runner.c | 16 +++++++++------- 5 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/cmock.c b/src/cmock.c index be26fba..87e1d63 100644 --- a/src/cmock.c +++ b/src/cmock.c @@ -168,6 +168,14 @@ void* CMock_Guts_GetAddressFor(CMOCK_MEM_INDEX_TYPE index) } } +//------------------------------------------------------- +// CMock_Guts_MemBytesCapacity +//------------------------------------------------------- +CMOCK_MEM_INDEX_TYPE CMock_Guts_MemBytesCapacity(void) +{ + return (sizeof(CMock_Guts_Buffer) - CMOCK_MEM_ALIGN_SIZE); +} + //------------------------------------------------------- // CMock_Guts_MemBytesFree //------------------------------------------------------- diff --git a/src/cmock.h b/src/cmock.h index a313448..22552da 100644 --- a/src/cmock.h +++ b/src/cmock.h @@ -30,6 +30,7 @@ CMOCK_MEM_INDEX_TYPE CMock_Guts_MemEndOfChain(CMOCK_MEM_INDEX_TYPE root_index); void* CMock_Guts_GetAddressFor(CMOCK_MEM_INDEX_TYPE index); +CMOCK_MEM_INDEX_TYPE CMock_Guts_MemBytesCapacity(void); CMOCK_MEM_INDEX_TYPE CMock_Guts_MemBytesFree(void); CMOCK_MEM_INDEX_TYPE CMock_Guts_MemBytesUsed(void); void CMock_Guts_MemFreeAll(void); diff --git a/test/c/TestCMockC.c b/test/c/TestCMockC.c index 2f6f3de..769a2b3 100644 --- a/test/c/TestCMockC.c +++ b/test/c/TestCMockC.c @@ -25,8 +25,18 @@ void test_MemNewWillReturnNullIfGivenIllegalSizes(void) TEST_ASSERT_NULL( CMock_Guts_GetAddressFor(CMOCK_GUTS_NONE) ); //verify we're cleared still - TEST_ASSERT_EQUAL(0, CMock_Guts_MemBytesUsed()); - TEST_ASSERT_EQUAL(CMOCK_MEM_SIZE, CMock_Guts_MemBytesFree()); + TEST_ASSERT_LESS_OR_EQUAL_UINT32(CMOCK_MEM_SIZE, CMock_Guts_MemBytesCapacity()); + TEST_ASSERT_EQUAL_UINT32(0, CMock_Guts_MemBytesUsed()); + TEST_ASSERT_LESS_OR_EQUAL_UINT32(CMOCK_MEM_SIZE, CMock_Guts_MemBytesFree()); +} + +void test_MemShouldProtectAgainstMemoryOverflow(void) +{ + (void)CMock_Guts_MemNew(CMOCK_MEM_SIZE - TEST_MEM_INDEX_SIZE); + + //verify we've used all the memory + TEST_ASSERT_LESS_OR_EQUAL_UINT32(TEST_MEM_INDEX_SIZE, CMock_Guts_MemBytesFree()); + TEST_ASSERT_GREATER_OR_EQUAL_UINT32(CMOCK_MEM_SIZE, CMock_Guts_MemBytesUsed()); } void test_MemChainWillReturnNullAndDoNothingIfGivenIllegalInformation(void) @@ -258,11 +268,11 @@ void test_ThatWeCanAskForAllSortsOfSizes(void) } //show that we can't ask for too much memory - TEST_ASSERT_EQUAL_HEX(CMOCK_GUTS_NONE, CMock_Guts_MemNew(12)); - TEST_ASSERT_EQUAL_HEX(CMOCK_GUTS_NONE, CMock_Guts_MemNew(5)); + TEST_ASSERT_EQUAL_HEX(CMOCK_GUTS_NONE, CMock_Guts_MemNew(CMOCK_MEM_SIZE - sum + 8)); + TEST_ASSERT_EQUAL_HEX(CMOCK_GUTS_NONE, CMock_Guts_MemNew(CMOCK_MEM_SIZE - sum + 1)); //but we CAN ask for something that will still fit - next = CMock_Guts_MemNew(4); + next = CMock_Guts_MemNew(CMOCK_MEM_SIZE - sum - 4); TEST_ASSERT_MESSAGE(next != CMOCK_GUTS_NONE, "Should Not Have Returned CMOCK_GUTS_NONE"); first = CMock_Guts_MemChain(first, next); diff --git a/test/c/TestCMockC.yml b/test/c/TestCMockC.yml index 7649385..06067b1 100644 --- a/test/c/TestCMockC.yml +++ b/test/c/TestCMockC.yml @@ -8,6 +8,7 @@ - 'TEST' - 'CMOCK_MEM_STATIC' - 'CMOCK_MEM_SIZE=128' + #- 'CMOCK_MEM_SIZE=40000' - 'CMOCK_MEM_ALIGN=2' - 'CMOCK_MEM_INDEX_TYPE=int' diff --git a/test/c/TestCMockC_Runner.c b/test/c/TestCMockC_Runner.c index ede1ab4..af559d8 100644 --- a/test/c/TestCMockC_Runner.c +++ b/test/c/TestCMockC_Runner.c @@ -12,6 +12,7 @@ extern void setUp(void); extern void tearDown(void); extern void test_MemNewWillReturnNullIfGivenIllegalSizes(void); +extern void test_MemShouldProtectAgainstMemoryOverflow(void); extern void test_MemChainWillReturnNullAndDoNothingIfGivenIllegalInformation(void); extern void test_MemNextWillReturnNullIfGivenABadRoot(void); extern void test_ThatWeCanClaimAndChainAFewElementsTogether(void); @@ -26,13 +27,14 @@ int main(void) UnityBegin(Unity.TestFile); RUN_TEST(test_MemNewWillReturnNullIfGivenIllegalSizes, 21); - RUN_TEST(test_MemChainWillReturnNullAndDoNothingIfGivenIllegalInformation, 32); - RUN_TEST(test_MemNextWillReturnNullIfGivenABadRoot, 46); - RUN_TEST(test_ThatWeCanClaimAndChainAFewElementsTogether, 57); - RUN_TEST(test_MemEndOfChain, 282); - RUN_TEST(test_ThatCMockStopsReturningMoreDataWhenItRunsOutOfMemory, 139); - RUN_TEST(test_ThatCMockStopsReturningMoreDataWhenAskForMoreThanItHasLeftEvenIfNotAtExactEnd, 185); - RUN_TEST(test_ThatWeCanAskForAllSortsOfSizes, 233); + RUN_TEST(test_MemShouldProtectAgainstMemoryOverflow, 33); + RUN_TEST(test_MemChainWillReturnNullAndDoNothingIfGivenIllegalInformation, 42); + RUN_TEST(test_MemNextWillReturnNullIfGivenABadRoot, 56); + RUN_TEST(test_ThatWeCanClaimAndChainAFewElementsTogether, 67); + RUN_TEST(test_MemEndOfChain, 149); + RUN_TEST(test_ThatCMockStopsReturningMoreDataWhenItRunsOutOfMemory, 195); + RUN_TEST(test_ThatCMockStopsReturningMoreDataWhenAskForMoreThanItHasLeftEvenIfNotAtExactEnd, 244); + RUN_TEST(test_ThatWeCanAskForAllSortsOfSizes, 298); UnityEnd(); return 0;