source: rtems/testsuites/sptests/sp43/init.c @ 487b470d

4.104.115
Last change on this file since 487b470d was fde1456, checked in by Ralf Corsepius <ralf.corsepius@…>, on 10/26/09 at 11:29:24

Use PRIxrtems_id to print rtems_ids.

  • Property mode set to 100644
File size: 15.0 KB
Line 
1/*
2 *  Exercise Object Manager Services
3 *
4 *  COPYRIGHT (c) 1989-2009.
5 *  On-Line Applications Research Corporation (OAR).
6 *
7 *  The license and distribution terms for this file may be
8 *  found in the file LICENSE in this distribution or at
9 *  http://www.rtems.com/license/LICENSE.
10 *
11 *  $Id$
12 */
13
14#define __RTEMS_VIOLATE_KERNEL_VISIBILITY__
15#define CONFIGURE_INIT
16#include "system.h"
17
18#undef rtems_build_id
19#undef rtems_build_name
20#undef rtems_object_id_api_maximum
21#undef rtems_object_id_api_minimum
22#undef rtems_object_id_get_api
23#undef rtems_object_id_get_class
24#undef rtems_object_id_get_index
25#undef rtems_object_id_get_node
26
27void print_class_info(
28  uint32_t                            api,
29  uint32_t                            class,
30  rtems_object_api_class_information *info
31);
32void change_name(
33  rtems_id    id,
34  const char *newName,
35  bool        printable
36);
37
38rtems_id         main_task;
39rtems_name       main_name;
40
41void print_class_info(
42  uint32_t                            api,
43  uint32_t                            class,
44  rtems_object_api_class_information *info
45)
46{
47  printf(
48    "%s API %s Information\n"
49    "    minimum id  : 0x%08" PRIxrtems_id " maximum id: 0x%08" PRIxrtems_id "\n"
50    "    maximum     :    %7" PRIu32 " available : %" PRIu32 "\n"
51    "    auto_extend : %s\n",
52    rtems_object_get_api_name(api),
53    rtems_object_get_api_class_name(api, class),
54    info->minimum_id,
55    info->maximum_id,
56    info->maximum,
57    info->unallocated,
58    ((info->auto_extend) ? "yes" : "no")
59  );
60}
61
62void change_name(
63  rtems_id    id,
64  const char *newName,
65  bool        printable
66)
67{
68  rtems_status_code    sc;
69  char                 name[ 5 ];
70  char                *ptr;
71  const char          *c;
72
73  printf( "rtems_object_set_name - change name of init task to " );
74  if ( printable )
75    printf( "(%s)\n", newName );
76  else {
77    printf( "(" );
78    for (c=newName ; *c ; ) {
79       if (isprint(*c)) printf( "%c", *c );
80       else             printf( "0x%02x", *c );
81       c++;
82       if ( *c )
83         printf( "-" );
84    }
85    printf( ")\n" );
86  }
87
88  sc = rtems_object_set_name( id, newName );
89  directive_failed( sc, "rtems_object_set_name" );
90
91  sc = rtems_object_get_classic_name( id, &main_name );
92  directive_failed( sc, "rtems_object_get_classic_name" );
93  put_name( main_name, FALSE );
94  puts( " - name returned by rtems_object_get_classic_name" );
95
96  ptr = rtems_object_get_name( id, 5, name );
97  rtems_test_assert(ptr != NULL);
98  printf( "rtems_object_get_name returned (%s) for init task\n", ptr );
99}
100
101rtems_task Init(
102  rtems_task_argument argument
103)
104{
105  rtems_status_code                   sc;
106  rtems_id                            tmpId;
107  rtems_name                          tmpName;
108  char                                name[5];
109  char                               *ptr;
110  const char                          newName[5] = "New1";
111  char                                tmpNameString[5];
112  uint32_t                            part;
113  rtems_object_api_class_information  info;
114
115  puts( "\n\n*** TEST 43 ***" );
116
117  printf( "RTEMS Version: %s\n", rtems_get_version_string() );
118
119  main_task = rtems_task_self();
120
121  puts( "rtems_object_get_classic_name - INVALID_ADDRESS" );
122  sc = rtems_object_get_classic_name( main_task, NULL );
123  fatal_directive_status(
124    sc,
125    RTEMS_INVALID_ADDRESS,
126    "rtems_object_get_classic_name #1"
127  );
128
129  puts( "rtems_object_get_classic_name - INVALID_ID (bad index)" );
130  sc = rtems_object_get_classic_name( main_task + 5, &main_name );
131  fatal_directive_status(
132    sc,
133    RTEMS_INVALID_ID,
134    "rtems_object_get_classic_name #2"
135  );
136
137  puts( "rtems_object_get_classic_name - INVALID_ID (unallocated index)" );
138  sc = rtems_object_get_classic_name( main_task + 1, &main_name );
139  fatal_directive_status(
140    sc,
141    RTEMS_INVALID_ID,
142    "rtems_object_get_classic_name #4"
143  );
144
145  puts( "rtems_object_get_classic_name - INVALID_ID (bad API)" );
146  tmpId = rtems_build_id( 0xff, OBJECTS_RTEMS_TASKS, 1, 1 ),
147  sc = rtems_object_get_classic_name( tmpId, &main_name );
148  fatal_directive_status(
149    sc,
150    RTEMS_INVALID_ID,
151    "rtems_object_get_classic_name #5"
152  );
153
154  sc = rtems_object_get_classic_name( main_task, &main_name );
155  directive_failed( sc, "rtems_object_get_classic_name" );
156  put_name( main_name, FALSE );
157  puts( " - name returned by rtems_object_get_classic_name for Init task id" );
158
159  sc = rtems_object_get_classic_name( RTEMS_SELF, &main_name );
160  directive_failed( sc, "rtems_object_get_classic_name" );
161  put_name( main_name, FALSE );
162  puts( " - name returned by rtems_object_get_classic_name for RTEMS_SELF" );
163
164  tmpName = rtems_build_name( 'T', 'E', 'M', 'P' );
165  put_name( tmpName, FALSE );
166  puts( " - rtems_build_name for TEMP" );
167
168 
169  /*
170   * rtems_object_get_name - cases
171   */
172  puts( "rtems_object_get_name - bad id for class with instances" );
173  ptr = rtems_object_get_name( main_task + 5, 5, name );
174  rtems_test_assert(ptr == NULL);
175
176  puts( "rtems_object_get_name - bad id for class without instances" );
177  ptr = rtems_object_get_name(
178    rtems_build_id( OBJECTS_CLASSIC_API, OBJECTS_RTEMS_BARRIERS, 1, 1 ),
179    5,
180    name
181  );
182  rtems_test_assert(ptr == NULL);
183
184  puts( "rtems_object_get_name - bad length" );
185  ptr = rtems_object_get_name( main_task, 0, name );
186  rtems_test_assert(ptr == NULL);
187
188  puts( "rtems_object_get_name - bad pointer" );
189  ptr = rtems_object_get_name( main_task, 5, NULL );
190  rtems_test_assert(ptr == NULL);
191
192  ptr = rtems_object_get_name( main_task, 5, name );
193  rtems_test_assert(ptr != NULL);
194  printf( "rtems_object_get_name returned (%s) for init task id\n", ptr );
195
196  ptr = rtems_object_get_name( RTEMS_SELF, 5, name );
197  rtems_test_assert(ptr != NULL);
198  printf( "rtems_object_get_name returned (%s) for RTEMS_SELF\n", ptr );
199
200  /*
201   * rtems_object_set_name - errors
202   */
203
204  puts( "rtems_object_set_name - INVALID_ADDRESS" );
205  sc = rtems_object_set_name( tmpId, NULL );
206  fatal_directive_status(
207    sc,
208    RTEMS_INVALID_ADDRESS,
209    "rtems_object_set_name INVALID_ADDRESS"
210  );
211
212  puts( "rtems_object_set_name - INVALID_ID (bad API)" );
213  tmpId = rtems_build_id( 0xff, OBJECTS_RTEMS_TASKS, 1, 1 ),
214  sc = rtems_object_set_name( tmpId, newName );
215  fatal_directive_status(
216    sc,
217    RTEMS_INVALID_ID,
218    "rtems_object_set_name #1"
219  );
220
221  puts( "rtems_object_set_name - INVALID_ID (bad index)" );
222  sc = rtems_object_set_name( main_task + 10, newName );
223  fatal_directive_status(
224    sc,
225    RTEMS_INVALID_ID,
226    "rtems_object_set_name #2"
227  );
228
229  /*
230   * rtems_object_set_name - change name of init task in various ways.
231   *
232   * This is strange but pushes the SuperCore code to do different things.
233   */
234
235  change_name( main_task,  "New1", TRUE );
236  change_name( main_task, "Ne1", TRUE );
237  change_name( main_task, "N1", TRUE );
238  change_name( main_task, "N", TRUE );
239  change_name( main_task, "", TRUE );
240  tmpNameString[0] = 'N';
241  tmpNameString[1] = 0x07;
242  tmpNameString[2] = 0x09;
243  tmpNameString[3] = '1';
244  tmpNameString[4] = '\0';
245  change_name( main_task, tmpNameString, FALSE );
246
247  /*
248   * Change object name using SELF ID
249   */
250
251  change_name( RTEMS_SELF,  "SELF", TRUE );
252
253  ptr = rtems_object_get_name( main_task, 5, name );
254  rtems_test_assert(ptr != NULL);
255  printf( "rtems_object_get_name returned (%s) for init task id\n", ptr );
256
257
258  /*
259   * Exercise id build and extraction routines
260   */
261
262  puts( "rtems_build_id - build an id to match init task" );
263  tmpId = rtems_build_id( OBJECTS_CLASSIC_API, OBJECTS_RTEMS_TASKS, 1, 1 ),
264  assert( tmpId == main_task );
265 
266  puts( "rtems_object_id_get_api - OK" );
267  part = rtems_object_id_get_api( main_task );
268  assert( part == OBJECTS_CLASSIC_API );
269
270  puts( "rtems_object_id_get_class - OK" );
271  part = rtems_object_id_get_class( main_task );
272  assert( part == OBJECTS_RTEMS_TASKS );
273
274  puts( "rtems_object_id_get_node - OK" );
275  part = rtems_object_id_get_node( main_task );
276  assert( part == 1 );
277
278  puts( "rtems_object_id_get_index - OK" );
279  part = rtems_object_id_get_index( main_task );
280  assert( part == 1 );
281
282  /*
283   * Start another screen and do the API/Class min/max routines
284   */
285  rtems_test_pause();
286
287  printf( "rtems_object_id_api_minimum returned %d\n",
288          rtems_object_id_api_minimum() );
289  printf( "rtems_object_id_api_maximum returned %d\n",
290          rtems_object_id_api_maximum() );
291
292  printf( "rtems_object_api_minimum_class(0) returned %d\n",
293          rtems_object_api_minimum_class(0) );
294  printf( "rtems_object_api_maximum_class(0) returned %d\n",
295          rtems_object_api_maximum_class(0) );
296
297  printf( "rtems_object_api_minimum_class(0) returned %d\n",
298          rtems_object_api_minimum_class(0) );
299  printf( "rtems_object_api_maximum_class(0) returned %d\n",
300          rtems_object_api_maximum_class(0) );
301  printf( "rtems_object_api_minimum_class(255) returned %d\n",
302          rtems_object_api_minimum_class(255) );
303  printf( "rtems_object_api_maximum_class(255) returned %d\n",
304          rtems_object_api_maximum_class(255) );
305
306  printf( "rtems_object_api_minimum_class(OBJECTS_INTERNAL_API) returned %d\n",
307          rtems_object_api_minimum_class(OBJECTS_INTERNAL_API) );
308  printf( "rtems_object_api_maximum_class(OBJECTS_INTERNAL_API) returned %d\n",
309          rtems_object_api_maximum_class(OBJECTS_INTERNAL_API) );
310
311  printf( "rtems_object_api_minimum_class(OBJECTS_CLASSIC_API) returned %d\n",
312          rtems_object_api_minimum_class(OBJECTS_CLASSIC_API) );
313  printf( "rtems_object_api_maximum_class(OBJECTS_CLASSIC_API) returned %d\n",
314          rtems_object_api_maximum_class(OBJECTS_CLASSIC_API) );
315
316  printf( "rtems_object_api_minimum_class(OBJECTS_ITRON_API) returned %d\n",
317          rtems_object_api_minimum_class(OBJECTS_ITRON_API) );
318  printf( "rtems_object_api_maximum_class(OBJECTS_ITRON_API) returned %d\n",
319          rtems_object_api_maximum_class(OBJECTS_ITRON_API) );
320
321  /*
322   *  Another screen break for the API and class name tests
323   */
324  rtems_test_pause();
325 
326  printf( "rtems_object_get_api_name(0) = %s\n", rtems_object_get_api_name(0) );
327  printf( "rtems_object_get_api_name(255) = %s\n",
328    rtems_object_get_api_name(255));
329
330  printf( "rtems_object_get_api_name(INTERNAL_API) = %s\n",
331     rtems_object_get_api_name(OBJECTS_INTERNAL_API) );
332  printf( "rtems_object_get_api_name(CLASSIC_API) = %s\n",
333     rtems_object_get_api_name(OBJECTS_CLASSIC_API) );
334  printf( "rtems_object_get_api_name(ITRON_API) = %s\n",
335     rtems_object_get_api_name(OBJECTS_ITRON_API) );
336
337  printf( "rtems_object_get_api_class_name(0, RTEMS_TASKS) = %s\n",
338    rtems_object_get_api_class_name( 0, OBJECTS_RTEMS_TASKS ) );
339  printf( "rtems_object_get_api_class_name(CLASSIC_API, 0) = %s\n",
340    rtems_object_get_api_class_name( OBJECTS_CLASSIC_API, 0 ) );
341  printf("rtems_object_get_api_class_name(INTERNAL_API, MUTEXES) = %s\n",
342    rtems_object_get_api_class_name(
343       OBJECTS_INTERNAL_API, OBJECTS_INTERNAL_MUTEXES));
344  printf("rtems_object_get_api_class_name(CLASSIC_API, RTEMS_BARRIERS) = %s\n",
345    rtems_object_get_api_class_name(
346       OBJECTS_CLASSIC_API, OBJECTS_RTEMS_BARRIERS));
347
348  /*
349   *  Another screen break for the information
350   */
351
352  rtems_test_pause();
353 
354  puts( "rtems_object_get_class_information - INVALID_ADDRESS" );
355  sc = rtems_object_get_class_information(
356             OBJECTS_INTERNAL_API, OBJECTS_INTERNAL_THREADS, NULL );
357  fatal_directive_status(
358    sc,
359    RTEMS_INVALID_ADDRESS,
360    "rtems_object_get_class_information"
361  );
362
363  puts( "rtems_object_get_class_information - INVALID_NUMBER (bad API)" );
364  sc =
365    rtems_object_get_class_information(0, OBJECTS_INTERNAL_THREADS, &info);
366  fatal_directive_status(
367    sc,
368    RTEMS_INVALID_NUMBER,
369    "rtems_object_get_class_information (API)"
370  );
371
372  puts( "rtems_object_get_class_information - INVALID_NUMBER (api=0xff)" );
373  sc = rtems_object_get_class_information( 0xff, 1, &info );
374  fatal_directive_status(
375    sc,
376    RTEMS_INVALID_NUMBER,
377    "rtems_object_get_class_information (api=0xff)"
378  );
379
380  puts( "rtems_object_get_class_information - INVALID_NUMBER (class=0)" );
381  sc = rtems_object_get_class_information(
382    OBJECTS_INTERNAL_API, 0, &info );
383  fatal_directive_status(
384    sc,
385    RTEMS_INVALID_NUMBER,
386    "rtems_object_get_class_information (class=0)"
387  );
388
389  puts(
390    "rtems_object_get_class_information - INVALID_NUMBER (class too high)" );
391  sc = rtems_object_get_class_information(
392    OBJECTS_INTERNAL_API, 0xff, &info);
393  fatal_directive_status(
394    sc,
395    RTEMS_INVALID_NUMBER,
396    "rtems_object_get_class_information (class #2)"
397  );
398
399  puts( "rtems_object_get_class_information - Classic Tasks - OK" );
400  sc = rtems_object_get_class_information(
401             OBJECTS_CLASSIC_API, OBJECTS_RTEMS_TASKS, &info );
402  directive_failed( sc, "rtems_object_get_class_information" );
403  print_class_info( OBJECTS_CLASSIC_API, OBJECTS_RTEMS_TASKS, &info );
404
405  puts( "rtems_object_get_class_information - Classic Timers - OK" );
406  sc = rtems_object_get_class_information(
407             OBJECTS_CLASSIC_API, OBJECTS_RTEMS_TIMERS, &info );
408  directive_failed( sc, "rtems_object_get_class_information" );
409  print_class_info( OBJECTS_CLASSIC_API, OBJECTS_RTEMS_TIMERS, &info );
410
411  /*
412   *  Ugly hack to force a weird error.
413   *
414   *  The weird case is that we need to look up a thread Id where the
415   *  thread classes' object information table pointer is NULL.  Probably
416   *  impossible to really hit until registration is completely dynamically
417   *  configurable.
418   */
419  {
420    rtems_task_priority              old_priority;
421    void                            *tmp;
422    int                              class;
423    int                              api;
424
425    class = OBJECTS_INTERNAL_API;
426    api   = OBJECTS_INTERNAL_THREADS;
427
428    puts( "rtems_task_set_priority - use valid Idle thread id" );
429    sc = rtems_task_set_priority(
430      rtems_build_id( class, api, 1, 1 ),
431      RTEMS_CURRENT_PRIORITY,
432      &old_priority
433    );
434    directive_failed( sc, "rtems_task_set_priority" );
435
436    /* destroy class pointer */
437    puts( "rtems_task_set_priority - clobber internal thread class info" );
438    tmp = _Objects_Information_table[ class ][ api ];
439    _Objects_Information_table[ class ][ api ] = NULL;
440
441    puts( "rtems_task_set_priority - use valid Idle thread id again" );
442    sc = rtems_task_set_priority(
443      rtems_build_id( class, api, 1, 1 ),
444      RTEMS_CURRENT_PRIORITY,
445      &old_priority
446    );
447    fatal_directive_status( sc, RTEMS_INVALID_ID, "rtems_task_set_priority" );
448
449    /* restore pointer */
450    puts( "rtems_task_set_priority - restore internal thread class info" );
451    _Objects_Information_table[ class ][ api ] = tmp;
452  }
453
454  /*
455   *  Bad Id on an object which disables interrupts as part of translating
456   *  the Id into an object pointer.  Semaphore is the only object that
457   *  needs this. This is a "good" Id in that is it in range, but bad in
458   *  that it has not been allocated so the local_table pointer is NULL.
459   */
460  puts( "rtems_semaphore_obtain - good but uncreated ID - INVALID_ID - OK" );
461  sc = rtems_semaphore_obtain(
462    rtems_build_id(
463      OBJECTS_CLASSIC_API,
464      OBJECTS_RTEMS_SEMAPHORES,
465      1,
466      rtems_configuration_get_maximum_semaphores()
467    ),
468    RTEMS_DEFAULT_OPTIONS,
469    0
470  );
471  fatal_directive_status( sc, RTEMS_INVALID_ID, "rtems_semaphore_obtain" );
472
473  puts( "*** END OF TEST 43 ***" );
474  rtems_test_exit( 0 );
475}
Note: See TracBrowser for help on using the repository browser.