Hello,

I changed the test runner API a bit. Now it is also possible to test the system initialization for example. The test output of the attached example test (derived from sptests/spsysinit01):

A:sysinit
S:Platform:RTEMS
S:Compiler:7.3.0 20180125 (RTEMS 5, RSB 30da0c720b78eba16a3f5272206c07415368617b, Newlib 2ab57ad59bc35dafffa69cd4da5e228971de069f)
S:Version:5.0.0.9c792752178ce9bfaffec0ae3d2f150d8f01821f
S:BSP:erc32
S:RTEMS_DEBUG:1
S:RTEMS_MULTIPROCESSING:0
S:RTEMS_POSIX_API:0
S:RTEMS_PROFILING:0
S:RTEMS_SMP:1
B:sysinit
P:0:0:?:test-sysinit.c:243
P:1:0:?:test-sysinit.c:252
P:2:0:?:test-sysinit.c:257
P:3:0:?:test-sysinit.c:262
P:4:0:?:test-sysinit.c:263
P:5:0:?:test-sysinit.c:268
P:6:0:?:test-sysinit.c:269
P:7:0:?:test-sysinit.c:274
P:8:0:?:test-sysinit.c:275
P:9:0:?:test-sysinit.c:280
P:10:0:?:test-sysinit.c:281
P:11:0:?:test-sysinit.c:286
P:12:0:?:test-sysinit.c:287
P:13:0:?:test-sysinit.c:292
P:14:0:?:test-sysinit.c:293
P:15:0:?:test-sysinit.c:298
P:16:0:?:test-sysinit.c:299
P:17:0:?:test-sysinit.c:304
P:18:0:?:test-sysinit.c:305
P:19:0:?:test-sysinit.c:310
P:20:0:?:test-sysinit.c:311
P:21:0:?:test-sysinit.c:316
P:22:0:?:test-sysinit.c:317
P:23:0:?:test-sysinit.c:323
P:24:0:?:test-sysinit.c:328
P:25:0:?:test-sysinit.c:334
P:26:0:?:test-sysinit.c:339
P:27:0:?:test-sysinit.c:344
P:28:0:?:test-sysinit.c:345
P:29:0:?:test-sysinit.c:350
P:30:0:?:test-sysinit.c:351
P:31:0:?:test-sysinit.c:356
P:32:0:?:test-sysinit.c:357
P:33:0:?:test-sysinit.c:362
P:34:0:?:test-sysinit.c:363
P:35:0:?:test-sysinit.c:368
P:36:0:?:test-sysinit.c:369
P:37:0:?:test-sysinit.c:374
P:38:0:?:test-sysinit.c:375
P:39:0:?:test-sysinit.c:380
P:40:0:?:test-sysinit.c:381
P:41:0:?:test-sysinit.c:386
P:42:0:?:test-sysinit.c:387
P:43:0:?:test-sysinit.c:392
P:44:0:?:test-sysinit.c:393
P:45:0:?:test-sysinit.c:398
P:46:0:?:test-sysinit.c:399
P:47:0:?:test-sysinit.c:404
P:48:0:?:test-sysinit.c:405
P:49:0:?:test-sysinit.c:410
P:50:0:?:test-sysinit.c:411
P:51:0:?:test-sysinit.c:416
P:52:0:?:test-sysinit.c:417
P:53:0:?:test-sysinit.c:422
P:54:0:?:test-sysinit.c:423
P:55:0:?:test-sysinit.c:450
P:56:0:?:test-sysinit.c:451
P:57:0:?:test-sysinit.c:456
P:58:0:?:test-sysinit.c:457
P:59:0:?:test-sysinit.c:462
P:60:0:?:test-sysinit.c:463
P:61:0:?:test-sysinit.c:468
P:62:0:?:test-sysinit.c:469
P:63:0:?:test-sysinit.c:474
P:64:0:?:test-sysinit.c:475
P:65:0:?:test-sysinit.c:480
P:66:0:?:test-sysinit.c:481
P:67:0:?:test-sysinit.c:500
P:68:0:?:test-sysinit.c:501
P:69:0:?:test-sysinit.c:506
P:70:0:?:test-sysinit.c:507
P:71:0:?:test-sysinit.c:530
P:72:0:?:test-sysinit.c:531
P:73:0:?:test-sysinit.c:536
P:74:0:?:test-sysinit.c:537
P:75:0:?:test-sysinit.c:516
P:76:0:?:test-sysinit.c:524
P:77:0:?:test-sysinit.c:525
P:78:0:?:test-sysinit.c:542
P:79:0:?:test-sysinit.c:543
P:80:0:IDLE:test-sysinit.c:548
P:81:0:IDLE:test-sysinit.c:549
P:82:0:IDLE:test-sysinit.c:554
P:83:0:IDLE:test-sysinit.c:555
P:84:0:IDLE:test-sysinit.c:560
P:85:0:IDLE:test-sysinit.c:561
P:86:0:IDLE:test-sysinit.c:571
P:87:0:IDLE:test-sysinit.c:572
P:88:0:IDLE:test-sysinit.c:581
P:89:0:IDLE:test-sysinit.c:582
P:90:0:IDLE:test-sysinit.c:591
P:91:0:IDLE:test-sysinit.c:596
P:92:0:IDLE:test-sysinit.c:601
P:93:0:IDLE:test-sysinit.c:602
P:94:0:IDLE:test-sysinit.c:607
P:95:0:IDLE:test-sysinit.c:608
P:96:0:IDLE:test-sysinit.c:614
P:97:0:IDLE:test-sysinit.c:616
P:98:0:IDLE:test-sysinit.c:622
P:99:0:IDLE:test-sysinit.c:624
P:100:0:IDLE:test-sysinit.c:630
P:101:0:IDLE:test-sysinit.c:632
P:102:0:IDLE:test-sysinit.c:638
P:103:0:IDLE:test-sysinit.c:640
P:104:0:IDLE:test-sysinit.c:650
P:105:0:IDLE:test-sysinit.c:651
P:106:0:IDLE:test-sysinit.c:660
P:107:0:IDLE:test-sysinit.c:661
P:108:0:IDLE:test-sysinit.c:664
P:109:0:IDLE:test-sysinit.c:665
P:110:0:IDLE:test-sysinit.c:666
P:111:0:IDLE:test-sysinit.c:667
P:112:0:IDLE:test-sysinit.c:668
P:113:0:IDLE:test-sysinit.c:669
P:114:0:IDLE:test-sysinit.c:670
P:115:0:IDLE:test-sysinit.c:671
P:116:0:IDLE:test-sysinit.c:672
P:117:0:IDLE:test-sysinit.c:673
P:118:0:IDLE:test-sysinit.c:674
P:119:0:IDLE:test-sysinit.c:675
P:120:0:UI1:test-sysinit.c:682
Y:sysinit:N:121:F:0
Z:sysinit:C:1:N:121:F:0

