source: rtems/testsuites/sptests/spchain/init.c

Last change on this file was e7d46b73, checked in by Joel Sherrill <joel@…>, on 03/31/22 at 21:35:18

testsuites/sptests/sp[a-f*]*: Change license to BSD-2

Updates #3053.

  • Property mode set to 100644
File size: 17.2 KB
Line 
1/* SPDX-License-Identifier: BSD-2-Clause */
2
3/*
4 *  COPYRIGHT (c) 1989-2012.
5 *  On-Line Applications Research Corporation (OAR).
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 * POSSIBILITY OF SUCH DAMAGE.
27 */
28
29#ifdef HAVE_CONFIG_H
30#include "config.h"
31#endif
32
33#include <tmacros.h>
34#include <rtems/chain.h>
35
36const char rtems_test_name[] = "SPCHAIN";
37
38static void test_chain_init_one(void)
39{
40  Chain_Control chain;
41  Chain_Node    node;
42
43  puts( "INIT - Verify _Chain_Initialize_one" );
44
45  _Chain_Initialize_node( &node );
46  _Chain_Initialize_one( &chain, &node );
47  rtems_test_assert( !_Chain_Is_empty( &chain ) );
48  rtems_test_assert( !_Chain_Is_node_off_chain( &node ) );
49  rtems_test_assert( _Chain_Is_first( &node ) );
50  rtems_test_assert( _Chain_Is_last( &node ) );
51  rtems_test_assert( _Chain_First( &chain ) == &node );
52  rtems_test_assert( _Chain_Last( &chain ) == &node );
53  rtems_test_assert( _Chain_Next( &node ) == _Chain_Tail( &chain ) );
54  rtems_test_assert( _Chain_Previous( &node ) == _Chain_Head( &chain ) );
55
56  _Chain_Extract_unprotected( &node );
57  rtems_test_assert( _Chain_Is_empty( &chain ) );
58}
59
60static void update_registry_and_extract(
61  Chain_Iterator_registry *reg,
62  Chain_Node *n
63)
64{
65  _Chain_Iterator_registry_update( reg, n );
66  _Chain_Extract_unprotected( n );
67}
68
69static Chain_Iterator_registry static_reg =
70  CHAIN_ITERATOR_REGISTRY_INITIALIZER( static_reg );
71
72static void test_chain_iterator( void )
73{
74  Chain_Control chain;
75  Chain_Iterator_registry reg;
76  Chain_Iterator fit;
77  Chain_Iterator bit;
78  Chain_Node a;
79  Chain_Node b;
80  Chain_Node c;
81
82  puts( "INIT - Verify Chain_Iterator" );
83
84  rtems_test_assert( _Chain_Is_empty( &static_reg.Iterators ));
85
86  _Chain_Initialize_empty( &chain );
87  _Chain_Initialize_node( &a );
88  _Chain_Initialize_node( &b );
89  _Chain_Initialize_node( &c );
90  _Chain_Iterator_registry_initialize( &reg );
91  _Chain_Iterator_initialize( &chain, &reg, &fit, CHAIN_ITERATOR_FORWARD );
92  _Chain_Iterator_initialize( &chain, &reg, &bit, CHAIN_ITERATOR_BACKWARD );
93
94  rtems_test_assert( _Chain_Iterator_next( &fit ) == _Chain_Tail( &chain ));
95  rtems_test_assert( _Chain_Iterator_next( &bit ) == _Chain_Head( &chain ));
96
97  _Chain_Iterator_set_position( &fit, _Chain_Head( &chain ) );
98  _Chain_Iterator_set_position( &bit, _Chain_Tail( &chain ) );
99  rtems_test_assert( _Chain_Iterator_next( &fit ) == _Chain_Tail( &chain ));
100  rtems_test_assert( _Chain_Iterator_next( &bit ) == _Chain_Head( &chain ));
101
102  _Chain_Append_unprotected( &chain, &a );
103  rtems_test_assert( _Chain_Iterator_next( &fit ) == &a );
104  rtems_test_assert( _Chain_Iterator_next( &bit ) == &a );
105
106  _Chain_Append_unprotected( &chain, &b );
107  rtems_test_assert( _Chain_Iterator_next( &fit ) == &a );
108  rtems_test_assert( _Chain_Iterator_next( &bit ) == &b );
109
110  _Chain_Append_unprotected( &chain, &c );
111  rtems_test_assert( _Chain_Iterator_next( &fit ) == &a );
112  rtems_test_assert( _Chain_Iterator_next( &bit ) == &c );
113
114  update_registry_and_extract( &reg, &b );
115  rtems_test_assert( _Chain_Iterator_next( &fit ) == &a );
116  rtems_test_assert( _Chain_Iterator_next( &bit ) == &c );
117
118  _Chain_Insert_unprotected( &a, &b );
119  rtems_test_assert( _Chain_Iterator_next( &fit ) == &a );
120  rtems_test_assert( _Chain_Iterator_next( &bit ) == &c );
121
122  update_registry_and_extract( &reg, &c );
123  rtems_test_assert( _Chain_Iterator_next( &fit ) == &a );
124  rtems_test_assert( _Chain_Iterator_next( &bit ) == &b );
125
126  _Chain_Append_unprotected( &chain, &c );
127  rtems_test_assert( _Chain_Iterator_next( &fit ) == &a );
128  rtems_test_assert( _Chain_Iterator_next( &bit ) == &c );
129
130  update_registry_and_extract( &reg, &a );
131  rtems_test_assert( _Chain_Iterator_next( &fit ) == &b );
132  rtems_test_assert( _Chain_Iterator_next( &bit ) == &c );
133
134  _Chain_Prepend_unprotected( &chain, &a );
135  rtems_test_assert( _Chain_Iterator_next( &fit ) == &a );
136  rtems_test_assert( _Chain_Iterator_next( &bit ) == &c );
137
138  update_registry_and_extract( &reg, &a );
139  rtems_test_assert( _Chain_Iterator_next( &fit ) == &b );
140  rtems_test_assert( _Chain_Iterator_next( &bit ) == &c );
141
142  update_registry_and_extract( &reg, &b );
143  rtems_test_assert( _Chain_Iterator_next( &fit ) == &c );
144  rtems_test_assert( _Chain_Iterator_next( &bit ) == &c );
145
146  update_registry_and_extract( &reg, &c );
147  rtems_test_assert( _Chain_Iterator_next( &fit ) == _Chain_Tail( &chain ));
148  rtems_test_assert( _Chain_Iterator_next( &bit ) == _Chain_Head( &chain ));
149
150  _Chain_Append_unprotected( &chain, &a );
151  rtems_test_assert( _Chain_Iterator_next( &fit ) == &a );
152  rtems_test_assert( _Chain_Iterator_next( &bit ) == &a );
153
154  _Chain_Append_unprotected( &chain, &b );
155  rtems_test_assert( _Chain_Iterator_next( &fit ) == &a );
156  rtems_test_assert( _Chain_Iterator_next( &bit ) == &b );
157
158  _Chain_Append_unprotected( &chain, &c );
159  rtems_test_assert( _Chain_Iterator_next( &fit ) == &a );
160  rtems_test_assert( _Chain_Iterator_next( &bit ) == &c );
161
162  update_registry_and_extract( &reg, &c );
163  rtems_test_assert( _Chain_Iterator_next( &fit ) == &a );
164  rtems_test_assert( _Chain_Iterator_next( &bit ) == &b );
165
166  update_registry_and_extract( &reg, &b );
167  rtems_test_assert( _Chain_Iterator_next( &fit ) == &a );
168  rtems_test_assert( _Chain_Iterator_next( &bit ) == &a );
169
170  update_registry_and_extract( &reg, &a );
171  rtems_test_assert( _Chain_Iterator_next( &fit ) == _Chain_Tail( &chain ));
172  rtems_test_assert( _Chain_Iterator_next( &bit ) == _Chain_Head( &chain ));
173
174  rtems_test_assert( !_Chain_Is_empty( &reg.Iterators ));
175  _Chain_Iterator_destroy( &fit );
176  rtems_test_assert( !_Chain_Is_empty( &reg.Iterators ));
177  _Chain_Iterator_destroy( &bit );
178  rtems_test_assert( _Chain_Is_empty( &reg.Iterators ));
179}
180
181/* forward declarations to avoid warnings */
182rtems_task Init(rtems_task_argument argument);
183
184#define EVENT RTEMS_EVENT_13
185#define TIMEOUT 1
186
187typedef struct {
188  rtems_chain_node Node;
189  int              id;
190} test_node;
191
192static rtems_chain_control one_node_chain;
193
194static rtems_chain_node node_of_one_node_chain =
195  RTEMS_CHAIN_NODE_INITIALIZER_ONE_NODE_CHAIN( &one_node_chain );
196
197static rtems_chain_control one_node_chain =
198  RTEMS_CHAIN_INITIALIZER_ONE_NODE( &node_of_one_node_chain );
199
200static void test_chain_control_initializer(void)
201{
202  rtems_chain_control chain = RTEMS_CHAIN_INITIALIZER_EMPTY( chain );
203
204  puts( "INIT - Verify rtems_chain_control initializer" );
205
206  rtems_test_assert( rtems_chain_is_empty( &chain ) );
207
208  rtems_test_assert( rtems_chain_has_only_one_node( &one_node_chain ) );
209  rtems_test_assert(
210    rtems_chain_immutable_first( &one_node_chain ) == &node_of_one_node_chain
211  );
212  rtems_test_assert(
213    rtems_chain_immutable_last( &one_node_chain ) == &node_of_one_node_chain
214  );
215  rtems_test_assert(
216    rtems_chain_immutable_head( &one_node_chain )
217      == rtems_chain_immutable_previous( &node_of_one_node_chain )
218  );
219  rtems_test_assert(
220    rtems_chain_immutable_tail( &one_node_chain )
221      == rtems_chain_immutable_next( &node_of_one_node_chain )
222  );
223}
224
225static void test_chain_control_layout(void)
226{
227  Chain_Control chain;
228
229  puts( "INIT - Verify rtems_chain_control layout" );
230
231  rtems_test_assert(
232    sizeof(Chain_Control)
233      == sizeof(Chain_Node) + sizeof(Chain_Node *)
234  );
235  rtems_test_assert(
236    sizeof(Chain_Control)
237      == 3 * sizeof(Chain_Node *)
238  );
239  rtems_test_assert(
240    _Chain_Previous( _Chain_Head( &chain ) )
241      == _Chain_Next( _Chain_Tail( &chain ) )
242  );
243
244#if !defined( RTEMS_SMP )
245  rtems_test_assert(
246    sizeof(Chain_Control)
247      == sizeof(rtems_chain_control)
248  );
249#endif
250}
251
252static void test_chain_get_with_wait(void)
253{
254  rtems_status_code sc = RTEMS_SUCCESSFUL;
255  rtems_chain_control chain;
256  rtems_chain_node *p = (rtems_chain_node *) 1;
257
258  puts( "INIT - Verify rtems_chain_get_with_wait" );
259  rtems_chain_initialize_empty( &chain );
260  sc = rtems_chain_get_with_wait( &chain, EVENT, TIMEOUT, &p );
261  rtems_test_assert( sc == RTEMS_TIMEOUT );
262  rtems_test_assert( p == NULL );
263}
264
265static void test_chain_first_and_last(void)
266{
267  rtems_chain_control   chain;
268  rtems_chain_node      node1, node2;
269  rtems_chain_node     *cnode;
270
271  rtems_chain_initialize_empty( &chain );
272  rtems_chain_initialize_node( &node1 );
273  rtems_chain_initialize_node( &node2 );
274  rtems_chain_append( &chain, &node1 );
275  rtems_chain_insert( &node1, &node2 );
276
277  puts( "INIT - Verify rtems_chain_is_first" );
278  cnode = rtems_chain_first(&chain); 
279  rtems_test_assert( rtems_chain_is_first( cnode ) );
280
281  puts( "INIT - Verify rtems_chain_is_last" );
282  cnode = rtems_chain_last(&chain);
283  rtems_test_assert( rtems_chain_is_last( cnode ) );
284
285  cnode = rtems_chain_get_first_unprotected( &chain );
286  rtems_test_assert( cnode == &node1 );
287  cnode = rtems_chain_first( &chain );
288  rtems_test_assert( cnode == &node2 );
289  cnode = rtems_chain_last( &chain );
290  rtems_test_assert( cnode == &node2 );
291}
292
293static void test_chain_with_notification(void)
294{
295  rtems_status_code sc = RTEMS_SUCCESSFUL;
296  rtems_chain_control chain;
297  rtems_chain_node a;
298  rtems_chain_node b;
299  rtems_chain_node *p = (rtems_chain_node *) 1;
300  rtems_event_set out = 0;
301
302  puts( "INIT - Verify rtems_chain_append_with_notification" );
303  rtems_chain_initialize_empty( &chain );
304  rtems_chain_initialize_node( &a );
305  sc = rtems_chain_append_with_notification(
306    &chain,
307    &a,
308    rtems_task_self(),
309    EVENT
310  );
311  rtems_test_assert( sc == RTEMS_SUCCESSFUL );
312  sc = rtems_chain_get_with_wait( &chain, EVENT, TIMEOUT, &p );
313  rtems_test_assert( sc == RTEMS_SUCCESSFUL );
314  rtems_test_assert( p == &a );
315
316  rtems_chain_initialize_empty( &chain );
317  rtems_chain_initialize_node( &a );
318  rtems_chain_initialize_node( &b );
319
320  rtems_chain_append( &chain, &b );
321  sc = rtems_chain_append_with_notification(
322    &chain,
323    &a,
324    rtems_task_self(),
325    EVENT
326  );
327  rtems_test_assert( sc == RTEMS_SUCCESSFUL );
328  rtems_test_assert( p == &a );
329
330  puts( "INIT - Verify rtems_chain_prepend_with_notification" );
331  rtems_chain_initialize_empty( &chain );
332  rtems_chain_initialize_node( &a );
333  rtems_chain_initialize_node( &b );
334  sc = rtems_chain_prepend_with_notification(
335    &chain,
336    &a,
337    rtems_task_self(),
338    EVENT
339  );
340  rtems_test_assert( sc == RTEMS_SUCCESSFUL );
341  sc = rtems_chain_get_with_wait( &chain, EVENT, TIMEOUT, &p );
342  rtems_test_assert( sc == RTEMS_SUCCESSFUL );
343  rtems_test_assert( p == &a );
344
345  rtems_chain_prepend( &chain, &b );
346  sc = rtems_chain_prepend_with_notification(
347    &chain,
348    &a,
349    rtems_task_self(),
350    EVENT
351  );
352  rtems_test_assert( sc == RTEMS_SUCCESSFUL );
353  rtems_test_assert( p == &a );
354
355  puts( "INIT - Verify rtems_chain_get_with_notification" );
356  rtems_chain_initialize_empty( &chain );
357  rtems_chain_initialize_node( &a );
358  rtems_chain_initialize_node( &b );
359
360  rtems_chain_append( &chain, &b );
361  rtems_chain_append( &chain, &a );
362
363  sc = rtems_chain_get_with_notification(&chain, rtems_task_self(), EVENT, &p);
364  rtems_test_assert( sc == RTEMS_SUCCESSFUL );
365  rtems_test_assert( p == &b );
366
367  sc = rtems_chain_get_with_notification(&chain, rtems_task_self(), EVENT, &p);
368  rtems_test_assert( sc == RTEMS_SUCCESSFUL );
369  rtems_test_assert( p == &a );
370  sc = rtems_event_receive(
371    EVENT,
372    RTEMS_EVENT_ALL | RTEMS_WAIT,
373    TIMEOUT,
374    &out
375  );
376  rtems_test_assert( sc == RTEMS_SUCCESSFUL );
377  rtems_test_assert( out == EVENT );
378}
379
380static void test_chain_with_empty_check(void)
381{
382  rtems_chain_control chain;
383  rtems_chain_node a;
384  rtems_chain_node b;
385  rtems_chain_node c;
386  rtems_chain_node *p;
387  bool empty;
388
389  puts( "INIT - Verify rtems_chain_append_with_empty_check" );
390  rtems_chain_initialize_empty( &chain );
391  rtems_chain_initialize_node( &a );
392  rtems_chain_initialize_node( &b );
393  empty = rtems_chain_append_with_empty_check( &chain, &a );
394  rtems_test_assert( empty );
395  empty = rtems_chain_append_with_empty_check( &chain, &b );
396  rtems_test_assert( !empty );
397
398  puts( "INIT - Verify rtems_chain_prepend_with_empty_check" );
399  rtems_chain_initialize_empty( &chain );
400  rtems_chain_initialize_node( &a );
401  rtems_chain_initialize_node( &b );
402  rtems_chain_initialize_node( &c );
403  empty = rtems_chain_prepend_with_empty_check( &chain, &a );
404  rtems_test_assert( empty );
405  empty = rtems_chain_prepend_with_empty_check( &chain, &b );
406  rtems_test_assert( !empty );
407  empty = rtems_chain_prepend_with_empty_check( &chain, &c );
408  rtems_test_assert( !empty );
409
410  puts( "INIT - Verify rtems_chain_get_with_empty_check" );
411  rtems_chain_initialize_empty( &chain );
412  rtems_chain_initialize_node( &a );
413  rtems_chain_initialize_node( &b );
414  empty = rtems_chain_get_with_empty_check( &chain, &p );
415  rtems_test_assert( empty );
416
417  rtems_chain_append( &chain, &a );
418  rtems_chain_append( &chain, &b );
419  empty = rtems_chain_get_with_empty_check( &chain, &p );
420  rtems_test_assert( !empty );
421  rtems_test_assert( p == &a );
422  empty = rtems_chain_get_with_empty_check( &chain, &p );
423  rtems_test_assert( empty );
424  rtems_test_assert( p == &b );
425}
426
427static void test_chain_node_count(void)
428{
429  rtems_chain_control chain;
430  rtems_chain_node nodes[3];
431  size_t count;
432  size_t i;
433
434  puts( "INIT - Verify rtems_chain_node_count_unprotected" );
435
436  rtems_chain_initialize_empty( &chain );
437  count = rtems_chain_node_count_unprotected( &chain );
438  rtems_test_assert( count == 0 );
439
440  for (i = 0; i < RTEMS_ARRAY_SIZE( nodes ); ++i) {
441    rtems_chain_initialize_node( &nodes[ i ] );
442    rtems_chain_append_unprotected( &chain, &nodes[i] );
443    count = rtems_chain_node_count_unprotected( &chain );
444    rtems_test_assert( count == i + 1 );
445  }
446}
447
448static bool test_order(
449  const void       *key,
450  const Chain_Node *left,
451  const Chain_Node *right
452)
453{
454  rtems_test_assert( key == left );
455
456  return (uintptr_t) left < (uintptr_t) right;
457}
458
459static void insert_ordered( Chain_Control *chain, Chain_Node *node )
460{
461  _Chain_Insert_ordered_unprotected( chain, node, node, test_order );
462}
463
464static void test_chain_insert_ordered( void )
465{
466  Chain_Control chain = CHAIN_INITIALIZER_EMPTY(chain);
467  Chain_Node nodes[5];
468  const Chain_Node *tail;
469  const Chain_Node *node;
470  size_t n = RTEMS_ARRAY_SIZE( nodes );
471  size_t i;
472
473  puts( "INIT - Verify _Chain_Insert_ordered_unprotected" );
474
475  for ( i = 0; i < n; ++i ) {
476    _Chain_Initialize_node( &nodes[ i ] );
477  }
478
479  insert_ordered( &chain, &nodes[4] );
480  insert_ordered( &chain, &nodes[2] );
481  insert_ordered( &chain, &nodes[0] );
482  insert_ordered( &chain, &nodes[3] );
483  insert_ordered( &chain, &nodes[1] );
484
485  tail = _Chain_Immutable_tail( &chain );
486  node = _Chain_Immutable_first( &chain );
487  i = 0;
488  while ( node != tail && i < n ) {
489    rtems_test_assert( node == &nodes[ i ] );
490    ++i;
491    node = _Chain_Immutable_next( node );
492  }
493
494  rtems_test_assert( i == n );
495}
496
497rtems_task Init(
498  rtems_task_argument ignored
499)
500{
501  rtems_chain_control  chain1;
502  rtems_chain_node    *p;
503  test_node            node1, node2;
504  int                  id;
505
506  TEST_BEGIN();
507
508  puts( "Init - Initialize chain empty" );
509  rtems_chain_initialize_empty( &chain1 );
510  rtems_chain_initialize_node( &node1.Node );
511  rtems_chain_initialize_node( &node2.Node );
512
513  /* verify that the chain append and insert work */
514  puts( "INIT - Verify rtems_chain_insert" );
515  node1.id = 1;
516  node2.id = 2;
517  rtems_chain_append( &chain1, &node1.Node );
518  rtems_chain_insert( &node1.Node, &node2.Node );
519
520  for ( p = rtems_chain_first(&chain1), id = 1 ;
521        !rtems_chain_is_tail(&chain1, p) ;
522        p = p->next , id++ ) {
523     test_node *t = (test_node *)p;
524     if ( id > 2 ) {
525       puts( "INIT - TOO MANY NODES ON CHAIN" );
526       rtems_test_exit(0);
527     }
528     if ( t->id != id ) {
529       puts( "INIT - ERROR ON CHAIN ID MISMATCH" );
530       rtems_test_exit(0);
531     }
532  }
533
534  test_chain_init_one();
535  test_chain_first_and_last();
536  test_chain_with_empty_check();
537  test_chain_with_notification();
538  test_chain_get_with_wait();
539  test_chain_control_layout();
540  test_chain_control_initializer();
541  test_chain_node_count();
542  test_chain_insert_ordered();
543  test_chain_iterator();
544
545  TEST_END();
546  rtems_test_exit(0);
547}
548
549/* configuration information */
550
551#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER
552#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
553
554#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
555
556#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
557#define CONFIGURE_MAXIMUM_TASKS 1
558
559#define CONFIGURE_INIT
560#include <rtems/confdefs.h>
561
562/* global variables */
Note: See TracBrowser for help on using the repository browser.