Merge "Add content type for long description for twine"
[ric-plt/lib/rmr.git] / test / ring_static_test.c
1 // : vi ts=4 sw=4 noet :
2 /*
3 ==================================================================================
4             Copyright (c) 2019 Nokia
5             Copyright (c) 2018-2019 AT&T Intellectual Property.
6
7    Licensed under the Apache License, Version 2.0 (the "License");
8    you may not use this file except in compliance with the License.
9    You may obtain a copy of the License at
10
11            http://www.apache.org/licenses/LICENSE-2.0
12
13    Unless required by applicable law or agreed to in writing, software
14    distributed under the License is distributed on an "AS IS" BASIS,
15    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16    See the License for the specific language governing permissions and
17    limitations under the License.
18 ==================================================================================
19 */
20
21 /*
22         Mmemonic:       ring_static_test.c
23         Abstract:       Test the ring funcitons. These are meant to be included at compile
24                                 time by the test driver.
25
26         Author:         E. Scott Daniels
27         Date:           3 April 2019
28 */
29
30 #include <unistd.h>
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include <strings.h>
34 #include <errno.h>
35 #include <string.h>
36 #include <stdint.h>
37 #include <pthread.h>
38 #include <semaphore.h>
39
40 #include "rmr.h"
41 #include "rmr_agnostic.h"
42
43
44 /*
45         Conduct a series of interleaved tests inserting i-factor
46         values before beginning to pull values (i-factor must be
47         size - 2 smaller than the ring.
48         Returns 0 on success, 1 on insert failure and 2 on pull failure.
49 */
50 static int ie_test( void* r, int i_factor, long inserts ) {
51         int i;
52         int* dp;
53         int data[29];
54
55         for( i = 0; i < inserts; i++ ) {
56                 data[i%29] = i;
57                 if( ! uta_ring_insert( r, &data[i%29] ) ) {
58                         fprintf( stderr, "<FAIL> interleaved insert failed on ifactor=%d i=%d\n", i_factor, i );
59                         return 1;
60                 }
61                 if( i > i_factor-1 ) {
62                         dp = uta_ring_extract( r );
63                         if( *dp != data[(i-i_factor)%29] ) {
64                                 fprintf( stderr, "<FAIL> interleaved exctract failed on ifactor=%d i=%d expected=%d got=%d\n", i_factor, i, data[(i-i_factor)%29], *dp );
65                                 return 2;
66                         }
67                 }
68         }
69         //fprintf( stderr, "<OK>   interleaved insert/extract test passed for insert factor %d\n", i_factor );
70
71         return 0;
72 }
73
74 static int ring_test( ) {
75         void* r;
76         int i;
77         int j;
78         int     data[20];
79         int*    dp;
80         int size = 18;
81
82         r = uta_mk_ring( 0 );                   // should return nil
83         if( r != NULL ) {
84                 fprintf( stderr, "<FAIL> attempt to make a ring with size 0 returned a pointer\n" );
85                 return 1;
86         }
87         r = uta_mk_ring( -1 );                  // should also return nil
88         if( r != NULL ) {
89                 fprintf( stderr, "<FAIL> attempt to make a ring with size <0 returned a pointer\n" );
90                 return 1;
91         }
92
93         r = uta_mk_ring( 18 );
94         if( r == NULL ) {
95                 fprintf( stderr, "<FAIL> unable to make ring with 17 entries\n" );
96                 return 1;
97         }
98
99         for( i = 0; i < 20; i++ ) {             // test to ensure it reports full when head/tail start at 0
100                 data[i] = i;
101                 if( ! uta_ring_insert( r, &data[i] ) ) {
102                         break;
103                 }
104         }
105
106         if( i > size ) {
107                 fprintf( stderr, "<FAIL> didn not report table full: i=%d\n", i );
108                 return 1;
109         }
110
111         fprintf( stderr, "<OK>   reported table full at i=%d as expected\n", i );
112
113
114         for( i = 0; i < size + 3; i++ ) {                                                               // ensure they all come back in order, and we don't get 'extras'
115                 if( (dp = uta_ring_extract( r )) == NULL ) {
116                         if( i < size-1 ) {
117                                 fprintf( stderr, "<FAIL> nil pointer at i=%d\n", i );
118                                 return 1;
119                         } else {
120                                 break;
121                         }
122                 }
123
124                 if( *dp != i ) {
125                         fprintf( stderr, "<FAIL> data at i=% isnt right; expected %d got %d\n", i, i, *dp );
126                 }
127         }
128         if( i > size ) {
129                 fprintf( stderr, "<FAIL> got too many values on extract: %d\n", i );
130                 return 1;
131         }
132         fprintf( stderr, "<OK>   extracted values were sane, got: %d\n", i-1 );
133
134         uta_ring_free( NULL );                                                  // ensure this doesn't blow up
135         uta_ring_free( r );
136         for( i = 2; i < 15; i++ ) {
137                 r = uta_mk_ring( 16 );
138                 if( ie_test( r, i, 101 ) != 0 ) {                       // modest number of inserts
139                         fprintf( stderr, "<FAIL> ie test for 101 inserts didn't return 0\n" );
140                         return 1;
141                 }
142
143                 uta_ring_free( r );
144         }
145         fprintf( stderr, "<OK>   all modest insert/exctract tests pass\n" );
146
147         size = 5;
148         for( j = 0; j < 20; j++ ) {
149                 for( i = 2; i < size - 2; i++ ) {
150                         r = uta_mk_ring( size );
151                         if( ie_test( r, i, 66000 ) != 0 ) {                     // should force the 16bit head/tail indexes to roll over
152                                 fprintf( stderr, "<FAIL> ie test for 66K inserts didn't return 0\n" );
153                                 return 1;
154                         }
155
156                         uta_ring_free( r );
157                 }
158                 fprintf( stderr, "<OK>   all large insert/exctract tests pass ring size=%d\n", size );
159
160                 size++;
161         }
162
163         fprintf( stderr, "<INFO> all ring tests pass\n" );
164         return 0;
165 }