[PATCH 28/33] spintrcritical20: Use T_interrupt_test()

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


---
 testsuites/sptests/Makefile.am                |   3 +-
 testsuites/sptests/spintrcritical20/init.c    | 145 +++++++++++-------
 .../spintrcritical20/spintrcritical20.scn     |  32 +++-
 3 files changed, 121 insertions(+), 59 deletions(-)

diff --git a/testsuites/sptests/Makefile.am b/testsuites/sptests/Makefile.am
index 5df21b89af..56e7da0462 100644
--- a/testsuites/sptests/Makefile.am
+++ b/testsuites/sptests/Makefile.am
@@ -1340,8 +1340,7 @@ if TEST_spintrcritical20
 sp_tests += spintrcritical20
 sp_screens += spintrcritical20/spintrcritical20.scn
 sp_docs += spintrcritical20/spintrcritical20.doc
-spintrcritical20_SOURCES = spintrcritical20/init.c \
-	spintrcritical_support/intrcritical.c
+spintrcritical20_SOURCES = spintrcritical20/init.c
 spintrcritical20_CPPFLAGS = $(AM_CPPFLAGS) \
 	$(TEST_FLAGS_spintrcritical20) $(support_includes) \
 	-I$(top_srcdir)/spintrcritical_support
diff --git a/testsuites/sptests/spintrcritical20/init.c b/testsuites/sptests/spintrcritical20/init.c
index 60af3adebd..0ab2e15698 100644
--- a/testsuites/sptests/spintrcritical20/init.c
+++ b/testsuites/sptests/spintrcritical20/init.c
@@ -1,11 +1,5 @@
 /*
- * Copyright (c) 2013 embedded brains GmbH.  All rights reserved.
- *
- *  embedded brains GmbH
- *  Dornierstr. 4
- *  82178 Puchheim
- *  Germany
- *  <rtems at embedded-brains.de>
+ * Copyright (C) 2013, 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
@@ -16,8 +10,11 @@
 #include "config.h"
 #endif
 
-#include <tmacros.h>
-#include <intrcritical.h>
+#include <string.h>
+
+#include <rtems/test.h>
+#include <rtems/simple-test.h>
+
 #include <rtems/score/threadimpl.h>
 #include <rtems/score/threadqimpl.h>
 #include <rtems/rtems/semimpl.h>
@@ -36,10 +33,10 @@ typedef struct {
   bool thread_queue_was_null;
   bool status_was_successful;
   bool status_was_timeout;
+  volatile bool early;
+  volatile bool late;
 } test_context;
 
-static test_context ctx_instance;
-
 static void semaphore_task(rtems_task_argument arg)
 {
   test_context *ctx = (test_context *) arg;
@@ -52,37 +49,63 @@ static void semaphore_task(rtems_task_argument arg)
       RTEMS_WAIT,
       RTEMS_NO_TIMEOUT
     );
-    rtems_test_assert(sc == RTEMS_SUCCESSFUL || sc == RTEMS_TIMEOUT);
+    T_quiet_true(sc == RTEMS_SUCCESSFUL || sc == RTEMS_TIMEOUT);
+  }
+}
+
+static T_interrupt_test_state interrupt(void *arg)
+{
+  test_context *ctx = arg;
+  T_interrupt_test_state state;
+  rtems_status_code sc;
+
+  state = T_interrupt_test_change_state(
+    T_INTERRUPT_TEST_ACTION,
+    T_INTERRUPT_TEST_ACTION
+  );
+
+  if (state != T_INTERRUPT_TEST_ACTION) {
+    return T_INTERRUPT_TEST_CONTINUE;
   }
+
+  sc = rtems_semaphore_release(ctx->semaphore_id);
+  T_quiet_rsc_success(sc);
+
+  if ( ctx->early ) {
+    state = T_INTERRUPT_TEST_EARLY;
+  } else if ( ctx->late ) {
+    state = T_INTERRUPT_TEST_LATE;
+  } else if (
+    ctx->thread_queue_was_null
+      && ctx->status_was_successful
+      && ctx->status_was_timeout
+  ) {
+    state = T_INTERRUPT_TEST_DONE;
+  } else {
+    state = T_INTERRUPT_TEST_CONTINUE;
+  }
+
+  return state;
 }
 
-static void release_semaphore(rtems_id timer, void *arg)
+static void prepare(void *arg)
 {
-  /* The arg is NULL */
-  test_context *ctx = &ctx_instance;
-  rtems_status_code sc = rtems_semaphore_release(ctx->semaphore_id);
-  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+  test_context *ctx = arg;
+
+  ctx->early = true;
+  ctx->late = false;
 }
 
