summaryrefslogtreecommitdiffstats
path: root/testsuites/psxtests
diff options
context:
space:
mode:
authorJennifer Averett <Jennifer.Averett@OARcorp.com>1999-12-23 22:12:15 +0000
committerJennifer Averett <Jennifer.Averett@OARcorp.com>1999-12-23 22:12:15 +0000
commit6eb3e68012ca2eba5115097c4073d9c15ac122d9 (patch)
tree54cbcbdb03bafdabd9d135359cb377bab5ad0cc2 /testsuites/psxtests
parent+ Added routine to remove from namespace. (diff)
downloadrtems-6eb3e68012ca2eba5115097c4073d9c15ac122d9.tar.bz2
+ Tests added for mq_open, mq_close, and mq_unlink
Diffstat (limited to 'testsuites/psxtests')
-rw-r--r--testsuites/psxtests/psxmsgq01/init.c269
-rw-r--r--testsuites/psxtests/psxmsgq01/system.h13
2 files changed, 219 insertions, 63 deletions
diff --git a/testsuites/psxtests/psxmsgq01/init.c b/testsuites/psxtests/psxmsgq01/init.c
index bd678cb73f..6306ca2f76 100644
--- a/testsuites/psxtests/psxmsgq01/init.c
+++ b/testsuites/psxtests/psxmsgq01/init.c
@@ -12,111 +12,257 @@
#define CONFIGURE_INIT
#include "system.h"
#include <sched.h>
+#include <fcntl.h>
+#include <time.h>
+#include <tmacros.h>
-void *POSIX_Init(
- void *argument
+char Queue_Name[PATH_MAX + 2];
+char *Get_Queue_Name(
+ int i
+)
+{
+ sprintf(Queue_Name,"mq%d",i+1);
+ return Queue_Name;
+}
+
+char *Get_Too_Long_Name()
+{
+ int i;
+
+ for ( i=0; i< PATH_MAX+1; i++ )
+ Queue_Name[i] = 'N';
+ Queue_Name[i] = '\0';
+ return Queue_Name;
+}
+
+/*
+ * Opens CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES then leaves size queues
+ * opened but closes the rest.
+ */
+
+void validate_mq_open_error_codes(
+ mqd_t *mqs, /* Must be large enough for Maximum to be opened. */
+ int size
)
{
- int status;
- int value;
int i;
- mqd_t mqs[CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES];
- mqd_t mq2;
- mqd_t *n_mq1;
- mqd_t *n_mq2;
- struct timespec waittime;
- char failure_msg[80];
+ mqd_t n_mq2;
+ struct mq_attr attr;
+ int status;
+ assert( size < (CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES-1) );
+
+ /*
+ * Validate mq_open errors that can occur when no queues are open.
+ * EINVAL
+ * ENOENT
+ * EINTR
+ */
+
+ /*
+ * XXX EINVAL - inappropriate name was given for the message queue
+ */
+
+ attr.mq_maxmsg = -1;
+ puts( "mq_open - Create with maxmsg (-1) (EINVAL)" );
+ n_mq2 = mq_open("mq2", O_CREAT, O_RDONLY, &attr);
+ fatal_directive_status(
+ (int) n_mq2, (int ) (-1), "mq_open error return status" );
+ fatal_directive_status( errno, EINVAL, "mq_open errno EINVAL");
+
+ attr.mq_msgsize = -1;
+ puts( "mq_open - Create with msgsize (-1) (EINVAL)" );
+ n_mq2 = mq_open("mq2", O_CREAT, O_RDONLY, &attr);
+ fatal_directive_status(
+ (int) n_mq2, (int ) (-1), "mq_open error return status" );
+ fatal_directive_status( errno, EINVAL, "mq_open errno EINVAL");
- puts( "\n\n*** POSIX MESSAGE QUEUE TEST ***" );
-#if 0
- /* Modes are currently unsupported */
+ puts( "mq_open - Open new mq without create flag (ENOENT)" );
+ n_mq2 = mq_open("mq3", O_EXCL, O_RDONLY, NULL);
+ fatal_directive_status(
+ (int) n_mq2, (int ) (-1), "mq_open error return status" );
+ fatal_directive_status( errno, ENOENT, "mq_open errno ENOENT");
+
+ /*
+ * XXX EINTR - call was interrupted by a signal
+ */
+
+ /*
+ * XXX ENAMETOOLONG - Not checked in either sem_open or mq_open is
+ * this an error?
+ */
+
+ puts( "mq_open - Open with too long of a name (ENAMETOOLONG)" );
+ n_mq2 = mq_open( Get_Too_Long_Name(), O_CREAT, O_RDONLY, NULL );
+ fatal_directive_status(
+ (int) n_mq2, (int ) (-1), "mq_open error return status" );
+ fatal_directive_status( errno, ENAMETOOLONG, "mq_open errno ENAMETOOLONG");
+
+ /*
+ * Open maximum number of message queues
+ */
+
+ puts( "mq_open - SUCCESSFUL" );
+ for (i = 0; i < CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES; i++) {
+ mqs[i] = mq_open( Get_Queue_Name(i), O_CREAT, O_RDONLY, NULL );
+ assert( mqs[i] != (-1) );
+ /*XXX - Isn't there a more general check */
+ }
+
+ /*
+ * Validate open errors that must occur after message queues are open.
+ * EACCES
+ * EEXIST
+ * EMFILE
+ * ENFILE
+ */
/*
- * Validate all mq_open return paths.
+ * XXX EACCES - permission to create is denied.
*/
- puts( "Init: mq_open - mq1 SUCCESSFUL" );
- n_mq1 = mq_open( "mq1", O_CREAT, 00777, 1 );
- assert( n_mq1 != SEM_FAILED );
+ /*
+ * XXX EACCES - queue exists permissions specified by o_flag are denied.
+ puts( "mq_open - open mq as write (EACCES)" );
+ n_mq2 = mq_open("mq1", O_CREAT, O_WRONLY, NULL);
+ fatal_directive_status(
+ (int) n_mq2, (int ) (-1), "mq_open error return status" );
+ fatal_directive_status( errno, EACCES, "mq_open errno EACCES");
+ */
- puts( "Init: mq_open - Create an Existing mq (EEXIST)" );
- n_mq2 = mq_open("mq1", O_CREAT | O_EXCL, 00777, 1);
+ puts( "mq_open - Create an Existing mq (EEXIST)" );
+ n_mq2 = mq_open("mq1", O_CREAT | O_EXCL, O_RDONLY, NULL);
fatal_directive_status(
- (int) n_mq2, (int ) SEM_FAILED, "mq_open error return status" );
+ (int) n_mq2, (int ) (-1), "mq_open error return status" );
fatal_directive_status( errno, EEXIST, "mq_open errno EEXIST");
- puts( "Init: mq_open - Open new mq without create flag (ENOENT)" );
- n_mq2 = mq_open("mq3", O_EXCL, 00777, 1);
+
+ /*
+ * XXX EMFILE - Too many message queues open
+ */
+
+ puts( "mq_open - system is out of resources (ENFILE)" );
+ n_mq2 = mq_open( Get_Queue_Name(i), O_CREAT, O_RDONLY, NULL );
fatal_directive_status(
- (int) n_mq2, (int ) SEM_FAILED, "mq_open error return status" );
- fatal_directive_status( errno, ENOENT, "mq_open errno EEXIST");
+ (int) n_mq2, (int ) (-1), "mq_open error return status" );
+ fatal_directive_status( errno, ENFILE, "mq_open errno ENFILE");
/*
- * XXX - Could not hit the following errors:
- * E_POSIX_Semaphore_Create_support only fails if
- * ENOSYS - When semaphore is shared between processes.
- * ENOSPC - When out of memory.
+ * Unlink and Close .
*/
+ puts( "mq_close and mq_unlink (mq3...mqn) - SUCCESSFUL" );
+ for (i = size; i < CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES; i++) {
+
+ status = mq_close( mqs[i] );
+ fatal_directive_status( status, 0, "mq_close message queue");
+
+ status = mq_unlink( Get_Queue_Name(i) );
+ fatal_directive_status( status, 0, "mq_unlink message queue");
+ }
+}
+
+void validate_mq_unlink_error_codes(
+ mqd_t *mqs, /* Must be large enough for Maximum to be opened. */
+ int size /* Number still open */
+)
+{
+ int status;
+
/*
- * Validate we can wait on a message queue opened with mq_open.
+ * XXX - EACCES Permission Denied
*/
- puts( "Init: mq_wait on mq1" );
- status = mq_receive(n_mq1);
- fatal_directive_status( status, 0, "mq_wait opened message queue");
+ /*
+ * XXX ENAMETOOLONG - Not checked in either sem_unlink or mq_unlink is
+ * this an error?
+ for ( i=0; i< PATH_MAX+1; i++ )
+ name[i] = 'N';
+ puts( "mq_open - Open with too long of a name (ENAMETOOLONG)" );
+ n_mq2 = mq_open( Get_Too_Long_Name(), O_CREAT, O_RDONLY, NULL );
+ fatal_directive_status(
+ (int) n_mq2, (int ) (-1), "mq_open error return status" );
+ fatal_directive_status( errno, ENAMETOOLONG, "mq_open errno ENAMETOOLONG");
+ */
+
+ puts( "mq_unlink - UNSUCCESSFUL (ENOENT)" );
+ status = mq_unlink(Get_Queue_Name(size));
+ fatal_directive_status( status, -1, "mq_unlink error return status");
+ fatal_directive_status( errno, ENOENT, "mq_unlink errno ENOENT");
+}
+
+void validate_mq_close_error_codes(
+ mqd_t *mqs, /* Must be large enough for Maximum to be opened. */
+ int size /* Number still open */
+)
+{
+ int status;
+
+ puts( "mq_close - UNSUCCESSFUL (EBADF)" );
+ status = mq_close(mqs[size]);
+ fatal_directive_status( status, -1, "mq_close error return status");
+ fatal_directive_status( errno, EBADF, "mq_close errno EBADF");
+
+}
+
+void *POSIX_Init(
+ void *argument
+)
+{
+ int status;
+ int value;
+ int i;
+ mqd_t mqs[CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES];
+ mqd_t mq2;
+ mqd_t n_mq1;
+ mqd_t n_mq2;
+ struct timespec waittime;
+ char failure_msg[80];
+ struct mq_attr attr;
+
+ puts( "\n\n*** POSIX MESSAGE QUEUE TEST ***" );
+
+ validate_mq_open_error_codes( mqs, 2 );
+ validate_mq_unlink_error_codes( mqs, 2 );
+ validate_mq_close_error_codes( mqs, 2 );
/*
* Validate a second open returns the same message queue.
*/
- puts( "Init: mq_open - Open an existing mq ( same id )" );
+ puts( "mq_open - Open an existing mq ( same id )" );
n_mq2 = mq_open("mq1", 0 );
fatal_directive_status(
- (int) n_mq2, (int ) n_mq1, "mq_open error return status" );
+ (int) n_mq2, (int ) mqs[0], "mq_open error return status" );
/*
* Unlink the message queue, then verify an open of the same name produces a
* different message queue.
*/
- puts( "Init: mq_unlink - mq1 SUCCESSFUL" );
+ puts( "mq_unlink - mq1 SUCCESSFUL" );
status = mq_unlink( "mq1" );
fatal_directive_status( status, 0, "mq_unlink locked message queue");
- puts( "Init: mq_open - Reopen mq1 SUCCESSFUL with a different id" );
- n_mq2 = mq_open( "mq1", O_CREAT | O_EXCL, 00777, 1);
- assert( n_mq2 != SEM_FAILED );
+ puts( "mq_open - Reopen mq1 SUCCESSFUL with a different id" );
+ n_mq2 = mq_open( "mq1", O_CREAT | O_EXCL, 00777, NULL);
+ assert( n_mq2 != (-1) );
assert( n_mq2 != n_mq1 );
/*
- * Validate we can call close on a message queue opened with mq_open.
- */
-
- puts( "Init: mq_close (1) - SUCCESSFUL" );
- status = mq_close( n_mq1 );
- fatal_directive_status( status, 0, "mq_close message queue");
-
-
- /*
* Validate it n_mq2 (the last open for mq1 name can be
* correctly closed and unlinked.
*/
- puts( "Init: mq_close (2) - SUCCESSFUL" );
- status = mq_close( n_mq2 );
- fatal_directive_status( status, 0, "mq_close message queue");
-
puts( "Init: mq_unlink - mq1 (2) SUCCESSFUL" );
status = mq_unlink( "mq1" );
fatal_directive_status( status, 0, "mq_unlink locked message queue");
- puts( "Init: mq_close - UNSUCCESSFUL (EINVAL)" );
- status = mq_close(n_mq2);
- fatal_directive_status( status, -1, "mq_close error return status");
- fatal_directive_status( errno, EINVAL, "mq_close errno EINVAL");
+ puts( "Init: mq_close (2) - SUCCESSFUL" );
+ status = mq_close( n_mq2 );
+ fatal_directive_status( status, 0, "mq_close message queue");
+
puts( "Init: mq_unlink - UNSUCCESSFUL (ENOENT)" );
status = mq_unlink("mq1");
@@ -144,12 +290,23 @@ void *POSIX_Init(
*/
puts( "Init: mq_unlink - UNSUCCESSFUL (ENOENT)" );
- status = mq_unlink("mq2");
+ status = mq_unlink("mq3");
fatal_directive_status( status, -1, "mq_unlink error return status");
fatal_directive_status( errno, ENOENT, "mq_unlink errno ENOENT");
assert( (status == -1) && (errno == ENOENT) );
+
+
+ /*
+ * Validate we can wait on a message queue opened with mq_open.
+ */
+#if (0) /* XXX FIX ME */
+ puts( "Init: mq_wait on mq1" );
+ status = mq_receive(n_mq1);
+ fatal_directive_status( status, 0, "mq_wait opened message queue");
#endif
+
+
puts( "*** END OF POSIX MESSAGE QUEUE TEST ***" );
exit( 0 );
diff --git a/testsuites/psxtests/psxmsgq01/system.h b/testsuites/psxtests/psxmsgq01/system.h
index e41fceb2af..c5d04b5aa2 100644
--- a/testsuites/psxtests/psxmsgq01/system.h
+++ b/testsuites/psxtests/psxmsgq01/system.h
@@ -38,18 +38,17 @@ void *Task_1_through_3(
#define CONFIGURE_POSIX_INIT_THREAD_TABLE
-#define CONFIGURE_MAXIMUM_POSIX_THREADS 2
+#define CONFIGURE_MAXIMUM_POSIX_THREADS 2
+#define CONFIGURE_MAXIMUM_POSIX_MESSAGE_QUEUES 10
+
+#define CONFIGURE_POSIX_INIT_THREAD_TABLE
+#define CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE \
+ (RTEMS_MINIMUM_STACK_SIZE * 4)
#include <confdefs.h>
/* global variables */
-#ifdef CONFIGURE_INIT
-#define TEST_EXTERN
-#else
-#define TEST_EXTERN extern
-#endif
-
TEST_EXTERN pthread_t Init_id;
TEST_EXTERN pthread_t Task_id;