[PATCH 29/33] spintrcritical21: Use T_interrupt_test()

Sebastian Huber sebastian.huber at embedded-brains.de
Tue Jul 21 15:04:46 UTC 2020


---
 testsuites/sptests/Makefile.am                |   3 +-
 testsuites/sptests/spintrcritical21/init.c    | 220 ++++++++++--------
 .../spintrcritical21/spintrcritical21.scn     |  27 ++-
 testsuites/sptests/spintrcritical21/system.h  |  39 ----
 4 files changed, 149 insertions(+), 140 deletions(-)
 delete mode 100644 testsuites/sptests/spintrcritical21/system.h

diff --git a/testsuites/sptests/Makefile.am b/testsuites/sptests/Makefile.am
index 56e7da0462..78fe657051 100644
--- a/testsuites/sptests/Makefile.am
+++ b/testsuites/sptests/Makefile.am
@@ -1350,8 +1350,7 @@ if TEST_spintrcritical21
 sp_tests += spintrcritical21
 sp_screens += spintrcritical21/spintrcritical21.scn
 sp_docs += spintrcritical21/spintrcritical21.doc
-spintrcritical21_SOURCES = spintrcritical21/init.c \
-	spintrcritical_support/intrcritical.c
+spintrcritical21_SOURCES = spintrcritical21/init.c
 spintrcritical21_CPPFLAGS = $(AM_CPPFLAGS) \
 	$(TEST_FLAGS_spintrcritical21) $(support_includes) \
 	-I$(top_srcdir)/spintrcritical_support
diff --git a/testsuites/sptests/spintrcritical21/init.c b/testsuites/sptests/spintrcritical21/init.c
index faa48f717c..b265d7b641 100644
--- a/testsuites/sptests/spintrcritical21/init.c
+++ b/testsuites/sptests/spintrcritical21/init.c
@@ -1,6 +1,8 @@
 /*
  *  Classic API Signal to Task from ISR
  *
+ *  Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
+ *
  *  COPYRIGHT (c) 1989-2011.
  *  On-Line Applications Research Corporation (OAR).
  *
@@ -13,67 +15,74 @@
 #include "config.h"
 #endif
 
-#define CONFIGURE_INIT
-#include "system.h"
-
-#include <intrcritical.h>
+#include <rtems/test.h>
+#include <rtems/simple-test.h>
 
 #include <rtems/score/threadimpl.h>
 #include <rtems/rtems/eventimpl.h>
 
 const char rtems_test_name[] = "SPINTRCRITICAL 21";
 
-/*
- *  ERROR CHECKING NOTE:
- *
- *  We are either at dispatch disable level 1 or 2.  Either way, it is
- *  safer not to check the dispatch level explicitly so we are using
- *  fatal_directive_check_status_only() not directive_failed().
- */
-
-static volatile bool case_hit;
+#define MAX_ITERATION_COUNT 10000
 
-static rtems_id main_task;
+typedef struct {
+  rtems_id        main_task;
+  Thread_Control *main_thread;
+  rtems_id        other_task;
+} test_context;
 
-static Thread_Control *main_thread;
-
-static rtems_id other_task;
+static bool is_blocked( Thread_Wait_flags flags )
+{
+  return flags == ( THREAD_WAIT_CLASS_EVENT | THREAD_WAIT_STATE_BLOCKED );
+}
 
-static bool is_case_hit( void )
+static bool interrupts_blocking_op( Thread_Wait_flags flags )
 {
-  return _Thread_Wait_flags_get( main_thread)
+  return flags
     == ( THREAD_WAIT_CLASS_EVENT | THREAD_WAIT_STATE_INTEND_TO_BLOCK );
 }
 
