[PATCH 30/33] spintrcritical22: Use T_interrupt_test()

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


---
 testsuites/sptests/Makefile.am                |   4 +-
 testsuites/sptests/spintrcritical22/init.c    | 103 +++++++++++-------
 .../spintrcritical22/spintrcritical22.scn     |  20 ++++
 3 files changed, 87 insertions(+), 40 deletions(-)

diff --git a/testsuites/sptests/Makefile.am b/testsuites/sptests/Makefile.am
index 78fe657051..f35eeed664 100644
--- a/testsuites/sptests/Makefile.am
+++ b/testsuites/sptests/Makefile.am
@@ -1360,9 +1360,7 @@ if TEST_spintrcritical22
 sp_tests += spintrcritical22
 sp_screens += spintrcritical22/spintrcritical22.scn
 sp_docs += spintrcritical22/spintrcritical22.doc
-spintrcritical22_SOURCES = spintrcritical22/init.c \
-	spintrcritical_support/intrcritical.h \
-	spintrcritical_support/intrcritical.c
+spintrcritical22_SOURCES = spintrcritical22/init.c
 spintrcritical22_CPPFLAGS = $(AM_CPPFLAGS) \
 	$(TEST_FLAGS_spintrcritical22) $(support_includes) \
 	-I$(top_srcdir)/spintrcritical_support
diff --git a/testsuites/sptests/spintrcritical22/init.c b/testsuites/sptests/spintrcritical22/init.c
index b7cd430867..a73499c888 100644
--- a/testsuites/sptests/spintrcritical22/init.c
+++ b/testsuites/sptests/spintrcritical22/init.c
@@ -1,11 +1,5 @@
 /*
- * Copyright (c) 2014 embedded brains GmbH.  All rights reserved.
- *
- *  embedded brains GmbH
- *  Dornierstr. 4
- *  82178 Puchheim
- *  Germany
- *  <rtems at embedded-brains.de>
+ * Copyright (C) 2014, 2020 embedded brains GmbH (http://www.embedded-brains.de)
  *
  * The license and distribution terms for this file may be
  * found in the file LICENSE in this distribution or at
@@ -17,7 +11,8 @@
 #endif
 
 #include <tmacros.h>
-#include <intrcritical.h>
+#include <rtems/test.h>
+
 #include <rtems/rtems/semimpl.h>
 
 const char rtems_test_name[] = "SPINTRCRITICAL 22";
@@ -26,11 +21,8 @@ typedef struct {
   rtems_id semaphore_id;
   Semaphore_Control *semaphore_control;
   Thread_Control *main_task_control;
-  volatile bool done;
 } test_context;
 
-static test_context ctx_instance;
-
 static Semaphore_Control *get_semaphore_control(rtems_id id)
 {
   Thread_queue_Context queue_context;
@@ -43,19 +35,21 @@ static Semaphore_Control *get_semaphore_control(rtems_id id)
   return sem;
 }
 
-static void release_semaphore(rtems_id timer, void *arg)
+static T_interrupt_test_state release_semaphore(void *arg)
 {
-  /* The arg is NULL */
-  test_context *ctx = &ctx_instance;
+  test_context *ctx = arg;
   rtems_status_code sc;
+  Thread_Wait_flags flags;
+  T_interrupt_test_state state;
+
+  flags = _Thread_Wait_flags_get(ctx->main_task_control);
 
   if (
-    _Thread_Wait_flags_get(ctx->main_task_control)
-      == (THREAD_WAIT_CLASS_OBJECT | THREAD_WAIT_STATE_INTEND_TO_BLOCK)
+    flags == (THREAD_WAIT_CLASS_OBJECT | THREAD_WAIT_STATE_INTEND_TO_BLOCK)
   ) {
     CORE_semaphore_Control *sem;
 
-    ctx->done = true;
+    state = T_INTERRUPT_TEST_DONE;
 
     sc = rtems_semaphore_release(ctx->semaphore_id);
     rtems_test_assert(sc == RTEMS_SUCCESSFUL);
@@ -67,12 +61,33 @@ static void release_semaphore(rtems_id timer, void *arg)
     sem = &ctx->semaphore_control->Core_control.Semaphore;
     rtems_test_assert(sem->count == 0);
   } else {
+    if (flags == (THREAD_WAIT_CLASS_EVENT | THREAD_WAIT_STATE_BLOCKED)) {
+      state = T_INTERRUPT_TEST_LATE;
+    } else {
+      state = T_INTERRUPT_TEST_EARLY;
+    }
+
     sc = rtems_semaphore_release(ctx->semaphore_id);
     rtems_test_assert(sc == RTEMS_SUCCESSFUL);
   }
