RTEMS
test-info.h
1 /*
2  * Copyright (c) 2014, 2018 embedded brains GmbH. All rights reserved.
3  *
4  * embedded brains GmbH
5  * Dornierstr. 4
6  * 82178 Puchheim
7  * Germany
8  * <rtems@embedded-brains.de>
9  *
10  * The license and distribution terms for this file may be
11  * found in the file LICENSE in this distribution or at
12  * http://www.rtems.org/license/LICENSE.
13  */
14 
15 #ifndef _RTEMS_TEST_H
16 #define _RTEMS_TEST_H
17 
18 #include <rtems.h>
19 #include <rtems/printer.h>
20 #include <rtems/score/atomic.h>
21 #include <rtems/score/smpbarrier.h>
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif /* __cplusplus */
26 
40 extern const char rtems_test_name[];
41 
46 
51  rtems_fatal_source source,
52  bool always_set_to_false,
53  rtems_fatal_code code
54 );
55 
59 #define RTEMS_TEST_INITIAL_EXTENSION \
60  { NULL, NULL, NULL, NULL, NULL, NULL, NULL, rtems_test_fatal_extension }
61 
65 typedef enum
66 {
67  RTEMS_TEST_STATE_PASS,
68  RTEMS_TEST_STATE_FAIL,
69  RTEMS_TEST_STATE_USER_INPUT,
70  RTEMS_TEST_STATE_INDETERMINATE,
71  RTEMS_TEST_STATE_BENCHMARK
73 
74 #if (TEST_STATE_EXPECTED_FAIL && TEST_STATE_USER_INPUT) || \
75  (TEST_STATE_EXPECTED_FAIL && TEST_STATE_INDETERMINATE) || \
76  (TEST_STATE_EXPECTED_FAIL && TEST_STATE_BENCHMARK) || \
77  (TEST_STATE_USER_INPUT && TEST_STATE_INDETERMINATE) || \
78  (TEST_STATE_USER_INPUT && TEST_STATE_BENCHMARK) || \
79  (TEST_STATE_INDETERMINATE && TEST_STATE_BENCHMARK)
80  #error Test states must be unique
81 #endif
82 
83 #if TEST_STATE_EXPECTED_FAIL
84  #define TEST_STATE RTEMS_TEST_STATE_FAIL
85 #elif TEST_STATE_USER_INPUT
86  #define TEST_STATE RTEMS_TEST_STATE_USER_INPUT
87 #elif TEST_STATE_INDETERMINATE
88  #define TEST_STATE RTEMS_TEST_STATE_INDETERMINATE
89 #elif TEST_STATE_BENCHMARK
90  #define TEST_STATE RTEMS_TEST_STATE_BENCHMARK
91 #else
92  #define TEST_STATE RTEMS_TEST_STATE_PASS
93 #endif
94 
100 int rtems_test_begin(const char* name, const RTEMS_TEST_STATE state);
101 
107 int rtems_test_end(const char* name);
108 
113 void rtems_test_exit(int status) RTEMS_NO_RETURN;
114 
120 int rtems_test_printf(const char* format, ...) RTEMS_PRINTFLIKE(1, 2);
121 
122 #define RTEMS_TEST_PARALLEL_PROCESSOR_MAX 32
123 
125 
129 typedef struct {
130  Atomic_Ulong stop;
131  SMP_barrier_Control barrier;
132  size_t worker_count;
133  rtems_id worker_ids[RTEMS_TEST_PARALLEL_PROCESSOR_MAX];
134  rtems_id stop_worker_timer_id;
135  const struct rtems_test_parallel_job *jobs;
136  size_t job_count;
138 
151  size_t worker_index,
152  rtems_id worker_id
153 );
154 
175  void *arg,
176  size_t active_workers
177  );
178 
189  void (*body)(
191  void *arg,
192  size_t active_workers,
193  size_t worker_index
194  );
195 
207  void (*fini)(
209  void *arg,
210  size_t active_workers
211  );
212 
216  void *arg;
217 
225  bool cascade;
226 };
227 
236 static inline bool rtems_test_parallel_stop_job(
237  const rtems_test_parallel_context *ctx
238 )
239 {
240  return _Atomic_Load_ulong(&ctx->stop, ATOMIC_ORDER_RELAXED) != 0;
241 }
242 
253 static inline bool rtems_test_parallel_is_master_worker(size_t worker_index)
254 {
255  return worker_index == 0;
256 }
257 
267  const rtems_test_parallel_context *ctx,
268  size_t worker_index
269 )
270 {
271  return ctx->worker_ids[worker_index];
272 }
273 
290  const rtems_test_parallel_job *jobs,
291  size_t job_count
292 );
293 
305 void rtems_test_busy_cpu_usage(time_t seconds, long nanoseconds);
306 
318  const RTEMS_TEST_STATE state
319 );
320 
323 #ifdef __cplusplus
324 }
325 #endif /* __cplusplus */
326 
327 #endif /* _RTEMS_TEST_H */
static bool rtems_test_parallel_is_master_worker(size_t worker_index)
Indicates if a worker is the master worker.
Definition: test-info.h:253
rtems_interval(* init)(rtems_test_parallel_context *ctx, void *arg, size_t active_workers)
Job initialization handler.
Definition: test-info.h:173
const char rtems_test_name[]
Each test must define a test name string.
SMP barrier control.
Definition: smpbarrier.h:51
SMP Barrier API.
void(* rtems_test_parallel_worker_setup)(rtems_test_parallel_context *ctx, size_t worker_index, rtems_id worker_id)
Worker task setup handler.
Definition: test-info.h:149
Basic parallel job description.
Definition: test-info.h:158
RTEMS_TEST_STATE
Test states.
Definition: test-info.h:65
int rtems_test_begin(const char *name, const RTEMS_TEST_STATE state)
Prints a begin of test message using printf().
Definition: testbeginend.c:38
int rtems_test_printf(const char *format,...) RTEMS_PRINTFLIKE(1
Prints via the RTEMS printer.
CPU_Uint32ptr rtems_task_argument
This type is used to represent task argument values.
Definition: tasks.h:115
int rtems_test_end(const char *name)
Prints an end of test message using printf().
Definition: testbeginend.c:75
Internal_errors_Source
This type lists the possible sources from which an error can be reported.
Definition: interr.h:47
static bool rtems_test_parallel_stop_job(const rtems_test_parallel_context *ctx)
Indicates if a job body should stop its work loop.
Definition: test-info.h:236
RTEMS_NO_RETURN void rtems_test_run(rtems_task_argument arg, const RTEMS_TEST_STATE state)
Runs the test cases of the RTEMS Test Framework using a default configuration in the context of a tas...
Definition: testrun.c:72
#define RTEMS_NO_RETURN
Tells the compiler in a function declaration that this function does not return.
Definition: basedefs.h:207
void rtems_test_exit(int status) RTEMS_NO_RETURN
Exit the test without calling exit() since it closes stdin, etc and pulls in stdio code...
Definition: testbeginend.c:83
Internal context for parallel job execution.
Definition: test-info.h:129
bool cascade
Job cascading flag.
Definition: test-info.h:225
void(* fini)(rtems_test_parallel_context *ctx, void *arg, size_t active_workers)
Job finalization handler.
Definition: test-info.h:207
Atomic Operations API.
void * arg
Job specific argument.
Definition: test-info.h:216
RTEMS_NO_RETURN RTEMS_PRINTFLIKE(1, 2) void rtems_panic(const char *fmt
%
This header file defines the RTEMS Classic API.
rtems_printer rtems_test_printer
Each test must define a printer.
Definition: testbeginend.c:25
Watchdog_Interval rtems_interval
This type is used to represent clock tick intervals.
Definition: types.h:90
void rtems_test_busy_cpu_usage(time_t seconds, long nanoseconds)
Performs a busy loop for the specified seconds and nanoseconds based on the CPU usage of the executin...
Internal_errors_t rtems_fatal_code
%
Definition: extension.h:132
static rtems_id rtems_test_parallel_get_task_id(const rtems_test_parallel_context *ctx, size_t worker_index)
Returns the task identifier for a worker.
Definition: test-info.h:266
Objects_Id rtems_id
Values of this type identify an RTEMS object.
Definition: types.h:99
void(* body)(rtems_test_parallel_context *ctx, void *arg, size_t active_workers, size_t worker_index)
Job body handler.
Definition: test-info.h:189
void rtems_test_parallel(rtems_test_parallel_context *ctx, rtems_test_parallel_worker_setup worker_setup, const rtems_test_parallel_job *jobs, size_t job_count)
Runs a bunch of jobs in parallel on all processors of the system.
User print interface to the bspIO print plug in.
void rtems_test_fatal_extension(rtems_fatal_source source, bool always_set_to_false, rtems_fatal_code code)
Fatal extension for tests.