*** FATAL ***
fatal source: 5 (RTEMS_FATAL_SOURCE_EXIT)
fatal code: 0 (0x00000000)
RTEMS version: 5.0.0.9c792752178ce9bfaffec0ae3d2f150d8f01821f
RTEMS tools: 7.3.0 20180125 (RTEMS 5, RSB 30da0c720b78eba16a3f5272206c07415368617b, Newlib 2ab57ad59bc35dafffa69cd4da5e228971de069f)
executing thread ID: 0x08a010001
executing thread name: UI1

--
Sebastian Huber, embedded brains GmbH

Address : Dornierstr. 4, D-82178 Puchheim, Germany
Phone   : +49 89 189 47 41-16
Fax     : +49 89 189 47 41-09
E-Mail  : sebastian.hu...@embedded-brains.de
PGP     : Public key available on request.

Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.

/*
 * SPDX-License-Identifier: BSD-2-Clause
 *
 * Copyright (C) 2015, 2018 embedded brains GmbH
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#undef __STRICT_ANSI__

#include <sys/types.h>
#include <sys/stat.h>

#include <pthread.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>

#include <rtems.h>
#include <rtems/ioimpl.h>
#include <rtems/libio_.h>
#include <rtems/sysinit.h>

#include <rtems/extensionimpl.h>
#include <rtems/posix/barrierimpl.h>
#include <rtems/posix/mqueueimpl.h>
#include <rtems/posix/muteximpl.h>
#ifdef RTEMS_POSIX_API
#include <rtems/posix/psignalimpl.h>
#endif /* RTEMS_POSIX_API */
#include <rtems/posix/pthreadimpl.h>
#include <rtems/posix/rwlockimpl.h>
#include <rtems/posix/semaphoreimpl.h>
#include <rtems/posix/shmimpl.h>
#ifdef RTEMS_POSIX_API
#include <rtems/posix/timerimpl.h>
#endif /* RTEMS_POSIX_API */
#include <rtems/posix/keyimpl.h>
#include <rtems/rtems/barrierimpl.h>
#include <rtems/rtems/dpmemimpl.h>
#include <rtems/rtems/messageimpl.h>
#include <rtems/rtems/partimpl.h>
#include <rtems/rtems/ratemonimpl.h>
#include <rtems/rtems/regionimpl.h>
#include <rtems/rtems/semimpl.h>
#include <rtems/rtems/tasksimpl.h>
#include <rtems/rtems/timerimpl.h>
#include <rtems/score/apimutex.h>
#include <rtems/score/chainimpl.h>
#include <rtems/score/sysstate.h>
#include <rtems/score/userextimpl.h>
#include <rtems/score/wkspace.h>