+
+  return state;
+}
+
+static void action(void *arg)
+{
+  test_context *ctx = arg;
+  rtems_status_code sc;
+
+  sc = rtems_semaphore_obtain(
+    ctx->semaphore_id,
+    RTEMS_WAIT,
+    2
+  );
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
 }
 
-static bool test_body(void *arg)
+static void prepare(void *arg)
 {
   test_context *ctx = arg;
   rtems_status_code sc;
@@ -83,43 +98,59 @@ static bool test_body(void *arg)
     0
   );
   rtems_test_assert(sc == RTEMS_SUCCESSFUL || sc == RTEMS_UNSATISFIED);
+}
 
-  sc = rtems_semaphore_obtain(
-    ctx->semaphore_id,
-    RTEMS_WAIT,
-    2
+static void blocked(void *arg)
+{
+  test_context *ctx = arg;
+  rtems_status_code sc;
+
+  T_interrupt_test_change_state(
+    T_INTERRUPT_TEST_ACTION,
+    T_INTERRUPT_TEST_LATE
   );
-  rtems_test_assert(sc == RTEMS_SUCCESSFUL || sc == RTEMS_TIMEOUT);
 
-  return ctx->done;
+  sc = rtems_semaphore_release(ctx->semaphore_id);
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
 }
 
-static void Init(rtems_task_argument ignored)
+static const T_interrupt_test_config config = {
+  .prepare = prepare,
+  .action = action,
+  .interrupt = release_semaphore,
+  .blocked = blocked,
+  .max_iteration_count = 10000
+};
+
+T_TEST_CASE(InterruptSemaphoreObtain)
 {
-  test_context *ctx = &ctx_instance;
+  test_context ctx;
   rtems_status_code sc;
+  T_interrupt_test_state state;
 
-  TEST_BEGIN();
-
-  ctx->main_task_control = _Thread_Get_executing();
+  ctx.main_task_control = _Thread_Get_executing();
 
   sc = rtems_semaphore_create(
     rtems_build_name('S', 'E', 'M', 'A'),
     1,
     RTEMS_SIMPLE_BINARY_SEMAPHORE,
     0,
-    &ctx->semaphore_id
+    &ctx.semaphore_id
   );
   rtems_test_assert(sc == RTEMS_SUCCESSFUL);
 
-  ctx->semaphore_control = get_semaphore_control(ctx->semaphore_id);
+  ctx.semaphore_control = get_semaphore_control(ctx.semaphore_id);
 
-  interrupt_critical_section_test(test_body, ctx, release_semaphore);
-  rtems_test_assert(ctx->done);
+  state = T_interrupt_test(&config, &ctx);
+  T_eq_int(state, T_INTERRUPT_TEST_DONE);
 
-  TEST_END();
+  sc = rtems_semaphore_delete(ctx.semaphore_id);
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+}
 
-  rtems_test_exit(0);
+static void Init(rtems_task_argument argument)
+{
+  rtems_test_run(argument, TEST_STATE);
 }
 
 #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
@@ -129,8 +160,6 @@ static void Init(rtems_task_argument ignored)
 
 #define CONFIGURE_MAXIMUM_SEMAPHORES 1
 #define CONFIGURE_MAXIMUM_TASKS 1
-#define CONFIGURE_MAXIMUM_TIMERS 1
-#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1
 
 #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
 
diff --git a/testsuites/sptests/spintrcritical22/spintrcritical22.scn b/testsuites/sptests/spintrcritical22/spintrcritical22.scn
index 7cf4ed2850..ed8863b98b 100644
--- a/testsuites/sptests/spintrcritical22/spintrcritical22.scn
+++ b/testsuites/sptests/spintrcritical22/spintrcritical22.scn
@@ -1,2 +1,22 @@
 *** BEGIN OF TEST SPINTRCRITICAL 22 ***
+*** 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 22
+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:InterruptSemaphoreObtain
+P:0:0:UI1:init.c:145
+E:InterruptSemaphoreObtain:N:1:F:0:D:0.432627
+Z:SPINTRCRITICAL 22:C:1:N:1:F:0:D:0.433689
+Y:ReportHash:SHA256:0a161773566007e97ab42b4a9303b6937c1a3fceac5201aba50f9755cd880459
+
 *** END OF TEST SPINTRCRITICAL 22 ***
-- 
2.26.2



More information about the devel mailing list