From 38636e23c648de6d9c77c166b3def683c1a65e71 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 21 Jul 2020 07:19:30 +0200 Subject: spintrcritical20: Use T_interrupt_test() --- testsuites/sptests/Makefile.am | 3 +- testsuites/sptests/spintrcritical20/init.c | 139 +++++++++++++-------- .../sptests/spintrcritical20/spintrcritical20.scn | 32 ++++- 3 files changed, 115 insertions(+), 59 deletions(-) (limited to 'testsuites') 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..df83ee416a 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 - * + * 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 -#include +#include + +#include +#include + #include #include #include @@ -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,59 @@ 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 void release_semaphore(rtems_id timer, void *arg) +static T_interrupt_test_state interrupt(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; + T_interrupt_test_state state; + rtems_status_code sc; + + state = T_interrupt_test_get_state(); + + 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 bool test_body(void *arg) +static void prepare(void *arg) +{ + test_context *ctx = arg; + + ctx->early = true; + ctx->late = false; +} + +static void action(void *arg) { test_context *ctx = arg; - int busy; Per_CPU_Control *cpu_self; 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 +117,40 @@ 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; + T_interrupt_test_busy_wait_for_interrupt(); } -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 +158,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 +195,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 *** -- cgit v1.2.3