Skip to content

Commit

Permalink
Fix #778, Add CFE_Assert library
Browse files Browse the repository at this point in the history
  • Loading branch information
jphickey committed Jul 15, 2020
1 parent 7b93466 commit 75d93fc
Show file tree
Hide file tree
Showing 5 changed files with 354 additions and 0 deletions.
7 changes: 7 additions & 0 deletions cmake/mission_defaults.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,10 @@ set(MISSION_MODULE_SEARCH_PATH
set(cfe-core_SEARCH_PATH "cfe/fsw")
set(osal_SEARCH_PATH ".")
set(psp_SEARCH_PATH ".")

# If ENABLE_UNIT_TEST is enabled, then include the cfe_assert library in
# all targets. This can still be overridden in targets.cmake.
if (ENABLE_UNIT_TESTS)
list(APPEND MISSION_GLOBAL_APPLIST cfe_assert)
endif (ENABLE_UNIT_TESTS)

12 changes: 12 additions & 0 deletions modules/cfe_assert/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
project(CFE_ASSERT C)

include_directories("${CFE_ASSERT_SOURCE_DIR}/fsw/inc")
include_directories("${UT_ASSERT_SOURCE_DIR}/inc")

# Create the app module
add_cfe_app(cfe_assert
fsw/src/cfe_assert_io.c
fsw/src/cfe_assert_main.c
$<TARGET_OBJECTS:ut_assert_pic>
)

63 changes: 63 additions & 0 deletions modules/cfe_assert/fsw/inc/cfe_assert.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/*************************************************************************
**
** GSC-18128-1, "Core Flight Executive Version 6.7"
**
** Copyright (c) 2006-2019 United States Government as represented by
** the Administrator of the National Aeronautics and Space Administration.
** All Rights Reserved.
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
**
** File: cfe_assert.h
**
** Purpose:
** Specification for the CFE assert (UT assert wrapper) functions.
**
*************************************************************************/
#ifndef cfe_assert_h_
#define cfe_assert_h_

/************************************************************************
** Includes
*************************************************************************/
#include <common_types.h>

/************************************************************************
** Type Definitions
*************************************************************************/

/*************************************************************************
** Exported Functions
*************************************************************************/

/************************************************************************/
/** \brief Application Entry Point Function
**
** \par Description
** This function should be specified in the cfe_es_startup.scr file
** as part of starting this application.
**
** \par Assumptions, External Events, and Notes:
** None
**
** \return Execution status, see \ref CFEReturnCodes
**
**
*************************************************************************/
void CFE_Assert_AppMain(void);

#endif /* cfe_assert_h_ */

/************************/
/* End of File Comment */
/************************/
137 changes: 137 additions & 0 deletions modules/cfe_assert/fsw/src/cfe_assert_io.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
/*************************************************************************
**
** GSC-18128-1, "Core Flight Executive Version 6.7"
**
** Copyright (c) 2006-2019 United States Government as represented by
** the Administrator of the National Aeronautics and Space Administration.
** All Rights Reserved.
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
**
** File: cfe_assert_io.c
**
** Purpose:
** Implementation of the CFE assert (UT assert wrapper) functions.
**
*************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

#include <cfe.h>

#include "utbsp.h"
#include "uttest.h"

/*
** Local Variables
*/
typedef struct
{
uint32 CurrVerbosity;
} BSP_UT_GlobalData_t;

BSP_UT_GlobalData_t BSP_UT_Global;

void UT_BSP_Setup(void)
{
BSP_UT_Global.CurrVerbosity = (2 << UTASSERT_CASETYPE_PASS) - 1;
UT_BSP_DoText(UTASSERT_CASETYPE_BEGIN, "CFE FUNCTIONAL TEST");
}

void UT_BSP_StartTestSegment(uint32 SegmentNumber, const char *SegmentName)
{
char ReportBuffer[128];

snprintf(ReportBuffer, sizeof(ReportBuffer), "%02u %s", (unsigned int)SegmentNumber, SegmentName);
UT_BSP_DoText(UTASSERT_CASETYPE_BEGIN, ReportBuffer);
}

void UT_BSP_DoText(uint8 MessageType, const char *OutputMessage)
{
const char *Prefix;
uint32 MsgEnabled = BSP_UT_Global.CurrVerbosity >> MessageType;

if (MsgEnabled & 1)
{
switch (MessageType)
{
case UTASSERT_CASETYPE_ABORT:
Prefix = "ABORT";
break;
case UTASSERT_CASETYPE_FAILURE:
Prefix = "FAIL";
break;
case UTASSERT_CASETYPE_MIR:
Prefix = "MIR";
break;
case UTASSERT_CASETYPE_TSF:
Prefix = "TSF";
break;
case UTASSERT_CASETYPE_TTF:
Prefix = "TTF";
break;
case UTASSERT_CASETYPE_NA:
Prefix = "N/A";
break;
case UTASSERT_CASETYPE_BEGIN:
Prefix = "BEGIN";
break;
case UTASSERT_CASETYPE_END:
Prefix = "END";
break;
case UTASSERT_CASETYPE_PASS:
Prefix = "PASS";
break;
case UTASSERT_CASETYPE_INFO:
Prefix = "INFO";
break;
case UTASSERT_CASETYPE_DEBUG:
Prefix = "DEBUG";
break;
default:
Prefix = "OTHER";
break;
}

CFE_ES_WriteToSysLog("[%5s] %s\n", Prefix, OutputMessage);
}

/*
* If any ABORT (major failure) message is thrown,
* then call a BSP-provided routine to stop the test and possibly dump a core
*/
if (MessageType == UTASSERT_CASETYPE_ABORT)
{
OS_TaskExit();
}
}

void UT_BSP_EndTest(const UtAssert_TestCounter_t *TestCounters)
{
/*
* Only output a "summary" if there is more than one test Segment.
* Otherwise it is a duplicate of the report already given.
*/
if (TestCounters->TestSegmentCount > 1)
{
UtAssert_DoTestSegmentReport("SUMMARY", TestCounters);
}

CFE_ES_WriteToSysLog("TEST COMPLETE: %u tests Segment(s) executed\n\n",
(unsigned int)TestCounters->TestSegmentCount);

OS_TaskExit();
}
135 changes: 135 additions & 0 deletions modules/cfe_assert/fsw/src/cfe_assert_main.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
/*************************************************************************
**
** GSC-18128-1, "Core Flight Executive Version 6.7"
**
** Copyright (c) 2006-2019 United States Government as represented by
** the Administrator of the National Aeronautics and Space Administration.
** All Rights Reserved.
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
**
** File: cfe_assert_main.c
**
** Purpose:
** Implementation of the CFE assert (UT assert wrapper) functions.
**
*************************************************************************/

/*
* Includes
*/

#include <cfe.h>

#include "cfe_assert.h"

#include "uttest.h"
#include "utbsp.h"

/*
* The maximum amount of time that the application will delay to
* wait for other apps to complete startup before running the tests.
*
* The value is in milliseconds. Normally this shouldn't be more than
* a second or two for apps to all reach their respective main loop(s).
*/
#define CFE_ASSERT_MAX_STARTUP_WAIT 30000

/*
* Small Extra delay before starting tests.
*
* This is not strictly necessary, but it does give a bit of time for other apps
* to settle their final syslog writes/events such that they will not be intermixed
* with test messages in the syslog.
*
* The value is in milliseconds.
*/
#define CFE_ASSERT_START_DELAY 4000


/*
* Entry point for this application
*/
void CFE_Assert_AppMain(void)
{
int32 rc;
uint32 RunStatus;

/*
** Register the app with Executive services
*/
rc = CFE_ES_RegisterApp();
if (rc != CFE_SUCCESS)
{
CFE_ES_WriteToSysLog("Error in CFE_ES_RegisterApp(): %08lx\n", (unsigned long)rc);
return;
}

UtTest_EarlyInit();
UT_BSP_Setup();

/*
* Start a test case for all startup logic.
*
* Test libs may use assert statements within their init function and these
* will be reported as a "startup" test case.
*/
UtAssert_BeginTest("CFE-STARTUP");

/*
* Delay until the system reaches "operational" state -- this is when all libs have initialized
* and all apps have reached their RunLoop.
*/
rc = CFE_ES_WaitForSystemState(CFE_ES_SystemState_OPERATIONAL, CFE_ASSERT_MAX_STARTUP_WAIT);
if (rc != CFE_SUCCESS)
{
CFE_ES_WriteToSysLog("Error while waiting for OPERATIONAL state: %08lx\n", (unsigned long)rc);
return;
}

/*
* Startup Phase has ended.
*/
UtAssert_EndTest();

/*
* Note - in a normal app this would be a while loop,
* but is just an "if" right now as it only runs once.
*
* A future enhancement to this app might be to create an SB pipe
* and execute tests based on the receipt of a command to do so.
*
* For now, it just works in a one-shot mode to run tests that were
* registered during startup, then it self-exits.
*/
RunStatus = CFE_ES_RunStatus_APP_RUN;
if(CFE_ES_RunLoop(&RunStatus))
{
OS_TaskDelay(CFE_ASSERT_START_DELAY);

/*
* Run all registered test cases.
*/
UtTest_Run();

/*
* Exit the main task.
*/
RunStatus = CFE_ES_RunStatus_APP_EXIT;
}


CFE_ES_ExitApp(RunStatus);
}


0 comments on commit 75d93fc

Please sign in to comment.