diff options
Diffstat (limited to 'testsuites/psxtests/psxsem01/init.c')
-rw-r--r-- | testsuites/psxtests/psxsem01/init.c | 241 |
1 files changed, 227 insertions, 14 deletions
diff --git a/testsuites/psxtests/psxsem01/init.c b/testsuites/psxtests/psxsem01/init.c index 9ba8935292..ae0b390a7c 100644 --- a/testsuites/psxtests/psxsem01/init.c +++ b/testsuites/psxtests/psxsem01/init.c @@ -38,10 +38,8 @@ static void *sem_wait_task(void *arg) rv = sem_wait( sem ); rtems_test_assert( rv == 0 ); - errno = 0; rv = sem_wait( sem ); - rtems_test_assert( rv == -1 ); - rtems_test_assert( errno == EINVAL ); + rtems_test_assert( rv == 0 ); return NULL; } @@ -70,11 +68,69 @@ static void test_sem_wait_during_delete(void) rtems_test_assert( rv == 0 ); rtems_test_assert( val == 0 ); + errno = 0; + rv = sem_destroy( &sem ); + rtems_test_assert( rv == -1 ); + rtems_test_assert( errno == EBUSY ); + + rv = sem_post( &sem ); + rtems_test_assert( rv == 0 ); + + eno = pthread_join( th, NULL ); + rtems_test_assert( eno == 0 ); + rv = sem_destroy( &sem ); rtems_test_assert( rv == 0 ); +} + +static void test_named_sem_wait_during_delete(void) +{ + sem_t *sem; + sem_t *sem2; + int rv; + pthread_t th; + int eno; + int val; + + sem = sem_open( "sem", O_CREAT | O_EXCL, 0777, 1 ); + rtems_test_assert( sem != SEM_FAILED ); + + sem2 = sem_open( "sem", 0 ); + rtems_test_assert( sem2 != SEM_FAILED ); + rtems_test_assert( sem == sem2 ); + + eno = pthread_create( &th, NULL, sem_wait_task, sem ); + rtems_test_assert( eno == 0 ); + + rv = sem_getvalue( sem, &val ); + rtems_test_assert( rv == 0 ); + rtems_test_assert( val == 1 ); + + sched_yield(); + + rv = sem_getvalue( sem, &val ); + rtems_test_assert( rv == 0 ); + rtems_test_assert( val == 0 ); + + rv = sem_close( sem2 ); + rtems_test_assert( rv == 0 ); + + errno = 0; + rv = sem_close( sem ); + rtems_test_assert( rv == -1 ); + rtems_test_assert( errno == EBUSY ); + + rv = sem_post( sem ); + rtems_test_assert( rv == 0 ); eno = pthread_join( th, NULL ); rtems_test_assert( eno == 0 ); + + rv = sem_close( sem ); + rtems_test_assert( rv == 0 ); + + rv = sem_unlink( "sem" ); + rtems_test_assert( rv == 0 ); } static void test_sem_post_overflow(void) @@ -111,11 +167,161 @@ static void test_sem_post_overflow(void) static void test_sem_init_too_large_inital_value(void) { + sem_t sem; + sem_t *sem2; + int rv; + + errno = 0; + rv = sem_init( &sem, 0, (unsigned int) SEM_VALUE_MAX + 1 ); + rtems_test_assert( rv == -1 ); + rtems_test_assert( errno == EINVAL ); + + errno = 0; + sem2 = sem_open( + "sem", + O_CREAT | O_EXCL, + 0777, + (unsigned int) SEM_VALUE_MAX + 1 + ); + rtems_test_assert( sem2 == SEM_FAILED ); + rtems_test_assert( errno == EINVAL ); +} + +static void test_sem_null(void) +{ + int rv; + int val; + struct timespec to; + + rtems_test_assert( NULL == SEM_FAILED ); + + errno = 0; + rv = sem_init( NULL, 0, 0 ); + rtems_test_assert( rv == -1 ); + rtems_test_assert( errno == EINVAL ); + + errno = 0; + rv = sem_wait( NULL ); + rtems_test_assert( rv == -1 ); + rtems_test_assert( errno == EINVAL ); + + errno = 0; + rv = sem_post( NULL ); + rtems_test_assert( rv == -1 ); + rtems_test_assert( errno == EINVAL ); + + errno = 0; + rv = sem_wait( NULL ); + rtems_test_assert( rv == -1 ); + rtems_test_assert( errno == EINVAL ); + + errno = 0; + rv = sem_trywait( NULL ); + rtems_test_assert( rv == -1 ); + rtems_test_assert( errno == EINVAL ); + + to.tv_sec = 1; + to.tv_nsec = 1; + errno = 0; + rv = sem_timedwait( NULL, &to ); + rtems_test_assert( rv == -1 ); + rtems_test_assert( errno == EINVAL ); + + errno = 0; + rv = sem_getvalue( NULL, &val ); + rtems_test_assert( rv == -1 ); + rtems_test_assert( errno == EINVAL ); + + errno = 0; + rv = sem_destroy( NULL ); + rtems_test_assert( rv == -1 ); + rtems_test_assert( errno == EINVAL ); + + errno = 0; + rv = sem_close( NULL ); + rtems_test_assert( rv == -1 ); + rtems_test_assert( errno == EINVAL ); +} + +static void test_sem_not_initialized(void) +{ sem_t sem; + int rv; + int val; + struct timespec to; + + memset( &sem, 0xff, sizeof( sem ) ); + + errno = 0; + rv = sem_wait( &sem ); + rtems_test_assert( rv == -1 ); + rtems_test_assert( errno == EINVAL ); + + errno = 0; + rv = sem_post( &sem ); + rtems_test_assert( rv == -1 ); + rtems_test_assert( errno == EINVAL ); + + errno = 0; + rv = sem_wait( &sem ); + rtems_test_assert( rv == -1 ); + rtems_test_assert( errno == EINVAL ); + + errno = 0; + rv = sem_trywait( &sem ); + rtems_test_assert( rv == -1 ); + rtems_test_assert( errno == EINVAL ); + + to.tv_sec = 1; + to.tv_nsec = 1; + errno = 0; + rv = sem_timedwait( &sem, &to ); + rtems_test_assert( rv == -1 ); + rtems_test_assert( errno == EINVAL ); + + errno = 0; + rv = sem_getvalue( &sem, &val ); + rtems_test_assert( rv == -1 ); + rtems_test_assert( errno == EINVAL ); + + errno = 0; + rv = sem_destroy( &sem ); + rtems_test_assert( rv == -1 ); + rtems_test_assert( errno == EINVAL ); + + errno = 0; + rv = sem_close( &sem ); + rtems_test_assert( rv == -1 ); + rtems_test_assert( errno == EINVAL ); +} + +static void test_sem_invalid_copy(void) +{ + sem_t sem; + sem_t sem2; int rv; + int val; + + rv = sem_init( &sem, 0, 0 ); + rtems_test_assert( rv == 0 ); + + val = 1; + rv = sem_getvalue( &sem, &val ); + rtems_test_assert( rv == 0 ); + rtems_test_assert( val == 0 ); + + memcpy( &sem2, &sem, sizeof( sem2 ) ); errno = 0; - rv = sem_init( &sem, 0, (unsigned int) SEM_VALUE_MAX + 1 ); + rv = sem_getvalue( &sem2, &val ); + rtems_test_assert( rv == -1 ); + rtems_test_assert( errno == EINVAL ); + + rv = sem_destroy( &sem ); + rtems_test_assert( rv == 0 ); + + errno = 0; + rv = sem_getvalue( &sem, &val ); rtems_test_assert( rv == -1 ); rtems_test_assert( errno == EINVAL ); } @@ -155,10 +361,14 @@ void *POSIX_Init( sprintf(failure_msg, "sem_init %d", i ); fatal_posix_service_status( status, 0, failure_msg); } - puts( "Init: sem_init - UNSUCCESSFUL (ENOSPC)" ); + + puts( "Init: sem_init - SUCCESSFUL" ); status = sem_init(&sem2, 0, 1); - fatal_posix_service_status( status, -1, "sem_init error return status"); - fatal_posix_service_status( errno, ENOSPC, "sem_init errorno ENOSPC" ); + fatal_posix_service_status( status, 0, "sem_init"); + + puts( "Init: sem_destroy - SUCCESSFUL" ); + status = sem_destroy(&sem2); + fatal_posix_service_status( status, 0, "sem_destroy"); puts( "Init: sem_getvalue - SUCCESSFUL "); for (i = 0; i < MAX_SEMS; i++) { @@ -168,8 +378,7 @@ void *POSIX_Init( fatal_posix_service_status( value, i, "sem_getvalue correct value" ); } puts( "Init: sem_getvalue - UNSUCCESSFUL "); - sem2 = 0; - status = sem_getvalue(&sem2, &value); + status = sem_getvalue(SEM_FAILED, &value); fatal_posix_service_status( status, -1, "sem_getvalue error return status"); fatal_posix_service_status( errno, EINVAL, "sem_getvalue errno EINVAL"); @@ -178,7 +387,7 @@ void *POSIX_Init( fatal_posix_service_status( status, 0, "sem_destroy semaphore 0"); puts( "Init: sem_destroy - UNSUCCESSFUL (EINVAL)" ); - status = sem_destroy(&sem2); + status = sem_destroy(SEM_FAILED); fatal_posix_service_status( status, -1, "sem_destroy error return status"); fatal_posix_service_status( errno, EINVAL, "sem_destroy errno EINVAL"); @@ -188,7 +397,7 @@ void *POSIX_Init( /* sem[1].count = 0 */ puts( "Init: sem_wait - UNSUCCESSFUL (EINVAL)" ); - status = sem_wait(&sem2); + status = sem_wait(SEM_FAILED); fatal_posix_service_status( status, -1, "sem_wait error return status"); fatal_posix_service_status( errno, EINVAL, "sem_wait errno EINVAL"); @@ -214,7 +423,7 @@ void *POSIX_Init( /* sem[1].count = 0 */ puts( "Init: sem_trywait - UNSUCCESSFUL (EINVAL)" ); - status = sem_trywait(&sem2); + status = sem_trywait(SEM_FAILED); fatal_posix_service_status( status, -1, "sem_trywait error return status"); fatal_posix_service_status( errno, EINVAL, "sem_trywait errno EINVAL"); @@ -256,7 +465,7 @@ void *POSIX_Init( #endif puts( "Init: sem_post - UNSUCCESSFUL (EINVAL)" ); - status = sem_post(&sem2); + status = sem_post(SEM_FAILED); fatal_posix_service_status( status, -1, "sem_post error return status"); fatal_posix_service_status( errno, EINVAL, "sem_post errno EINVAL"); @@ -392,9 +601,13 @@ void *POSIX_Init( fatal_posix_service_status( errno, ENOENT, "sem_unlink errno ENOENT"); rtems_test_assert( (status == -1) && (errno == ENOENT) ); + test_named_sem_wait_during_delete(); test_sem_wait_during_delete(); test_sem_post_overflow(); test_sem_init_too_large_inital_value(); + test_sem_null(); + test_sem_not_initialized(); + test_sem_invalid_copy(); /* Try adding in unlinking before closing... (can we still open?) */ @@ -413,7 +626,7 @@ void *POSIX_Init( #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION #define CONFIGURE_MAXIMUM_POSIX_THREADS 2 -#define CONFIGURE_MAXIMUM_POSIX_SEMAPHORES MAX_SEMS +#define CONFIGURE_MAXIMUM_POSIX_SEMAPHORES 2 #define CONFIGURE_POSIX_INIT_THREAD_TABLE #define CONFIGURE_POSIX_INIT_THREAD_STACK_SIZE \ |