OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [ecos-3.0/] [packages/] [compat/] [posix/] [current/] [tests/] [pmqueue1.c] - Blame information for rev 786

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 786 skrzyp
/*========================================================================
2
//
3
//      pmqueue1.c
4
//
5
//      POSIX Message queues tests
6
//
7
//========================================================================
8
// ####ECOSGPLCOPYRIGHTBEGIN####
9
// -------------------------------------------
10
// This file is part of eCos, the Embedded Configurable Operating System.
11
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
12
//
13
// eCos is free software; you can redistribute it and/or modify it under
14
// the terms of the GNU General Public License as published by the Free
15
// Software Foundation; either version 2 or (at your option) any later
16
// version.
17
//
18
// eCos is distributed in the hope that it will be useful, but WITHOUT
19
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
21
// for more details.
22
//
23
// You should have received a copy of the GNU General Public License
24
// along with eCos; if not, write to the Free Software Foundation, Inc.,
25
// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
26
//
27
// As a special exception, if other files instantiate templates or use
28
// macros or inline functions from this file, or you compile this file
29
// and link it with other works to produce a work based on this file,
30
// this file does not by itself cause the resulting work to be covered by
31
// the GNU General Public License. However the source code for this file
32
// must still be made available in accordance with section (3) of the GNU
33
// General Public License v2.
34
//
35
// This exception does not invalidate any other reasons why a work based
36
// on this file might be covered by the GNU General Public License.
37
// -------------------------------------------
38
// ####ECOSGPLCOPYRIGHTEND####
39
//========================================================================
40
//#####DESCRIPTIONBEGIN####
41
//
42
// Author(s):     jlarmour
43
// Contributors:
44
// Date:          2000-05-18
45
// Purpose:       This file provides tests for POSIX mqueues
46
// Description:
47
// Usage:
48
//
49
//####DESCRIPTIONEND####
50
//
51
//======================================================================
52
*/
53
 
54
/* CONFIGURATION */
55
 
56
#include <pkgconf/posix.h>
57
 
58
#ifndef CYGPKG_POSIX_MQUEUES
59
# define NA_MSG "Message queues not configured"
60
#endif
61
 
62
#ifdef NA_MSG
63
#include <cyg/infra/testcase.h>      // test API
64
void
65
cyg_user_start(void)
66
{
67
    CYG_TEST_NA( NA_MSG );
68
}
69
 
70
#else
71
 
72
/* INCLUDES */
73
 
74
#include <fcntl.h>                   // O_*
75
#include <errno.h>                   // errno
76
#include <sys/stat.h>                // file modes
77
#include <mqueue.h>                  // Mqueue Header
78
#include <cyg/infra/testcase.h>      // test API
79
 
80
/* FUNCTIONS */
81
 
82
static int
83
my_memcmp(const void *m1, const void *m2, size_t n)
84
{
85
    char *s1 = (char *)m1;
86
    char *s2 = (char *)m2;
87
 
88
    while (n--) {
89
        if (*s1 != *s2)
90
            return *s1 - *s2;
91
        s1++;
92
        s2++;
93
    }
94
    return 0;
95
} // my_memcmp()
96
 
97
//************************************************************************
98
 
