Submit and vote on feature ideas.

Welcome to the new Parasoft forums! We hope you will enjoy the site and try out some of the new features, like sharing an idea you may have for one of our products or following a category.

Trouble executing with stubs

Develco
Develco Posts: 1

I've made a couple of stubs using the "Lesson 15: Configuring Stub Behavior in Source Code" chapter in "C++test Host-Based Unit Testing" guide.

After running "Collect Stub Information" I created User Stubs for the functions I needed to stub. Trying to execute my test case give the error:
function "CPPTEST_STUB_CALLBACK_PARAMS" declared implicitly
C/C++ Test created the stub function:

EXTERN_C_LINKAGE E_TIMER_STATUS TimerSvc_Start (E_TIMER_ID timId, uint32_t time) ;
EXTERN_C_LINKAGE E_TIMER_STATUS CppTest_Stub_TimerSvc_Start (E_TIMER_ID timId, uint32_t time) 
{
    CPPTEST_STUB_CALLED("TimerSvc_Start");

    E_TIMER_STATUS __return = TIMER_ERROR;

    /**
     * This section enables Dynamic Stub Configuration with Stub Callbacks.
     *
     * IMPORTANT: THIS COMMENT BLOCK SHOULD NOT BE DELETED OR MODIFIED
     *
     * 1. Define stub callback function in test suite file - use the following signature:
     *     void CppTest_StubCallback_SomeName(CppTest_StubCallInfo* stubCallInfo, E_TIMER_STATUS* __return, E_TIMER_ID timId, uint32_t time)
     *
     * 2. Register stub callback in test case function - use the following code:
     *     CPPTEST_REGISTER_STUB_CALLBACK("TimerSvc_Start", &CppTest_StubCallback_SomeName);
     *
     * 3. Fill out the body of the stub callback function according to intent.
     * The following line may be used to call original function inside stub callback:
     *     *__return = TimerSvc_Start(timId, time);
     */
    if (CPPTEST_STUB_HAS_CALLBACK()) {
        CPPTEST_STUB_CALLBACK_PARAMS(E_TIMER_STATUS* __return, E_TIMER_ID timId, uint32_t time);
        CPPTEST_STUB_INVOKE_CALLBACK(&__return, timId, time);

    } else {
        /* You can put additional stub logic here. */

    }

    return __return;
}

Using the guide I changed the function to:

EXTERN_C_LINKAGE E_TIMER_STATUS CppTest_Stub_TimerSvc_Start (E_TIMER_ID timId, uint32_t time) 
{
    E_TIMER_STATUS __return = TIMER_ERROR;

    CPPTEST_CALL_STUB_CALLBACK("TimerSvc_Start", &__return, timId, time);

    return __return;
}

And registered the stub in my test case.

void CppTest_StubCallback_TimerSvc_Start(CppTest_StubCallInfo* stubCallInfo, E_TIMER_STATUS* __return, E_TIMER_ID timId, uint32_t time)
{
  printf("CppTest_StubCallback_TimerSvc_Start\r\n");
  //*__return = TimerSvc_Start(timId, time);
}

/* CPPTEST_TEST_CASE_BEGIN test_SensorMgr_On_01 */
/* CPPTEST_TEST_CASE_CONTEXT E_SENSOR_MGR_STATE SensorMgr_On(void) */
void SensorMgr_unit_test_test_SensorMgr_On_01()
{
    /* Pre-condition initialization */
    CPPTEST_REGISTER_STUB_CALLBACK("TimerSvc_Start", &CppTest_StubCallback_TimerSvc_Start);
    /* Initializing global variable sensorMgrState */ 
    {
         sensorMgrState  = SENSOR_OFF;
    }
    {
        /* Tested function call */
        E_SENSOR_MGR_STATE _return  = SensorMgr_On();
        /* Post-condition check */
        CPPTEST_POST_CONDITION_ENUM(E_SENSOR_MGR_STATE, "E_SENSOR_MGR_STATE _return", ( _return ));
        CPPTEST_POST_CONDITION_ENUM(E_SENSOR_MGR_STATE, "E_SENSOR_MGR_STATE sensorMgrState", ( sensorMgrState ));
    }
}

But when I execute (not in FileScope) I get the "Quality Task":
Message: Invalid stub configuration - cannot use Stub Callbacks for "TimerSvc_Start" (hint: re-create stub with "Dynamic stubs configuration> Enable Stub Callbacks" option enabled)

If I execute in FileScope mode I get a linker error:

IAR ELF Linker V8.22.2.15995/W32 for ARM
Copyright 2007-2018 IAR Systems AB.
Error[Li005]: no definition for "TimerSvc_Start" [referenced from C:\Users\swtest\parasoft\workspace\.cpptest\ADC_AnalogWatchdog_test\file-data\SensorMgr.c922fb77f\tested\harness_SensorMgr.o]

My Test Configurations are based on "Run IAR ARM Tests" and work fine without stubs.

Any help?

BR, Thomas Damgaard