-static bool test_body(void *arg)
+static void action(void *arg)
 {
   test_context *ctx = arg;
-  int busy;
   Per_CPU_Control *cpu_self;
+  T_interrupt_test_state state;
 
   cpu_self = _Thread_Dispatch_disable();
+  ctx->early = false;
 
-  rtems_test_assert(
-    _Thread_Wait_get_status( ctx->semaphore_task_tcb ) == STATUS_SUCCESSFUL
-  );
-
-  /*
-   * Spend some time to make it more likely that we hit the test condition
-   * below.
-   */
-  for (busy = 0; busy < 1000; ++busy) {
-    __asm__ volatile ("");
-  }
+  T_quiet_rsc_success(_Thread_Wait_get_status( ctx->semaphore_task_tcb ));
 
   if (ctx->semaphore_task_tcb->Wait.queue == NULL) {
     ctx->thread_queue_was_null = true;
@@ -98,34 +121,42 @@ static bool test_body(void *arg)
       ctx->status_was_timeout = true;
       break;
     default:
-      rtems_test_assert(0);
+      T_unreachable();
       break;
   }
 
+  ctx->late = true;
   _Thread_Dispatch_enable(cpu_self);
 
-  return ctx->thread_queue_was_null
-    && ctx->status_was_successful
-    && ctx->status_was_timeout;
+  do {
+    state = T_interrupt_test_get_state();
+  } while (state == T_INTERRUPT_TEST_ACTION);
 }
 
-static void 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(SemaphoreObtainTimeoutInterrupt)
 {
-  test_context *ctx = &ctx_instance;
+  test_context ctx;
   rtems_status_code sc;
+  T_interrupt_test_state state;
 
-  TEST_BEGIN();
-
-  ctx->master_task = rtems_task_self();
+  memset(&ctx, 0, sizeof(ctx));
+  ctx.master_task = rtems_task_self();
 
   sc = rtems_semaphore_create(
     rtems_build_name('S', 'E', 'M', 'A'),
     1,
     RTEMS_COUNTING_SEMAPHORE,
     0,
-    &ctx->semaphore_id
+    &ctx.semaphore_id
   );
-  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+  T_assert_rsc_success(sc);
 
   sc = rtems_task_create(
     rtems_build_name('S', 'E', 'M', 'A'),
@@ -133,26 +164,34 @@ static void Init(rtems_task_argument ignored)
     RTEMS_MINIMUM_STACK_SIZE,
     RTEMS_DEFAULT_MODES,
     RTEMS_DEFAULT_ATTRIBUTES,
-    &ctx->semaphore_task
+    &ctx.semaphore_task
   );
-  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+  T_assert_rsc_success(sc);
 
   sc = rtems_task_start(
-    ctx->semaphore_task,
+    ctx.semaphore_task,
     semaphore_task,
-    (rtems_task_argument) ctx
+    (rtems_task_argument) &ctx
   );
-  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+  T_assert_rsc_success(sc);
 
-  interrupt_critical_section_test(test_body, ctx, release_semaphore);
+  state = T_interrupt_test(&config, &ctx);
+  T_eq_int(state, T_INTERRUPT_TEST_DONE);
 
-  rtems_test_assert(ctx->thread_queue_was_null);
-  rtems_test_assert(ctx->status_was_successful);
-  rtems_test_assert(ctx->status_was_timeout);
+  T_true(ctx.thread_queue_was_null);
+  T_true(ctx.status_was_successful);
+  T_true(ctx.status_was_timeout);
 
-  TEST_END();
+  sc = rtems_task_delete(ctx.semaphore_task);
+  T_rsc_success(sc);
 
-  rtems_test_exit(0);
+  sc = rtems_semaphore_delete(ctx.semaphore_id);
+  T_rsc_success(sc);
+}
+
+static rtems_task Init(rtems_task_argument argument)
+{
+  rtems_test_run(argument, TEST_STATE);
 }
 
 #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
@@ -162,8 +201,6 @@ static void Init(rtems_task_argument ignored)
 
 #define CONFIGURE_MAXIMUM_SEMAPHORES 1
 #define CONFIGURE_MAXIMUM_TASKS 2
-#define CONFIGURE_MAXIMUM_TIMERS 1
-#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1
 
 #define CONFIGURE_INIT_TASK_PRIORITY PRIORITY_MASTER
 #define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_DEFAULT_ATTRIBUTES
diff --git a/testsuites/sptests/spintrcritical20/spintrcritical20.scn b/testsuites/sptests/spintrcritical20/spintrcritical20.scn
index 867d2a26e3..7f5ec87aba 100644
--- a/testsuites/sptests/spintrcritical20/spintrcritical20.scn
+++ b/testsuites/sptests/spintrcritical20/spintrcritical20.scn
@@ -1,4 +1,30 @@
-*** TEST INTERRUPT CRITICAL SECTION 20 ***
+*** BEGIN OF TEST SPINTRCRITICAL 20 ***
+*** 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 20
+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:SemaphoreObtainTimeoutInterrupt
+P:0:0:UI1:init.c:159
+P:1:0:UI1:init.c:169
+P:2:0:UI1:init.c:176
+P:3:0:UI1:init.c:179
+P:4:0:UI1:init.c:181
+P:5:0:UI1:init.c:182
+P:6:0:UI1:init.c:183
+P:7:0:UI1:init.c:186
+P:8:0:UI1:init.c:189
+E:SemaphoreObtainTimeoutInterrupt:N:9:F:0:D:0.105419
+Z:SPINTRCRITICAL 20:C:1:N:9:F:0:D:0.106593
+Y:ReportHash:SHA256:8429590b312ac9e661529a4a932470feefd05747f60d30afaee1486259d26972
 
-Support - rtems_timer_create - creating timer 1
-*** END OF TEST INTERRUPT CRITICAL SECTION 20 ***
+*** END OF TEST SPINTRCRITICAL 20 ***
-- 
2.26.2



More information about the devel mailing list