#include <t.h>

static const T_configuration config = {
	.name = "sysinit",
	.verbosity = T_VERBOSE
};

#define assert_object_max_eq_0(info) \
  T_eq_uint(_Objects_Get_maximum_index(info), 0)

#define assert_object_max_ne_0(info) \
  T_ne_uint(_Objects_Get_maximum_index(info), 0)

typedef enum {
  BSP_WORK_AREAS_PRE,
  BSP_WORK_AREAS_POST,
  BSP_START_PRE,
  BSP_START_POST,
  CPU_COUNTER_PRE,
  CPU_COUNTER_POST,
  INITIAL_EXTENSIONS_PRE,
  INITIAL_EXTENSIONS_POST,
  DATA_STRUCTURES_PRE,
  DATA_STRUCTURES_POST,
  USER_EXTENSIONS_PRE,
  USER_EXTENSIONS_POST,
  CLASSIC_TASKS_PRE,
  CLASSIC_TASKS_POST,
  CLASSIC_TIMER_PRE,
  CLASSIC_TIMER_POST,
  CLASSIC_SIGNAL_PRE,
  CLASSIC_SIGNAL_POST,
  CLASSIC_EVENT_PRE,
  CLASSIC_EVENT_POST,
  CLASSIC_MESSAGE_QUEUE_PRE,
  CLASSIC_MESSAGE_QUEUE_POST,
  CLASSIC_SEMAPHORE_PRE,
  CLASSIC_SEMAPHORE_POST,
  CLASSIC_PARTITION_PRE,
  CLASSIC_PARTITION_POST,
  CLASSIC_REGION_PRE,
  CLASSIC_REGION_POST,
  CLASSIC_DUAL_PORTED_MEMORY_PRE,
  CLASSIC_DUAL_PORTED_MEMORY_POST,
  CLASSIC_RATE_MONOTONIC_PRE,
  CLASSIC_RATE_MONOTONIC_POST,
  CLASSIC_BARRIER_PRE,
  CLASSIC_BARRIER_POST,
#ifdef RTEMS_POSIX_API
  POSIX_SIGNALS_PRE,
  POSIX_SIGNALS_POST,
#endif /* RTEMS_POSIX_API */
  POSIX_THREADS_PRE,
  POSIX_THREADS_POST,
  POSIX_MESSAGE_QUEUE_PRE,
  POSIX_MESSAGE_QUEUE_POST,
  POSIX_SEMAPHORE_PRE,
  POSIX_SEMAPHORE_POST,
#ifdef RTEMS_POSIX_API
  POSIX_TIMER_PRE,
  POSIX_TIMER_POST,
#endif /* RTEMS_POSIX_API */
  POSIX_SHM_PRE,
  POSIX_SHM_POST,
  POSIX_KEYS_PRE,
  POSIX_KEYS_POST,
  POSIX_CLEANUP_PRE,
  POSIX_CLEANUP_POST,
  IDLE_THREADS_PRE,
  IDLE_THREADS_POST,
  LIBIO_PRE,
  LIBIO_POST,
  ROOT_FILESYSTEM_PRE,
  ROOT_FILESYSTEM_POST,
  BSP_PRE_DRIVERS_PRE,
  BSP_PRE_DRIVERS_POST,
  DEVICE_DRIVERS_PRE,
  DEVICE_DRIVERS_POST,
  CLASSIC_USER_TASKS_PRE,
  CLASSIC_USER_TASKS_POST,
  POSIX_USER_THREADS_PRE,
  POSIX_USER_THREADS_POST,
  STD_FILE_DESCRIPTORS_PRE,
  STD_FILE_DESCRIPTORS_POST,
  LAST_FIRST,
  LAST_SECOND,
  LAST_THIRD,
  LAST_FOURTH,
  LAST_FIFTH,
  LAST_SIXTH,
  LAST_SEVENTH,
  LAST_EIGHTH,
  LAST_NINETH,
  LAST_TENTH,
  LAST_MIDDLE,
  LAST_LAST,
  INIT_TASK,
  DONE
} init_step;