-static rtems_timer_service_routine test_event_from_isr(
-  rtems_id  timer,
-  void     *arg
+static T_interrupt_test_state event_from_isr_interrupt(
+  void *arg
 )
 {
-  rtems_status_code     status;
+  test_context           *ctx;
+  T_interrupt_test_state state;
+  Thread_Wait_flags      flags;
+  rtems_status_code      status;
 
-  if ( is_case_hit() ) {
+  ctx = arg;
+  flags = _Thread_Wait_flags_get( ctx->main_thread );
+
+  if ( interrupts_blocking_op( flags ) ) {
     /*
      *  This event send hits the critical section but sends to
      *  another task so doesn't impact this critical section.
      */
-    status = rtems_event_send( other_task, 0x02 );
-    fatal_directive_check_status_only( status, RTEMS_SUCCESSFUL, "event send" );
+    status = rtems_event_send( ctx->other_task, 0x02 );
+    T_quiet_rsc_success( status );
 
     /*
      *  This event send hits the main task but doesn't satisfy
      *  it's blocking condition so it will still block
      */
-    status = rtems_event_send( main_task, 0x02 );
-    fatal_directive_check_status_only( status, RTEMS_SUCCESSFUL, "event send" );
-
-    case_hit = true;
+    status = rtems_event_send( ctx->main_task, 0x02 );
+    T_quiet_rsc_success( status );
+
+    state = T_INTERRUPT_TEST_DONE;
+  } else if ( is_blocked( flags ) ) {
+    state = T_INTERRUPT_TEST_LATE;
+  } else {
+    state = T_INTERRUPT_TEST_EARLY;
   }
-  status = rtems_event_send( main_task, 0x01 );
-  fatal_directive_check_status_only( status, RTEMS_SUCCESSFUL, "event send" );
+
+  status = rtems_event_send( ctx->main_task, 0x01 );
+  T_quiet_rsc_success( status );
+
+  return state;
 }
 
-static bool test_body_event_from_isr( void *arg )
+static void event_from_isr_action( void *arg )
 {
   rtems_status_code status;
   rtems_event_set   out;
@@ -81,30 +90,72 @@ static bool test_body_event_from_isr( void *arg )
   (void) arg;
 
   status = rtems_event_receive( 0x01, RTEMS_DEFAULT_OPTIONS, 0, &out );
-  rtems_test_assert( status == RTEMS_SUCCESSFUL );
+  T_quiet_rsc_success( status );
+}
+
+static const T_interrupt_test_config event_from_isr_config = {
+  .action = event_from_isr_action,
+  .interrupt = event_from_isr_interrupt,
+  .max_iteration_count = MAX_ITERATION_COUNT
+};
+
+T_TEST_CASE(EventFromISR)
+{
+  test_context           ctx;
+  T_interrupt_test_state state;
+  rtems_status_code      status;
+
+  ctx.main_task = rtems_task_self();
+  ctx.main_thread = _Thread_Get_executing();
+
+  status = rtems_task_create(
+    0xa5a5a5a5,
+    1,
+    RTEMS_MINIMUM_STACK_SIZE,
+    RTEMS_DEFAULT_MODES,
+    RTEMS_DEFAULT_ATTRIBUTES,
+    &ctx.other_task
+  );
+  T_assert_rsc_success( status );
+
+  state = T_interrupt_test( &event_from_isr_config, &ctx );
+  T_eq_int( state, T_INTERRUPT_TEST_DONE );
 
-  return case_hit;
+  status = rtems_task_delete( ctx.other_task );
+  T_rsc_success( status );
 }
 
-static rtems_timer_service_routine test_event_with_timeout_from_isr(
-  rtems_id  timer,
-  void     *arg
+static T_interrupt_test_state event_with_timeout_from_isr_interrupt(
+  void *arg
 )
 {
-  rtems_status_code     status;
+  test_context           *ctx;
+  T_interrupt_test_state  state;
+  Thread_Wait_flags       flags;
+  rtems_status_code       status;
 
-  if ( is_case_hit() ) {
+  ctx = arg;
+  flags = _Thread_Wait_flags_get( ctx->main_thread );
+
+  if ( interrupts_blocking_op( flags ) ) {
     /*
      *  We want to catch the task while it is blocking.  Otherwise
      *  just send and make it happy.
      */
-    case_hit = true;
+    state = T_INTERRUPT_TEST_DONE;
+  } else if ( is_blocked( flags ) ) {
+    state = T_INTERRUPT_TEST_LATE;
+  } else {
+    state = T_INTERRUPT_TEST_EARLY;
   }
-  status = rtems_event_send( main_task, 0x01 );
-  fatal_directive_check_status_only( status, RTEMS_SUCCESSFUL, "event send" );
+
+  status = rtems_event_send( ctx->main_task, 0x01 );
+  T_quiet_rsc_success( status );
+
+  return state;
 }
 
-static bool test_body_event_with_timeout_from_isr( void *arg )
+static void event_with_timeout_from_isr_action( void *arg )
 {
   rtems_status_code status;
   rtems_event_set   out;
@@ -112,69 +163,44 @@ static bool test_body_event_with_timeout_from_isr( void *arg )
   (void) arg;
 
   status = rtems_event_receive( 0x01, RTEMS_DEFAULT_OPTIONS, 1, &out );
-  rtems_test_assert( status == RTEMS_SUCCESSFUL || status == RTEMS_TIMEOUT );
-
-  return case_hit;
+  T_quiet_true( status == RTEMS_SUCCESSFUL || status == RTEMS_TIMEOUT );
 }
 
-rtems_task Init(
-  rtems_task_argument argument
-)
-{
-  rtems_status_code     status;
-
-  TEST_BEGIN();
+static const T_interrupt_test_config event_with_timeout_from_isr_config = {
+  .action = event_with_timeout_from_isr_action,
+  .interrupt = event_with_timeout_from_isr_interrupt,
+  .max_iteration_count = MAX_ITERATION_COUNT
+};
 
-  main_task = rtems_task_self();
-  main_thread = _Thread_Get_executing();
+T_TEST_CASE( EventWithTimeoutFromISR )
+{
+  test_context           ctx;
+  T_interrupt_test_state state;
 
-  status = rtems_task_create(
-    0xa5a5a5a5,
-    1,
-    RTEMS_MINIMUM_STACK_SIZE,
-    RTEMS_DEFAULT_MODES,
-    RTEMS_DEFAULT_ATTRIBUTES,
-    &other_task
-  );
-  directive_failed( status, "rtems_task_create" );
+  ctx.main_task = rtems_task_self();
+  ctx.main_thread = _Thread_Get_executing();
+  ctx.other_task = 0xdeadbeef;
 
-  /*
-   * Test Event send successful from ISR -- receive is forever
-   */
+  state = T_interrupt_test( &event_with_timeout_from_isr_config, &ctx );
+  T_eq_int( state, T_INTERRUPT_TEST_DONE );
+}
 
-  case_hit = false;
-  interrupt_critical_section_test(
-    test_body_event_from_isr,
-    NULL,
-    test_event_from_isr
-  );
+static rtems_task Init( rtems_task_argument argument )
+{
+  rtems_test_run( argument, TEST_STATE );
+}
 
-  printf(
-    "Event sent from ISR hitting synchronization point has %soccurred\n",
-    case_hit ? "" : "NOT "
-  );
+#define CONFIGURE_INIT
 
-  rtems_test_assert( case_hit );
+#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
 
-  /*
-   * Test Event send successful from ISR -- receive has timeout
-   */
+#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
 
-  case_hit = false;
-  interrupt_critical_section_test(
-    test_body_event_with_timeout_from_isr,
-    NULL,
-    test_event_with_timeout_from_isr
-  );
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
 
-  printf(
-    "Event sent from ISR (with timeout) hitting synchronization "
-      "point has %soccurred\n",
-    case_hit ? "" : "NOT "
-  );
+#define CONFIGURE_MICROSECONDS_PER_TICK   1000
 
-  rtems_test_assert( case_hit );
+#define CONFIGURE_MAXIMUM_TASKS             2
 
-  TEST_END();
-  rtems_test_exit( 0 );
-}
+#include <rtems/confdefs.h>
diff --git a/testsuites/sptests/spintrcritical21/spintrcritical21.scn b/testsuites/sptests/spintrcritical21/spintrcritical21.scn
index d7a1998d0a..f20fff9b69 100644
--- a/testsuites/sptests/spintrcritical21/spintrcritical21.scn
+++ b/testsuites/sptests/spintrcritical21/spintrcritical21.scn
@@ -1,4 +1,27 @@
 *** BEGIN OF TEST SPINTRCRITICAL 21 ***
-Event sent from ISR hitting synchronization point has occurred
-Event sent from ISR (with timeout) hitting synchronization point has occurred
+*** 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 21
+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:EventWithTimeoutFromISR
+P:0:0:UI1:init.c:185
+E:EventWithTimeoutFromISR:N:1:F:0:D:0.990057
+B:EventFromISR
+P:0:0:UI1:init.c:119
+P:1:0:UI1:init.c:122
+P:2:0:UI1:init.c:125
+E:EventFromISR:N:3:F:0:D:0.042543
+Z:SPINTRCRITICAL 21:C:2:N:4:F:0:D:1.034216
+Y:ReportHash:SHA256:64aa73f53f6e67b5eb349f0dcf4e2246ce87d7e3e8c201f9ee26ec4e3bfc30f6
+
 *** END OF TEST SPINTRCRITICAL 21 ***
diff --git a/testsuites/sptests/spintrcritical21/system.h b/testsuites/sptests/spintrcritical21/system.h
deleted file mode 100644
index 04b9050598..0000000000
--- a/testsuites/sptests/spintrcritical21/system.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*  system.h
- *
- *  This include file contains information that is included in every
- *  function in the test set.
- *
- *  COPYRIGHT (c) 1989-2007.
- *  On-Line Applications Research Corporation (OAR).
- *
- *  The license and distribution terms for this file may be
- *  found in the file LICENSE in this distribution or at
- *  http://www.rtems.org/license/LICENSE.
- */
-
-#include <tmacros.h>
-
-/* functions */
-
-rtems_task Init(
-  rtems_task_argument argument
-);
-
-/* configuration information */
-
-#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
-#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
-
-#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
-
-#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
-
-#define CONFIGURE_MICROSECONDS_PER_TICK   1000
-
-#define CONFIGURE_MAXIMUM_TASKS             2
-#define CONFIGURE_MAXIMUM_TIMERS            1
-#define CONFIGURE_MAXIMUM_USER_EXTENSIONS   1
-
-#include <rtems/confdefs.h>
-
-/* end of include file */
-- 
2.26.2



More information about the devel mailing list