From 1c2e05d4e3afcdaa34463489a36a908e4a6c591f Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Mon, 20 Jul 2020 17:44:42 +0200 Subject: spintrcritical15: Use T_interrupt_test() --- testsuites/sptests/Makefile.am | 4 +- testsuites/sptests/spintrcritical15/init.c | 133 ++++++++++++++------- .../sptests/spintrcritical15/spintrcritical15.scn | 34 ++++-- 3 files changed, 117 insertions(+), 54 deletions(-) (limited to 'testsuites') diff --git a/testsuites/sptests/Makefile.am b/testsuites/sptests/Makefile.am index 7dbc829ddf..0cf00f7fa6 100644 --- a/testsuites/sptests/Makefile.am +++ b/testsuites/sptests/Makefile.am @@ -1310,9 +1310,7 @@ if TEST_spintrcritical15 sp_tests += spintrcritical15 sp_screens += spintrcritical15/spintrcritical15.scn sp_docs += spintrcritical15/spintrcritical15.doc -spintrcritical15_SOURCES = spintrcritical15/init.c \ - spintrcritical_support/intrcritical.c \ - spintrcritical_support/intrcritical.h +spintrcritical15_SOURCES = spintrcritical15/init.c spintrcritical15_CPPFLAGS = $(AM_CPPFLAGS) \ $(TEST_FLAGS_spintrcritical15) $(support_includes) \ -I$(top_srcdir)/spintrcritical_support diff --git a/testsuites/sptests/spintrcritical15/init.c b/testsuites/sptests/spintrcritical15/init.c index 9de33b3cfb..3b58dc045c 100644 --- a/testsuites/sptests/spintrcritical15/init.c +++ b/testsuites/sptests/spintrcritical15/init.c @@ -1,4 +1,6 @@ /* + * Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de) + * * COPYRIGHT (c) 1989-2009. * On-Line Applications Research Corporation (OAR). * @@ -11,89 +13,133 @@ #include "config.h" #endif -#include -#include +#include +#include -const char rtems_test_name[] = "SPINTRCRITICAL 15"; +#include -/* forward declarations to avoid warnings */ -rtems_task Init(rtems_task_argument argument); -rtems_task Secondary_task(rtems_task_argument ignored); +const char rtems_test_name[] = "SPINTRCRITICAL 15"; #define INIT_PRIORITY 2 #define BLOCKER_PRIORITY 1 -rtems_id Secondary_task_id; -rtems_id Semaphore; +typedef struct { + rtems_id secondary_task_id; + rtems_id semaphore; + Thread_Control *main_thread; +} test_context; -rtems_task Secondary_task( - rtems_task_argument ignored -) +static rtems_task Secondary_task( rtems_task_argument arg ) { - rtems_status_code sc; + test_context *ctx; + rtems_status_code sc; + + ctx = (test_context *) arg; while (1) { - sc = rtems_semaphore_obtain( Semaphore, RTEMS_DEFAULT_OPTIONS, 1 ); - fatal_directive_status( sc, RTEMS_TIMEOUT, "rtems_semaphore_obtain" ); + sc = rtems_semaphore_obtain( ctx->semaphore, RTEMS_DEFAULT_OPTIONS, 1 ); + T_quiet_rsc( sc, RTEMS_TIMEOUT ); } } -static bool test_body( void *arg ) +static T_interrupt_test_state interrupt(void *arg) { - rtems_status_code sc; + test_context *ctx; + Thread_Wait_flags flags; + T_interrupt_test_state state; + + ctx = arg; + flags = _Thread_Wait_flags_get( ctx->main_thread ); + + if ( + flags == ( THREAD_WAIT_CLASS_OBJECT | THREAD_WAIT_STATE_INTEND_TO_BLOCK ) + ) { + state = T_INTERRUPT_TEST_DONE; + } else if ( + flags == ( THREAD_WAIT_CLASS_OBJECT | THREAD_WAIT_STATE_BLOCKED ) + ) { + state = T_INTERRUPT_TEST_LATE; + } else { + state = T_INTERRUPT_TEST_EARLY; + } - (void) arg; + return state; +} - sc = rtems_task_restart( Secondary_task_id, 1 ); - rtems_test_assert( sc == RTEMS_SUCCESSFUL ); +static void prepare( void *arg ) +{ + test_context *ctx; + rtems_status_code sc; - sc = rtems_semaphore_obtain( Semaphore, RTEMS_DEFAULT_OPTIONS, 1 ); - rtems_test_assert( sc == RTEMS_TIMEOUT ); + ctx = arg; + sc = rtems_task_restart( ctx->secondary_task_id, (rtems_task_argument) ctx ); + T_quiet_rsc_success( sc ); +} - return false; +static void action( void *arg ) +{ + test_context *ctx; + rtems_status_code sc; + + ctx = arg; + sc = rtems_semaphore_obtain( ctx->semaphore, RTEMS_DEFAULT_OPTIONS, 1 ); + T_quiet_rsc( sc, RTEMS_TIMEOUT ); } -rtems_task Init( - rtems_task_argument ignored -) +static const T_interrupt_test_config config = { + .prepare = prepare, + .action = action, + .interrupt = interrupt, + .max_iteration_count = 10000 +}; + +T_TEST_CASE( SemaphoreObtainBlockedInterrupt ) { - rtems_status_code sc; + test_context ctx; + rtems_status_code sc; + T_interrupt_test_state state; - TEST_BEGIN(); - puts( - "Init - Trying to generate timeout of a thread while another is blocking\n" - "Init - on the same thread queue\n" - "Init - There is no way for the test to know if it hits the case" - ); + ctx.main_thread = _Thread_Get_executing(); - puts( "Init - rtems_semaphore_create - OK" ); sc = rtems_semaphore_create( rtems_build_name( 'S', 'M', '1', ' ' ), 0, RTEMS_DEFAULT_ATTRIBUTES, RTEMS_NO_PRIORITY, - &Semaphore + &ctx.semaphore ); - directive_failed( sc, "rtems_semaphore_create of SM1" ); + T_assert_rsc_success( sc ); - puts( "Init - rtems_task_create - OK" ); sc = rtems_task_create( rtems_build_name( 'B', 'L', 'C', 'K' ), BLOCKER_PRIORITY, RTEMS_MINIMUM_STACK_SIZE, RTEMS_NO_PREEMPT, RTEMS_DEFAULT_ATTRIBUTES, - &Secondary_task_id + &ctx.secondary_task_id + ); + T_assert_rsc_success( sc ); + + sc = rtems_task_start( + ctx.secondary_task_id, + Secondary_task, + (rtems_task_argument) &ctx ); - directive_failed( sc, "rtems_task_create" ); + T_assert_rsc_success( sc ); + + state = T_interrupt_test( &config, &ctx ); + T_eq_int( state, T_INTERRUPT_TEST_DONE ); - sc = rtems_task_start( Secondary_task_id, Secondary_task, 0 ); - directive_failed( sc, "rtems_task_start" ); + sc = rtems_task_delete( ctx.secondary_task_id ); + T_rsc_success( sc ); - interrupt_critical_section_test( test_body, NULL, NULL ); + sc = rtems_semaphore_delete( ctx.semaphore ); + T_rsc_success( sc ); +} - TEST_END(); - rtems_test_exit(0); +static rtems_task Init( rtems_task_argument argument ) +{ + rtems_test_run( argument, TEST_STATE ); } /* configuration information */ @@ -103,7 +149,6 @@ rtems_task Init( #define CONFIGURE_MAXIMUM_TASKS 2 #define CONFIGURE_MAXIMUM_SEMAPHORES 1 -#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1 #define CONFIGURE_MICROSECONDS_PER_TICK 1000 #define CONFIGURE_INIT_TASK_PRIORITY INIT_PRIORITY #define CONFIGURE_INIT_TASK_INITIAL_MODES RTEMS_PREEMPT diff --git a/testsuites/sptests/spintrcritical15/spintrcritical15.scn b/testsuites/sptests/spintrcritical15/spintrcritical15.scn index ee8db40cdd..937b05ea24 100644 --- a/testsuites/sptests/spintrcritical15/spintrcritical15.scn +++ b/testsuites/sptests/spintrcritical15/spintrcritical15.scn @@ -1,7 +1,27 @@ -*** TEST INTERRUPT CRITICAL SECTION 15 *** -Init - Trying to generate timeout of a thread while another is blocking -Init - on the same thread queue -Init - There is no way for the test to know if it hits the case -Init - rtems_semaphore_create - OK -Init - rtems_task_create - OK -*** END OF TEST INTERRUPT CRITICAL SECTION 15 *** +*** BEGIN OF TEST SPINTRCRITICAL 15 *** +*** TEST VERSION: 6.0.0.929e49a54ab4d2d18c9fb8d03610614f63e25b8d +*** TEST STATE: EXPECTED_PASS +*** TEST BUILD: RTEMS_DEBUG RTEMS_POSIX_API RTEMS_SMP +*** TEST TOOLS: 10.0.1 20200406 (RTEMS 6, RSB bec88a6dd856892c3e66e4598252ea07d7a0d762, Newlib ece49e4) +A:SPINTRCRITICAL 15 +S:Platform:RTEMS +S:Compiler:10.0.1 20200406 (RTEMS 6, RSB bec88a6dd856892c3e66e4598252ea07d7a0d762, Newlib ece49e4) +S:Version:6.0.0.929e49a54ab4d2d18c9fb8d03610614f63e25b8d +S:BSP:realview_pbx_a9_qemu +S:RTEMS_DEBUG:1 +S:RTEMS_MULTIPROCESSING:0 +S:RTEMS_POSIX_API:1 +S:RTEMS_PROFILING:0 +S:RTEMS_SMP:1 +B:SemaphoreObtainBlockedInterrupt +P:0:0:UI1:init.c:111 +P:1:0:UI1:init.c:121 +P:2:0:UI1:init.c:128 +P:3:0:UI1:init.c:131 +P:4:0:UI1:init.c:134 +P:5:0:UI1:init.c:137 +E:SemaphoreObtainBlockedInterrupt:N:6:F:0:D:0.063907 +Z:SPINTRCRITICAL 15:C:1:N:6:F:0:D:0.065120 +Y:ReportHash:SHA256:198a9452944e985b137ec4b427be51cef71af413f6e3bfdf03a2f29a9bd81259 + +*** END OF TEST SPINTRCRITICAL 15 *** -- cgit v1.2.3