sppps01: Add test case for early returns of pps_event()

Update #2349.
This commit is contained in:
Gabriel Moyano
2022-07-01 08:36:30 +02:00
committed by Sebastian Huber
parent 03e4d1e931
commit eefaf0687c

View File

@@ -46,6 +46,7 @@ const char rtems_test_name[] = "SPPPS 1";
struct test_pps_device { struct test_pps_device {
struct pps_state pps; struct pps_state pps;
rtems_id task_waiting; rtems_id task_waiting;
int wokenup;
}; };
typedef struct { typedef struct {
@@ -59,9 +60,9 @@ T_TEST_CASE( WaitPPSEventDefaultHandler )
struct test_pps_device pps_dev; struct test_pps_device pps_dev;
struct pps_fetch_args fetch; struct pps_fetch_args fetch;
memset( &pps_dev, 0, sizeof( pps_dev ) );
pps_dev.task_waiting = RTEMS_INVALID_ID; pps_dev.task_waiting = RTEMS_INVALID_ID;
memset( &pps_dev.pps, 0, sizeof( pps_dev.pps ) );
pps_dev.pps.ppscap = PPS_CAPTUREBOTH; pps_dev.pps.ppscap = PPS_CAPTUREBOTH;
pps_init_abi( &pps_dev.pps ); pps_init_abi( &pps_dev.pps );
pps_dev.pps.ppsparam.mode = PPS_CAPTUREASSERT; pps_dev.pps.ppsparam.mode = PPS_CAPTUREASSERT;
@@ -76,6 +77,48 @@ T_TEST_CASE( WaitPPSEventDefaultHandler )
T_eq_int( status, ETIMEDOUT ); T_eq_int( status, ETIMEDOUT );
} }
static void fake_wakeup(struct pps_state *pps)
{
struct test_pps_device *pps_dev;
pps_dev = RTEMS_CONTAINER_OF( pps, struct test_pps_device, pps );
pps_dev->wokenup++;
}
T_TEST_CASE( PPSEventEarlyReturns )
{
struct test_pps_device pps_dev;
memset( &pps_dev, 0, sizeof( pps_dev ) );
pps_dev.task_waiting = RTEMS_INVALID_ID;
pps_dev.pps.ppscap = PPS_CAPTUREBOTH;
pps_init_abi( &pps_dev.pps );
pps_dev.pps.wakeup = fake_wakeup;
pps_dev.pps.ppsparam.mode = PPS_CAPTUREASSERT;
pps_capture( &pps_dev.pps );
/* Trigger event with a different event than the one previously selected */
pps_event( &pps_dev.pps, PPS_CAPTURECLEAR );
T_eq_int( pps_dev.wokenup, 0 );
pps_dev.pps.ppsparam.mode = PPS_CAPTURECLEAR;
/* Wait th_generation to be updated */
rtems_task_wake_after(1);
pps_event( &pps_dev.pps, PPS_CAPTURECLEAR );
T_eq_int( pps_dev.wokenup, 0 );
/* Save current timecounter in pps_state object */
pps_capture( &pps_dev.pps );
pps_event( &pps_dev.pps, PPS_CAPTURECLEAR );
T_eq_int( pps_dev.wokenup, 0 );
pps_capture( &pps_dev.pps );
pps_event( &pps_dev.pps, PPS_CAPTURECLEAR );
T_eq_int( pps_dev.wokenup, 1 );
}
static void wakeup(struct pps_state *pps) static void wakeup(struct pps_state *pps)
{ {
struct test_pps_device *pps_dev; struct test_pps_device *pps_dev;
@@ -120,7 +163,7 @@ static void pps_task(rtems_task_argument arg)
sc = rtems_event_send( ctx->main_task, PPS_EVENT_RECEIVED ); sc = rtems_event_send( ctx->main_task, PPS_EVENT_RECEIVED );
T_rsc_success( sc ); T_rsc_success( sc );
rtems_task_delete(rtems_task_self()); rtems_task_exit();
} }
T_TEST_CASE( WakeupTaskWithPPSEvent ) T_TEST_CASE( WakeupTaskWithPPSEvent )
@@ -134,11 +177,11 @@ T_TEST_CASE( WakeupTaskWithPPSEvent )
rtems_task_priority pps_task_prio = 1; rtems_task_priority pps_task_prio = 1;
rtems_event_set out; rtems_event_set out;
memset( &pps_dev, 0, sizeof( pps_dev ) );
pps_dev.task_waiting = RTEMS_INVALID_ID; pps_dev.task_waiting = RTEMS_INVALID_ID;
ctx.pps_dev = &pps_dev; ctx.pps_dev = &pps_dev;
ctx.main_task = rtems_task_self(); ctx.main_task = rtems_task_self();
memset( &pps_dev.pps, 0, sizeof( pps_dev.pps ) );
pps_dev.pps.ppscap = PPS_CAPTUREBOTH; pps_dev.pps.ppscap = PPS_CAPTUREBOTH;
pps_init_abi( &pps_dev.pps ); pps_init_abi( &pps_dev.pps );
pps_dev.pps.wait = wait; pps_dev.pps.wait = wait;