diff --git a/fsw/src/ds_table.c b/fsw/src/ds_table.c index 681a171..d1f8448 100644 --- a/fsw/src/ds_table.c +++ b/fsw/src/ds_table.c @@ -553,6 +553,8 @@ CFE_Status_t DS_TableVerifyFilter(const void *TableData) DS_FilterTable_t *FilterTable = (DS_FilterTable_t *)TableData; CFE_Status_t Result = CFE_SUCCESS; int32 i = 0; + int32 j = 0; + int32 DuplicateIndex; int32 CountGood = 0; int32 CountBad = 0; @@ -561,7 +563,7 @@ CFE_Status_t DS_TableVerifyFilter(const void *TableData) /* ** Perform the following validation: ** - ** MessageID = unlimited, zero means unused + ** MessageID = active message IDs must be unique, zero means unused */ /* @@ -573,14 +575,44 @@ CFE_Status_t DS_TableVerifyFilter(const void *TableData) { CountUnused++; } - else if (DS_TableVerifyFilterEntry(&FilterTable->Packet[i], (uint8)i, CountBad) == true) - { - CountGood++; - } else { - CountBad++; - Result = DS_TABLE_VERIFY_ERR; + DuplicateIndex = DS_INDEX_NONE; + + for (j = 0; j < i; j++) + { + if (CFE_SB_IsValidMsgId(FilterTable->Packet[j].MessageID) && + CFE_SB_MsgId_Equal(FilterTable->Packet[i].MessageID, FilterTable->Packet[j].MessageID)) + { + DuplicateIndex = j; + break; + } + } + + if (DuplicateIndex != DS_INDEX_NONE) + { + if (CountBad == 0) + { + CFE_EVS_SendEvent(DS_FLT_TBL_ERR_EID, + CFE_EVS_EventType_ERROR, + "Filter table verify err: MID = 0x%08lX at index = %d duplicates index = %d", + (unsigned long)CFE_SB_MsgIdToValue(FilterTable->Packet[i].MessageID), + (int)i, + (int)DuplicateIndex); + } + + CountBad++; + Result = DS_TABLE_VERIFY_ERR; + } + else if (DS_TableVerifyFilterEntry(&FilterTable->Packet[i], (uint8)i, CountBad) == true) + { + CountGood++; + } + else + { + CountBad++; + Result = DS_TABLE_VERIFY_ERR; + } } } diff --git a/unit-test/ds_table_tests.c b/unit-test/ds_table_tests.c index 6cfa85c..dd4318e 100644 --- a/unit-test/ds_table_tests.c +++ b/unit-test/ds_table_tests.c @@ -781,9 +781,11 @@ void DS_TableVerifyFilter_Test_Nominal(void) FilterTable.Packet[0].Filter[0].FilterType = 1; DS_AppData.FileStatus[0].FileState = DS_ENABLED; + FilterTable.Packet[1].MessageID = DS_UT_MID_2; + strncpy(FilterTable.Descriptor, "descriptor", DS_DESCRIPTOR_BUFSIZE); - for (i = 1; i < 256; i++) + for (i = 2; i < DS_PACKETS_IN_FILTER_TABLE; i++) { FilterTable.Packet[i].MessageID = CFE_SB_INVALID_MSG_ID; } @@ -834,6 +836,32 @@ void DS_TableVerifyFilter_Test_FilterTableVerificationError(void) UtAssert_INT32_EQ(context_CFE_EVS_SendEvent[1].EventType, CFE_EVS_EventType_INFORMATION); } +void DS_TableVerifyFilter_Test_DuplicateMessageID(void) +{ + DS_FilterTable_t FilterTable; + uint32 i; + + memset(&FilterTable, 0, sizeof(FilterTable)); + + for (i = 0; i < DS_PACKETS_IN_FILTER_TABLE; i++) + { + FilterTable.Packet[i].MessageID = CFE_SB_INVALID_MSG_ID; + } + + FilterTable.Packet[0].MessageID = DS_UT_MID_1; + FilterTable.Packet[2].MessageID = DS_UT_MID_1; + + /* Execute the function being tested */ + UtAssert_INT32_EQ(DS_TableVerifyFilter(&FilterTable), DS_TABLE_VERIFY_ERR); + + /* Verify results */ + UtAssert_STUB_COUNT(CFE_EVS_SendEvent, 2); + UtAssert_INT32_EQ(context_CFE_EVS_SendEvent[0].EventID, DS_FLT_TBL_ERR_EID); + UtAssert_INT32_EQ(context_CFE_EVS_SendEvent[0].EventType, CFE_EVS_EventType_ERROR); + UtAssert_INT32_EQ(context_CFE_EVS_SendEvent[1].EventID, DS_FLT_TBL_EID); + UtAssert_INT32_EQ(context_CFE_EVS_SendEvent[1].EventType, CFE_EVS_EventType_INFORMATION); +} + void DS_TableVerifyFilter_Test_CountBad(void) { DS_FilterTable_t FilterTable; @@ -1587,6 +1615,7 @@ void UtTest_Setup(void) UT_DS_TEST_ADD(DS_TableVerifyFilter_Test_Nominal); UT_DS_TEST_ADD(DS_TableVerifyFilter_Test_FilterTableVerificationError); + UT_DS_TEST_ADD(DS_TableVerifyFilter_Test_DuplicateMessageID); UT_DS_TEST_ADD(DS_TableVerifyFilter_Test_CountBad); UT_DS_TEST_ADD(DS_TableVerifyFilterEntry_Test_Nominal);