99
int
100
main(void)
101
{
102
    mqd_t q1, q2;
103
    char buf[20];
104
    ssize_t recvlen;
105
    unsigned int prio;
106
    struct mq_attr attr, oattr;
107
    mode_t mode;
108
    int err;
109
 
110
    CYG_TEST_INIT();
111
    CYG_TEST_INFO( "Starting POSIX message test 1" );
112
 
113
    q1 = mq_open( "/mq1", O_RDWR );
114
    CYG_TEST_PASS_FAIL( q1 == (mqd_t)-1, "error for non-existent queue" );
115
    CYG_TEST_PASS_FAIL( ENOENT == errno,
116
                        "errno correct for non-existent queue" );
117
 
118
    attr.mq_flags = 0;
119
    attr.mq_maxmsg = 4;
120
    attr.mq_msgsize = 20;
121
    mode = S_IRWXU|S_IRWXG|S_IRWXO; // rwx for all
122
 
123
    q1 = mq_open( "/mq1", O_CREAT|O_NONBLOCK|O_WRONLY, mode, &attr );
124
    CYG_TEST_PASS_FAIL( q1 != (mqd_t)-1, "simple mq_open (write only)" );
125
 
126
    err = mq_getattr( q1, &attr );
127
    CYG_TEST_PASS_FAIL( 0 == err, "simple mq_getattr" );
128
    CYG_TEST_PASS_FAIL( (4 == attr.mq_maxmsg) &&
129
                        (20 == attr.mq_msgsize) &&
130
                        (O_NONBLOCK == (attr.mq_flags & O_NONBLOCK)) &&
131
                        (O_RDONLY != (attr.mq_flags & O_RDONLY)) &&
132
                        (O_WRONLY == (attr.mq_flags & O_WRONLY)) &&
133
                        (O_RDWR != (attr.mq_flags & O_RDWR)) &&
134
                        (0 == attr.mq_curmsgs ), "getattr attributes correct" );
135
 
136
    err = mq_send( q1, "Vik is brill", sizeof("Vik is brill"), 10 );
137
 
138
    CYG_TEST_PASS_FAIL( 0 == err, "simple mq_send" );
139
 
140
    err = mq_getattr( q1, &attr );
141
    CYG_TEST_PASS_FAIL( 0 == err, "simple mq_getattr after send" );
142
    CYG_TEST_PASS_FAIL( (4 == attr.mq_maxmsg) &&
143
                        (20 == attr.mq_msgsize) &&
144
                        (O_NONBLOCK == (attr.mq_flags & O_NONBLOCK)) &&
145
                        (O_RDONLY != (attr.mq_flags & O_RDONLY)) &&
146
                        (O_WRONLY == (attr.mq_flags & O_WRONLY)) &&
147
                        (O_RDWR != (attr.mq_flags & O_RDWR)) &&
148
                        (1 == attr.mq_curmsgs ),
149
                        "getattr attributes correct #2" );
150
 
151
    q2 = mq_open( "/mq1", O_RDONLY|O_CREAT|O_EXCL );
152
    CYG_TEST_PASS_FAIL( q2 == (mqd_t)-1,
153
                        "error for exclusive open of existing queue" );
154
    CYG_TEST_PASS_FAIL( EEXIST == errno,
155
                        "errno correct for exclusive open of existing queue" );
156
 
157
    q2 = mq_open( "/mq1", O_RDONLY );
158
    CYG_TEST_PASS_FAIL( q2 != (mqd_t)-1, "simple mq_open (read only)" );
159
 
160
    err = mq_getattr( q2, &attr );
161
    CYG_TEST_PASS_FAIL( 0 == err, "simple mq_getattr, different mqd_t" );
162
    CYG_TEST_PASS_FAIL( (4 == attr.mq_maxmsg) &&
163
                        (20 == attr.mq_msgsize) &&
164
                        (O_NONBLOCK != (attr.mq_flags & O_NONBLOCK)) &&
165
                        (O_RDONLY == (attr.mq_flags & O_RDONLY)) &&
166
                        (O_WRONLY != (attr.mq_flags & O_WRONLY)) &&
167
                        (O_RDWR != (attr.mq_flags & O_RDWR)) &&
168
                        (1 == attr.mq_curmsgs ),
169
                        "getattr attributes correct #3" );
170
 
171
    err = mq_close( q2 );
172
    CYG_TEST_PASS_FAIL( 0 == err, "simple mq_close" );
173
 
174
    q2 = mq_open( "/mq1", O_RDONLY );
175
    CYG_TEST_PASS_FAIL( q2 != (mqd_t)-1, "mq_open reopen (read only)" );
176
 
177
    err = mq_getattr( q2, &attr );
178
    CYG_TEST_PASS_FAIL( 0 == err, "simple mq_getattr, different mqd_t" );
179
    CYG_TEST_PASS_FAIL( (4 == attr.mq_maxmsg) &&
180
                        (20 == attr.mq_msgsize) &&
181
                        (O_NONBLOCK != (attr.mq_flags & O_NONBLOCK)) &&
182
                        (O_RDONLY == (attr.mq_flags & O_RDONLY)) &&
183
                        (O_WRONLY != (attr.mq_flags & O_WRONLY)) &&
184
                        (O_RDWR != (attr.mq_flags & O_RDWR)) &&
185
                        (1 == attr.mq_curmsgs ),
186
                        "getattr attributes correct #4" );
187
 
188
    recvlen = mq_receive( q2, buf, sizeof(buf), &prio );
189
    CYG_TEST_PASS_FAIL( recvlen == sizeof("Vik is brill"),
190
                        "receive message length" );
191
    CYG_TEST_PASS_FAIL( 0 == my_memcmp( buf, "Vik is brill",
192
                                        sizeof("Vik is brill")),
193
                        "received message data intact" );
194
    CYG_TEST_PASS_FAIL( 10 == prio, "received at correct priority" );
195
 
196
    err = mq_getattr( q1, &attr );
197
    CYG_TEST_PASS_FAIL( 0 == err, "simple mq_getattr after send" );
198
    CYG_TEST_PASS_FAIL( (4 == attr.mq_maxmsg) &&
199
                        (20 == attr.mq_msgsize) &&
200
                        (O_NONBLOCK == (attr.mq_flags & O_NONBLOCK)) &&
201
                        (O_RDONLY != (attr.mq_flags & O_RDONLY)) &&
202
                        (O_WRONLY == (attr.mq_flags & O_WRONLY)) &&
203
                        (O_RDWR != (attr.mq_flags & O_RDWR)) &&
204
                        (0 == attr.mq_curmsgs ),
205
                        "getattr attributes correct #5" );
206
 
207
    attr.mq_flags |= O_NONBLOCK;
208
    err = mq_setattr( q2, &attr, &oattr );
209
    CYG_TEST_PASS_FAIL( 0 == err, "mq_setattr O_NONBLOCK" );
210
    CYG_TEST_PASS_FAIL( (4 == oattr.mq_maxmsg) &&
211
                        (20 == oattr.mq_msgsize) &&
212
                        (O_NONBLOCK != (oattr.mq_flags & O_NONBLOCK)) &&
213
                        (O_RDONLY == (oattr.mq_flags & O_RDONLY)) &&
214
                        (O_WRONLY != (oattr.mq_flags & O_WRONLY)) &&
215
                        (O_RDWR != (oattr.mq_flags & O_RDWR)) &&
216
                        (0 == oattr.mq_curmsgs ),
217
                        "old attribute correct" );
218
    err = mq_getattr( q2, &attr );
219
    CYG_TEST_PASS_FAIL( 0 == err, "mq_getattr after O_NONBLOCK" );
220
    CYG_TEST_PASS_FAIL( (4 == attr.mq_maxmsg) &&
221
                        (20 == attr.mq_msgsize) &&
222
                        (O_NONBLOCK == (attr.mq_flags & O_NONBLOCK)) &&
223
                        (O_RDONLY == (attr.mq_flags & O_RDONLY)) &&
224
                        (O_WRONLY != (attr.mq_flags & O_WRONLY)) &&
225
                        (O_RDWR != (attr.mq_flags & O_RDWR)) &&
226
                        (0 == attr.mq_curmsgs ),
227
                        "new attribute correct" );
228
 
229
    recvlen = mq_receive( q2, buf, sizeof(buf), &prio );
230
    CYG_TEST_PASS_FAIL( recvlen == (ssize_t)-1,
231
                        "mq_receive, empty buffer, non-blocking" );
232
    CYG_TEST_PASS_FAIL( EAGAIN == errno,
233
                        "errno correct for non-blocking" );
234
 
235
    err = mq_send( q2, "foo", sizeof("foo"), 1 );
236
    CYG_TEST_PASS_FAIL( -1 == err, "error on mq_send on read-only descriptor" );
237
    CYG_TEST_PASS_FAIL( EBADF == errno,
238
                        "errno correct for mq_send on r/o descriptor" );
239
 
240
    err = mq_send( q2, "supercalifragilisticexpealidocious", 21, 2 );
241
    CYG_TEST_PASS_FAIL( -1 == err, "error on mq_send (message too long)" );
242
    CYG_TEST_PASS_FAIL( EMSGSIZE == errno,
243
                        "errno correct for mq_send (message too long)" );
244
 
245
    err = mq_send( q1, "", sizeof(""), 5 );
246
    CYG_TEST_PASS_FAIL( 0 == err, "mq_send \"\"" );
247
 
248
    err = mq_send( q1, "I love Vik", sizeof("I love Vik"), 7 );
249
    CYG_TEST_PASS_FAIL( 0 == err, "mq_send (different priority)" );
250
 
251
    err = mq_send( q1, "a lot!", sizeof("a lot!"), 7 );
252
    CYG_TEST_PASS_FAIL( 0 == err, "mq_send (same priority)" );
253
 
254
    err = mq_send( q1, "Vik is a babe", sizeof("Vik is a babe"), 6 );
255
    CYG_TEST_PASS_FAIL( 0 == err, "mq_send (middle priority)" );
256
 
257
    err = mq_send( q1, "wibble", sizeof("wibble"), 6 );
258
    CYG_TEST_PASS_FAIL( -1 == err, "error on mq_send with full queue" );
259
    CYG_TEST_PASS_FAIL( EAGAIN == errno,
260
                        "errno correct for mq_send full queue" );
261
 
262
    err = mq_getattr( q2, &attr );
263
    CYG_TEST_PASS_FAIL( 0 == err, "mq_getattr after sends" );
264
    CYG_TEST_PASS_FAIL( (4 == attr.mq_maxmsg) &&
265
                        (20 == attr.mq_msgsize) &&
266
                        (O_NONBLOCK == (attr.mq_flags & O_NONBLOCK)) &&
267
                        (O_RDONLY == (attr.mq_flags & O_RDONLY)) &&
268
                        (O_WRONLY != (attr.mq_flags & O_WRONLY)) &&
269
                        (O_RDWR != (attr.mq_flags & O_RDWR)) &&
270
                        (4 == attr.mq_curmsgs ),
271
                        "getattr attributes correct #5" );
272
 
273
    recvlen = mq_receive( q2, buf, sizeof(buf), &prio );
274
    CYG_TEST_PASS_FAIL( recvlen == sizeof("I love Vik"),
275
                        "receive message length (prioritized) #1" );
276
    CYG_TEST_PASS_FAIL( 0 == my_memcmp( buf, "I love Vik",
277
                                        sizeof("I love Vik")),
278
                        "received message data intact (prioritized) #1" );
279
    CYG_TEST_PASS_FAIL( 7 == prio,
280
                        "received at correct priority (prioritized) #1" );
281
 
282
    recvlen = mq_receive( q2, buf, sizeof(buf), &prio );
283
    CYG_TEST_PASS_FAIL( recvlen == sizeof("a lot!"),
284
                        "receive message length (prioritized) #2" );
285
    CYG_TEST_PASS_FAIL( 0 == my_memcmp( buf, "a lot!",
286
                                        sizeof("a lot!")),
287
                        "received message data intact (prioritized) #2" );
288
    CYG_TEST_PASS_FAIL( 7 == prio,
289
                        "received at correct priority (prioritized) #2" );
290
 
291
    recvlen = mq_receive( q2, buf, sizeof(buf), &prio );
292
    CYG_TEST_PASS_FAIL( recvlen == sizeof("Vik is a babe"),
293
                        "receive message length (prioritized) #3" );
294
    CYG_TEST_PASS_FAIL( 0 == my_memcmp( buf, "Vik is a babe",
295
                                        sizeof("Vik is a babe")),
296
                        "received message data intact (prioritized) #3" );
297
    CYG_TEST_PASS_FAIL( 6 == prio,
298
                        "received at correct priority (prioritized) #3" );
299
 
300
    recvlen = mq_receive( q2, buf, 0, &prio );
301
    CYG_TEST_PASS_FAIL( recvlen == (ssize_t)-1,
302
                        "mq_receive, zero-sized buffer" );
303
 
304
    recvlen = mq_receive( q2, buf, sizeof(buf), &prio );
305
    CYG_TEST_PASS_FAIL( recvlen == sizeof(""),
306
                        "receive message length (prioritized) #4" );
307
    CYG_TEST_PASS_FAIL( 0 == my_memcmp( buf, "",
308
                                        sizeof("")),
309
                        "received message data intact (prioritized) #4" );
310
    CYG_TEST_PASS_FAIL( 5 == prio,
311
                        "received at correct priority (prioritzed) #4" );
312
 
313
    recvlen = mq_receive( q2, buf, sizeof(buf), &prio );
314
    CYG_TEST_PASS_FAIL( recvlen == (ssize_t)-1,
315
                        "mq_receive, empty buffer, non-blocking #2" );
316
    CYG_TEST_PASS_FAIL( EAGAIN == errno,
317
                        "errno correct for non-blocking #2" );
318
 
319
    err = mq_send( q1, "12345678901234567890", 20, 15 );
320
    CYG_TEST_PASS_FAIL( 0 == err, "mq_send (before closing)" );
321
 
322
    err = mq_unlink( "/foo" );
323
    CYG_TEST_PASS_FAIL( -1 == err, "mq_unlink (wrong name)" );
324
    CYG_TEST_PASS_FAIL( ENOENT == errno,
325
                        "errno correct for mq_unlink (wrong name)" );
326
 
327
    err = mq_unlink( "/mq1" );
328
    CYG_TEST_PASS_FAIL( 0 == err, "mq_unlink (before closing)" );
329
 
330
    err = mq_close( q1 );
331
    CYG_TEST_PASS_FAIL( 0 == err, "mq_close (send descriptor)" );
332
 
333
    recvlen = mq_receive( q2, buf, sizeof(buf), &prio );
334
    CYG_TEST_PASS_FAIL( recvlen == 20,
335
                        "receive message length (mid close)" );
336
    CYG_TEST_PASS_FAIL( 0 == my_memcmp( buf, "12345678901234567890", 20 ),
337
                        "received message data intact (mid close)" );
338
    CYG_TEST_PASS_FAIL( 15 == prio,
339
                        "received at correct priority (mid close)" );
340
 
341
    err = mq_close( q2 );
342
    CYG_TEST_PASS_FAIL( 0 == err, "mq_close (receive descriptor)" );
343
 
344
    q1 = mq_open( "/mq1", O_RDONLY );
345
    CYG_TEST_PASS_FAIL( q1 == (mqd_t)-1, "error for non-existent queue" );
346
    CYG_TEST_PASS_FAIL( ENOENT == errno,
347
                        "errno correct for non-existent queue" );
348
 
349
    CYG_TEST_EXIT("POSIX message test 1");
350
 
351
    return 0;
352
} // main()
353
 
354
//------------------------------------------------------------------------
355
 
356
#endif
357
 
358
/* EOF pmqueue1.c */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.