#define FIRST(x) \
  static void x##_first(void); \
  RTEMS_SYSINIT_ITEM( \
    x##_first, \
    x, \
    RTEMS_SYSINIT_ORDER_FIRST \
  ); \
  static void x##_first(void)

#define LAST(x) \
  static void x##_last(void); \
  RTEMS_SYSINIT_ITEM( \
    x##_last, \
    x, \
    RTEMS_SYSINIT_ORDER_LAST \
  ); \
  static void x##_last(void)

#define LAST_STEP(x) \
  static void last_##x(void) \
  { \
    T_eq_int(step(), LAST_##x); \
  } \
  RTEMS_SYSINIT_ITEM( \
    last_##x, \
    RTEMS_SYSINIT_LAST, \
    RTEMS_SYSINIT_ORDER_##x \
  )

static init_step step_counter;

static init_step step(void)
{
  init_step current;

  current = step_counter;
  step_counter = current + 1;
  return current;
}

FIRST(RTEMS_SYSINIT_BSP_WORK_AREAS)
{
  T_eq_ulong(_Workspace_Area.area_begin, 0);
  T_eq_int(step(), BSP_WORK_AREAS_PRE);
}

LAST(RTEMS_SYSINIT_BSP_WORK_AREAS)
{
  T_ne_ulong(_Workspace_Area.area_begin, 0);
  T_eq_int(step(), BSP_WORK_AREAS_POST);
}

FIRST(RTEMS_SYSINIT_BSP_START)
{
  /*
   * Since the work performed here is BSP-specific, there is no way to test pre
   * and post conditions.
   */
  T_eq_int(step(), BSP_START_PRE);
}

LAST(RTEMS_SYSINIT_BSP_START)
{
  /*
   * Some BSPs initialize the printk() support in bsp_start().  So, print begin
   * of test after bsp_start().
   */
  T_run_initialize(&config);
  T_test_case_begin("sysinit", NULL);

  T_eq_int(step(), BSP_START_POST);
}

FIRST(RTEMS_SYSINIT_CPU_COUNTER)
{
  /*
   * Since the work performed here is BSP-specific, there is no way to test pre
   * and post conditions.
   */
  T_eq_int(step(), CPU_COUNTER_PRE);
}

LAST(RTEMS_SYSINIT_CPU_COUNTER)
{
  T_eq_int(step(), CPU_COUNTER_POST);
}

FIRST(RTEMS_SYSINIT_INITIAL_EXTENSIONS)
{
  T_true(_Chain_Is_empty(&_User_extensions_Switches_list), "ext");
  T_eq_int(step(), INITIAL_EXTENSIONS_PRE);
}

LAST(RTEMS_SYSINIT_INITIAL_EXTENSIONS)
{
  T_false(_Chain_Is_empty(&_User_extensions_Switches_list), "ext");
  T_eq_int(step(), INITIAL_EXTENSIONS_POST);
}

FIRST(RTEMS_SYSINIT_DATA_STRUCTURES)
{
  assert_object_max_eq_0(&_Thread_Internal_information.Objects)
  T_eq_int(step(), DATA_STRUCTURES_PRE);
}

LAST(RTEMS_SYSINIT_DATA_STRUCTURES)
{
  assert_object_max_ne_0(&_Thread_Internal_information.Objects)
  T_eq_int(step(), DATA_STRUCTURES_POST);
}

FIRST(RTEMS_SYSINIT_USER_EXTENSIONS)
{
  assert_object_max_eq_0(&_Extension_Information)
  T_eq_int(step(), USER_EXTENSIONS_PRE);
}

LAST(RTEMS_SYSINIT_USER_EXTENSIONS)
{
  assert_object_max_ne_0(&_Extension_Information)
  T_eq_int(step(), USER_EXTENSIONS_POST);
}

FIRST(RTEMS_SYSINIT_CLASSIC_TASKS)
{
  assert_object_max_eq_0(&_RTEMS_tasks_Information.Objects)
  T_eq_int(step(), CLASSIC_TASKS_PRE);
}

LAST(RTEMS_SYSINIT_CLASSIC_TASKS)
{
  assert_object_max_ne_0(&_RTEMS_tasks_Information.Objects)
  T_eq_int(step(), CLASSIC_TASKS_POST);
}

FIRST(RTEMS_SYSINIT_CLASSIC_TIMER)
{
  assert_object_max_eq_0(&_Timer_Information)
  T_eq_int(step(), CLASSIC_TIMER_PRE);
}

LAST(RTEMS_SYSINIT_CLASSIC_TIMER)
{
  assert_object_max_ne_0(&_Timer_Information)
  T_eq_int(step(), CLASSIC_TIMER_POST);
}

FIRST(RTEMS_SYSINIT_CLASSIC_SIGNAL)
{
  /* There is nothing to do in case RTEMS_MULTIPROCESSING is not defined */
  T_eq_int(step(), CLASSIC_SIGNAL_PRE);
}

LAST(RTEMS_SYSINIT_CLASSIC_SIGNAL)
{
  T_eq_int(step(), CLASSIC_SIGNAL_POST);
}

FIRST(RTEMS_SYSINIT_CLASSIC_EVENT)
{
  /* There is nothing to do in case RTEMS_MULTIPROCESSING is not defined */
  T_eq_int(step(), CLASSIC_EVENT_PRE);
}

LAST(RTEMS_SYSINIT_CLASSIC_EVENT)
{
  T_eq_int(step(), CLASSIC_EVENT_POST);
}

FIRST(RTEMS_SYSINIT_CLASSIC_MESSAGE_QUEUE)
{
  assert_object_max_eq_0(&_Message_queue_Information)
  T_eq_int(step(), CLASSIC_MESSAGE_QUEUE_PRE);
}

LAST(RTEMS_SYSINIT_CLASSIC_MESSAGE_QUEUE)
{
  assert_object_max_ne_0(&_Message_queue_Information)
  T_eq_int(step(), CLASSIC_MESSAGE_QUEUE_POST);
}

FIRST(RTEMS_SYSINIT_CLASSIC_SEMAPHORE)
{
  assert_object_max_eq_0(&_Semaphore_Information)
  T_eq_int(step(), CLASSIC_SEMAPHORE_PRE);
}

LAST(RTEMS_SYSINIT_CLASSIC_SEMAPHORE)
{
  assert_object_max_ne_0(&_Semaphore_Information)
  T_eq_int(step(), CLASSIC_SEMAPHORE_POST);
}

FIRST(RTEMS_SYSINIT_CLASSIC_PARTITION)
{
  assert_object_max_eq_0(&_Partition_Information)
  T_eq_int(step(), CLASSIC_PARTITION_PRE);
}

LAST(RTEMS_SYSINIT_CLASSIC_PARTITION)
{
  assert_object_max_ne_0(&_Partition_Information)
  T_eq_int(step(), CLASSIC_PARTITION_POST);
}

FIRST(RTEMS_SYSINIT_CLASSIC_REGION)
{
  assert_object_max_eq_0(&_Region_Information)
  T_eq_int(step(), CLASSIC_REGION_PRE);
}

LAST(RTEMS_SYSINIT_CLASSIC_REGION)
{
  assert_object_max_ne_0(&_Region_Information)
  T_eq_int(step(), CLASSIC_REGION_POST);
}

FIRST(RTEMS_SYSINIT_CLASSIC_DUAL_PORTED_MEMORY)
{
  assert_object_max_eq_0(&_Dual_ported_memory_Information)
  T_eq_int(step(), CLASSIC_DUAL_PORTED_MEMORY_PRE);
}

LAST(RTEMS_SYSINIT_CLASSIC_DUAL_PORTED_MEMORY)
{
  assert_object_max_ne_0(&_Dual_ported_memory_Information)
  T_eq_int(step(), CLASSIC_DUAL_PORTED_MEMORY_POST);
}

FIRST(RTEMS_SYSINIT_CLASSIC_RATE_MONOTONIC)
{
  assert_object_max_eq_0(&_Rate_monotonic_Information)
  T_eq_int(step(), CLASSIC_RATE_MONOTONIC_PRE);
}

LAST(RTEMS_SYSINIT_CLASSIC_RATE_MONOTONIC)
{
  assert_object_max_ne_0(&_Rate_monotonic_Information)
  T_eq_int(step(), CLASSIC_RATE_MONOTONIC_POST);
}

FIRST(RTEMS_SYSINIT_CLASSIC_BARRIER)
{
  assert_object_max_eq_0(&_Barrier_Information)
  T_eq_int(step(), CLASSIC_BARRIER_PRE);
}

LAST(RTEMS_SYSINIT_CLASSIC_BARRIER)
{
  assert_object_max_ne_0(&_Barrier_Information)
  T_eq_int(step(), CLASSIC_BARRIER_POST);
}

#ifdef RTEMS_POSIX_API
FIRST(RTEMS_SYSINIT_POSIX_SIGNALS)
{
  T_ne_mem(
    &_POSIX_signals_Vectors,
    _POSIX_signals_Default_vectors,
    sizeof(_POSIX_signals_Vectors)
  );
  T_eq_int(step(), POSIX_SIGNALS_PRE);
}

LAST(RTEMS_SYSINIT_POSIX_SIGNALS)
{
  T_eq_mem(
    &_POSIX_signals_Vectors,
    _POSIX_signals_Default_vectors,
    sizeof(_POSIX_signals_Vectors)
  );
  T_eq_int(step(), POSIX_SIGNALS_POST);
}
#endif /* RTEMS_POSIX_API */

FIRST(RTEMS_SYSINIT_POSIX_THREADS)
{
  assert_object_max_eq_0(&_POSIX_Threads_Information.Objects)
  T_eq_int(step(), POSIX_THREADS_PRE);
}

LAST(RTEMS_SYSINIT_POSIX_THREADS)
{
  assert_object_max_ne_0(&_POSIX_Threads_Information.Objects)
  T_eq_int(step(), POSIX_THREADS_POST);
}

FIRST(RTEMS_SYSINIT_POSIX_MESSAGE_QUEUE)
{
  assert_object_max_eq_0(&_POSIX_Message_queue_Information)
  T_eq_int(step(), POSIX_MESSAGE_QUEUE_PRE);
}

LAST(RTEMS_SYSINIT_POSIX_MESSAGE_QUEUE)
{
  assert_object_max_ne_0(&_POSIX_Message_queue_Information)
  T_eq_int(step(), POSIX_MESSAGE_QUEUE_POST);
}

FIRST(RTEMS_SYSINIT_POSIX_SEMAPHORE)
{
  assert_object_max_eq_0(&_POSIX_Semaphore_Information)
  T_eq_int(step(), POSIX_SEMAPHORE_PRE);
}

LAST(RTEMS_SYSINIT_POSIX_SEMAPHORE)
{
  assert_object_max_ne_0(&_POSIX_Semaphore_Information)
  T_eq_int(step(), POSIX_SEMAPHORE_POST);
}

#ifdef RTEMS_POSIX_API
FIRST(RTEMS_SYSINIT_POSIX_TIMER)
{
  assert_object_max_eq_0(&_POSIX_Timer_Information)
  T_eq_int(step(), POSIX_TIMER_PRE);
}

LAST(RTEMS_SYSINIT_POSIX_TIMER)
{
  assert_object_max_ne_0(&_POSIX_Timer_Information)
  T_eq_int(step(), POSIX_TIMER_POST);
}
#endif /* RTEMS_POSIX_API */

FIRST(RTEMS_SYSINIT_POSIX_SHM)
{
  assert_object_max_eq_0(&_POSIX_Shm_Information)
  T_eq_int(step(), POSIX_SHM_PRE);
}

LAST(RTEMS_SYSINIT_POSIX_SHM)
{
  assert_object_max_ne_0(&_POSIX_Shm_Information)
  T_eq_int(step(), POSIX_SHM_POST);
}

static size_t user_extensions_pre_posix_cleanup;

FIRST(RTEMS_SYSINIT_POSIX_CLEANUP)
{
  user_extensions_pre_posix_cleanup =
    _Chain_Node_count_unprotected(&_User_extensions_List.Active);
  T_eq_int(step(), POSIX_CLEANUP_PRE);
}

LAST(RTEMS_SYSINIT_POSIX_CLEANUP)
{
  T_eq_ulong(
    user_extensions_pre_posix_cleanup + 1,
    _Chain_Node_count_unprotected(&_User_extensions_List.Active)
  );
  T_eq_int(step(), POSIX_CLEANUP_POST);
}

FIRST(RTEMS_SYSINIT_POSIX_KEYS)
{
  assert_object_max_eq_0(&_POSIX_Keys_Information)
  T_eq_int(step(), POSIX_KEYS_PRE);
}

LAST(RTEMS_SYSINIT_POSIX_KEYS)
{
  assert_object_max_ne_0(&_POSIX_Keys_Information)
  T_eq_int(step(), POSIX_KEYS_POST);
}

FIRST(RTEMS_SYSINIT_IDLE_THREADS)
{
  T_true(_System_state_Is_before_initialization(_System_state_Get()), "idle");
  T_eq_int(step(), IDLE_THREADS_PRE);
}

LAST(RTEMS_SYSINIT_IDLE_THREADS)
{
  T_true(_System_state_Is_before_multitasking(_System_state_Get()), "idle");
  T_eq_int(step(), IDLE_THREADS_POST);
}

FIRST(RTEMS_SYSINIT_LIBIO)
{
  T_null(rtems_libio_iop_free_head);
  T_eq_int(step(), LIBIO_PRE);
}

LAST(RTEMS_SYSINIT_LIBIO)
{
  T_eq_ptr(rtems_libio_iop_free_head, &rtems_libio_iops[0]);
  T_eq_int(step(), LIBIO_POST);
}

FIRST(RTEMS_SYSINIT_ROOT_FILESYSTEM)
{
  struct stat st;
  int rv;

  errno = 0;
  rv = stat("/", &st);
  T_psx_error(rv, ENXIO);
  T_eq_int(step(), ROOT_FILESYSTEM_PRE);
}

LAST(RTEMS_SYSINIT_ROOT_FILESYSTEM)
{
  struct stat st;
  int rv;

  rv = stat("/", &st);
  T_psx_success(rv);
  T_eq_int(step(), ROOT_FILESYSTEM_POST);
}

FIRST(RTEMS_SYSINIT_BSP_PRE_DRIVERS)
{
  /*
   * Since the work performed here is BSP-specific, there is no way to test pre
   * and post conditions.
   */
  T_eq_int(step(), BSP_PRE_DRIVERS_PRE);
}

LAST(RTEMS_SYSINIT_BSP_PRE_DRIVERS)
{
  T_eq_int(step(), BSP_PRE_DRIVERS_POST);
}

FIRST(RTEMS_SYSINIT_DEVICE_DRIVERS)
{
  T_false(_IO_All_drivers_initialized, "drivers");
  T_eq_int(step(), DEVICE_DRIVERS_PRE);
}

LAST(RTEMS_SYSINIT_DEVICE_DRIVERS)
{
  T_true(_IO_All_drivers_initialized, "drivers");
  T_eq_int(step(), DEVICE_DRIVERS_POST);
}

FIRST(RTEMS_SYSINIT_CLASSIC_USER_TASKS)
{
  _Objects_Allocator_lock();
  T_eq_uint(_Objects_Active_count(&_RTEMS_tasks_Information.Objects), 0);
  _Objects_Allocator_unlock();
  T_eq_int(step(), CLASSIC_USER_TASKS_PRE);
}

LAST(RTEMS_SYSINIT_CLASSIC_USER_TASKS)
{
  _Objects_Allocator_lock();
  T_eq_uint(_Objects_Active_count(&_RTEMS_tasks_Information.Objects), 1);
  _Objects_Allocator_unlock();
  T_eq_int(step(), CLASSIC_USER_TASKS_POST);
}

FIRST(RTEMS_SYSINIT_POSIX_USER_THREADS)
{
  _Objects_Allocator_lock();
  T_eq_uint(_Objects_Active_count(&_POSIX_Threads_Information.Objects), 0);
  _Objects_Allocator_unlock();
  T_eq_int(step(), POSIX_USER_THREADS_PRE);
}

LAST(RTEMS_SYSINIT_POSIX_USER_THREADS)
{
  _Objects_Allocator_lock();
  T_eq_uint(_Objects_Active_count(&_POSIX_Threads_Information.Objects), 1);
  _Objects_Allocator_unlock();
  T_eq_int(step(), POSIX_USER_THREADS_POST);
}

FIRST(RTEMS_SYSINIT_STD_FILE_DESCRIPTORS)
{
  struct stat st;
  int rv;

  errno = 0;
  rv = fstat(0, &st);
  T_psx_error(rv, EBADF);
  T_eq_int(step(), STD_FILE_DESCRIPTORS_PRE);
}

LAST(RTEMS_SYSINIT_STD_FILE_DESCRIPTORS)
{
  struct stat st;
  int rv;

  rv = fstat(0, &st);
  T_psx_success(rv);
  T_eq_int(step(), STD_FILE_DESCRIPTORS_POST);
}

LAST_STEP(FIRST);
LAST_STEP(SECOND);
LAST_STEP(THIRD);
LAST_STEP(FOURTH);
LAST_STEP(FIFTH);
LAST_STEP(SIXTH);
LAST_STEP(SEVENTH);
LAST_STEP(EIGHTH);
LAST_STEP(NINETH);
LAST_STEP(TENTH);
LAST_STEP(MIDDLE);
LAST_STEP(LAST);

static void Init(rtems_task_argument arg)
{
  (void) arg;
  pthread_cleanup_push(NULL, NULL);
  pthread_cleanup_pop(0);
  T_eq_int(step(), INIT_TASK);
  T_test_case_end();
  T_run_finalize();
  exit(0);
}

static void *POSIX_Init(void *arg)
{
  (void) arg;
  return NULL;
}

#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER
#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER

#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1

#define CONFIGURE_MAXIMUM_BARRIERS 1

#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1

#define CONFIGURE_MAXIMUM_PARTITIONS 1

#define CONFIGURE_MAXIMUM_PERIODS 1

#define CONFIGURE_MAXIMUM_PORTS 1

#define CONFIGURE_MAXIMUM_REGIONS 1

#define CONFIGURE_MAXIMUM_SEMAPHORES 1

#define CONFIGURE_MAXIMUM_TASKS 1

#define CONFIGURE_MAXIMUM_TIMERS 1

#define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES 1

#define CONFIGURE_MAXIMUM_POSIX_SEMAPHORES 1

#define CONFIGURE_MAXIMUM_POSIX_SHMS 1

#ifdef RTEMS_POSIX_API
#define CONFIGURE_MAXIMUM_POSIX_TIMERS 1
#endif /* RTEMS_POSIX_API */

#define CONFIGURE_MAXIMUM_POSIX_THREADS 1

#define CONFIGURE_POSIX_INIT_THREAD_TABLE

#define CONFIGURE_MAXIMUM_POSIX_KEYS 1

#define CONFIGURE_RTEMS_INIT_TASKS_TABLE

#define CONFIGURE_STACK_CHECKER_ENABLED

#define CONFIGURE_INIT

#include <rtems/confdefs.h>
_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to