diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2010-07-05 20:14:19 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2010-07-05 20:14:19 +0000 |
commit | 9cdd944dce8b26ff3eb1d0ed1965a242f6fcf628 (patch) | |
tree | 3981ce23df1a293faf403b92ff9370ea8ce787bc /testsuites/sptests/spfifo05 | |
parent | 2010-07-04 Joel Sherrill <joel.sherrill@oarcorp.com> (diff) | |
download | rtems-9cdd944dce8b26ff3eb1d0ed1965a242f6fcf628.tar.bz2 |
2010-07-05 Bharath Suri <bharath.s.jois@gmail.com>
PR 1600/testing
* spfifo05/init.c, spfifo05/spfifo05.doc, spfifo05/spfifo05.scn,
spfifo05/Makefile.am: New tests for pipe/fifo routines.
* Makefile.am, configure.ac: Add new test.
Diffstat (limited to 'testsuites/sptests/spfifo05')
-rw-r--r-- | testsuites/sptests/spfifo05/.cvsignore | 2 | ||||
-rw-r--r-- | testsuites/sptests/spfifo05/Makefile.am | 24 | ||||
-rw-r--r-- | testsuites/sptests/spfifo05/init.c | 275 | ||||
-rw-r--r-- | testsuites/sptests/spfifo05/spfifo05.doc | 23 | ||||
-rw-r--r-- | testsuites/sptests/spfifo05/spfifo05.scn | 36 |
5 files changed, 360 insertions, 0 deletions
diff --git a/testsuites/sptests/spfifo05/.cvsignore b/testsuites/sptests/spfifo05/.cvsignore new file mode 100644 index 0000000000..282522db03 --- /dev/null +++ b/testsuites/sptests/spfifo05/.cvsignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/testsuites/sptests/spfifo05/Makefile.am b/testsuites/sptests/spfifo05/Makefile.am new file mode 100644 index 0000000000..ba11bed1b3 --- /dev/null +++ b/testsuites/sptests/spfifo05/Makefile.am @@ -0,0 +1,24 @@ +## +## $Id$ +## + +rtems_tests_PROGRAMS = spfifo05 +spfifo05_SOURCES = init.c + +dist_rtems_tests_DATA = spfifo05.scn +dist_rtems_tests_DATA += spfifo05.doc + +include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg +include $(top_srcdir)/../automake/compile.am +include $(top_srcdir)/../automake/leaf.am + +AM_CPPFLAGS += -I$(top_srcdir)/../support/include + +LINK_OBJS = $(spfifo05_OBJECTS) $(spfifo05_LDADD) +LINK_LIBS = $(spfifo05_LDLIBS) + +spfifo05$(EXEEXT): $(spfifo05_OBJECTS) $(spfifo05_DEPENDENCIES) + @rm -f spfifo05$(EXEEXT) + $(make-exe) + +include $(top_srcdir)/../automake/local.am diff --git a/testsuites/sptests/spfifo05/init.c b/testsuites/sptests/spfifo05/init.c new file mode 100644 index 0000000000..8c2b9f8649 --- /dev/null +++ b/testsuites/sptests/spfifo05/init.c @@ -0,0 +1,275 @@ +/* + * COPYRIGHT (c) 1989-2010. + * On-Line Applications Research Corporation (OAR). + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.com/license/LICENSE. + * + * $Id$ + */ + +/* Includes */ +#include <bsp.h> +#include <tmacros.h> +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> +#include <limits.h> + +#include <rtems.h> +#include <rtems/libio.h> + +#define SEND_RCV_BUFSIZ (PIPE_BUF+20) + +rtems_id rBarrier; +rtems_id wBarrier; + +char recvBuf[SEND_RCV_BUFSIZ] = {0}; +char sendBuf[SEND_RCV_BUFSIZ] = {0}; + +rtems_task read_task( rtems_task_argument not_used ) +{ + int fd = 0; + int status = -1; + uint32_t released = 0; + + puts( "read_task - opening /fifo in non-blocking mode" ); + + fd = open( "/fifo", O_RDONLY | O_NONBLOCK ); + if( fd <= 0 ) { + printf( "Error opening file: (%d) :: %s\n", errno, strerror( errno ) ); + rtems_test_assert( 0 ); + } + + puts( "read_task - attempt to read with number of writers = 0" ); + status = read( fd, recvBuf, SEND_RCV_BUFSIZ ); + rtems_test_assert( status == 0 ); + + puts( "read_task - releasing the write task" ); + status = rtems_barrier_release( wBarrier, &released ); + rtems_test_assert( status == 0 ); + + puts( "read_task - waiting at a barrier" ); + status = rtems_barrier_wait( rBarrier, RTEMS_NO_TIMEOUT ); + rtems_test_assert( status == RTEMS_SUCCESSFUL ); + + puts( "read_task - attempting to read from the fifo -- Expect EAGAIN" ); + status = read( fd, recvBuf, SEND_RCV_BUFSIZ ); + rtems_test_assert( status == -1 ); + rtems_test_assert( errno == EAGAIN ); + + puts( "read_task - closing /fifo" ); + status = close( fd ); + rtems_test_assert( status == 0 ); + + puts("read_task - opening /fifo in read-only mode"); + fd = open( "/fifo", O_RDONLY ); + if( fd <= 0 ) { + printf( "Error opening file: (%d) :: %s\n", errno, strerror( errno ) ); + rtems_test_assert( 0 ); + } + + puts( "read_task - releasing the write task" ); + status = rtems_barrier_release( wBarrier, &released ); + rtems_test_assert( status == 0 ); + + puts( "read_task - reading from /fifo - OK" ); + status = read( fd, recvBuf, 10 ); + rtems_test_assert( status == 10 ); + + puts( "read_task - reading from /fifo - OK" ); + status = read( fd, recvBuf+10, 10 ); + rtems_test_assert( status == 10 ); + + puts( "read_task - waiting at a barrier" ); + status = rtems_barrier_wait( rBarrier, RTEMS_NO_TIMEOUT ); + rtems_test_assert( status == RTEMS_SUCCESSFUL ); + + puts( "read_task - reading from /fifo - OK" ); + status = read( fd, recvBuf+20, SEND_RCV_BUFSIZ - 20 ); + rtems_test_assert( status == SEND_RCV_BUFSIZ - 20 ); + + if( strcmp( sendBuf, recvBuf ) ) { + puts( "Sent, received buffer do not match" ); + rtems_test_assert( 0 ); + } + + puts( "read_task - releasing the write task" ); + status = rtems_barrier_release( wBarrier, &released ); + rtems_test_assert( status == 0 ); + + puts( "read_task - waiting at a barrier" ); + status = rtems_barrier_wait( rBarrier, RTEMS_NO_TIMEOUT ); + rtems_test_assert( status == RTEMS_SUCCESSFUL ); + + status = close( fd ); + rtems_test_assert( status == 0 ); + + puts( "read_task - releasing the write task" ); + status = rtems_barrier_release( wBarrier, &released ); + rtems_test_assert( status == 0 ); + + rtems_task_delete( RTEMS_SELF ); +} + + + +rtems_task Init( + rtems_task_argument not_used +) +{ + rtems_id readTaskID; + + rtems_name readTaskName; + + int status = -1; + int fd = 0; + uint32_t released = 0; + int flag = 1; + + puts("\n*** FIFO / PIPE TESTS - 5 ***"); + + memset( sendBuf, '1', SEND_RCV_BUFSIZ - 30 ); + memset( sendBuf, '2', 29 ); + sendBuf[SEND_RCV_BUFSIZ-1] = 0; + + memset( &rBarrier, 0, sizeof(rBarrier) ); + status = rtems_barrier_create ( + rtems_build_name ( 'B', 'A', 'R', 'r' ), + RTEMS_BARRIER_MANUAL_RELEASE, + 2, + &rBarrier + ); + + rtems_test_assert( status == RTEMS_SUCCESSFUL ); + + memset( &wBarrier, 0, sizeof( wBarrier ) ); + status = rtems_barrier_create ( + rtems_build_name ( 'B', 'A', 'R', 'w' ), + RTEMS_BARRIER_MANUAL_RELEASE, + 2, + &wBarrier + ); + rtems_test_assert( status == RTEMS_SUCCESSFUL ); + + readTaskName = rtems_build_name( 'T','A','r',' ' ); + status = rtems_task_create( + readTaskName, + 1, + RTEMS_MINIMUM_STACK_SIZE * 2, + RTEMS_INTERRUPT_LEVEL(31), + RTEMS_DEFAULT_ATTRIBUTES, + &readTaskID + ); + + rtems_test_assert( status == RTEMS_SUCCESSFUL ); + + puts( "Init - Creating fifo file /fifo" ); + status = mkfifo( "/fifo", 0777 ); + rtems_test_assert( status == 0 ); + + puts( "Init - starting the read task" ); + status = rtems_task_start( readTaskID, read_task, 0 ); + rtems_test_assert( status == 0 ); + + puts( "Init - waiting at a barrier" ); + status = rtems_barrier_wait( wBarrier, RTEMS_NO_TIMEOUT ); + rtems_test_assert( status == RTEMS_SUCCESSFUL ); + + puts("Init - opening the fifo in write only mode -- OK"); + fd = open("/fifo", O_WRONLY); + if(fd <= 0) { + printf("Error opening file: (%d) :: %s\n", errno, strerror(errno)); + rtems_test_assert(0); + } + + puts( "Init - writing to /fifo" ); + status = write(fd, sendBuf, 0 ); + rtems_test_assert( status == 0 ); + + puts( "Init - releasing the read_task" ); + status = rtems_barrier_release( rBarrier, &released ); + rtems_test_assert( status == 0 ); + + puts( "Init - waiting at a barrier" ); + status = rtems_barrier_wait( wBarrier, RTEMS_NO_TIMEOUT ); + rtems_test_assert( status == RTEMS_SUCCESSFUL ); + + puts( "Init - writing to /fifo - OK" ); + status = write(fd, sendBuf, SEND_RCV_BUFSIZ - 30 ); + rtems_test_assert( status == SEND_RCV_BUFSIZ - 30 ); + + puts( "Init - writing to /fifo - OK" ); + status = write(fd, sendBuf+SEND_RCV_BUFSIZ - 30, 30 ); + rtems_test_assert( status == 30 ); + + puts( "Init - releasing the read_task" ); + status = rtems_barrier_release( rBarrier, &released ); + rtems_test_assert( status == 0 ); + + puts( "Init - waiting at a barrier" ); + status = rtems_barrier_wait( wBarrier, RTEMS_NO_TIMEOUT ); + rtems_test_assert( status == RTEMS_SUCCESSFUL ); + + puts( "Init - converting the write-mode to non-block" ); + status = ioctl( fd, FIONBIO, &flag ); + rtems_test_assert( status == 0 ); + + puts( "Init - writing to /fifo - OK" ); + status = write(fd, sendBuf, SEND_RCV_BUFSIZ - 30 ); + rtems_test_assert( status == SEND_RCV_BUFSIZ - 30 ); + + puts( "Init - writing to /fifo - Expect EAGAIN" ); + status = write(fd, sendBuf, SEND_RCV_BUFSIZ - 30 ); + rtems_test_assert( status == -1 ); + rtems_test_assert( errno == EAGAIN ); + + puts( "Init - releasing the read_task" ); + status = rtems_barrier_release( rBarrier, &released ); + rtems_test_assert( status == 0 ); + + puts( "Init - waiting at a barrier" ); + status = rtems_barrier_wait( wBarrier, RTEMS_NO_TIMEOUT ); + rtems_test_assert( status == RTEMS_SUCCESSFUL ); + + puts( "Init - writing to /fifo - Expect EPIPE" ); + status = write(fd, sendBuf, SEND_RCV_BUFSIZ - 30 ); + rtems_test_assert( status == -1 ); + rtems_test_assert( errno == EPIPE ); + + status = close( fd ); + rtems_test_assert( status == 0 ); + + puts( "Removing the fifo" ); + status = unlink("/fifo"); + rtems_test_assert(status == 0); + + puts("*** END OF FIFO / PIPE OPEN TEST - 6 ***"); + rtems_test_exit(0); +} + +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER + +#define CONFIGURE_USE_IMFS_AS_BASE_FILESYSTEM +#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 6 + +#define CONFIGURE_MAXIMUM_TASKS 3 + +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE + +#define CONFIGURE_MAXIMUM_BARRIERS 2 + +#define CONFIGURE_INIT +#define CONFIGURE_FIFOS_ENABLED +#define CONFIGURE_MAXIMUM_FIFOS 1 + + +#define CONFIGURE_INIT +#include <rtems/confdefs.h> + +/* end of file */ diff --git a/testsuites/sptests/spfifo05/spfifo05.doc b/testsuites/sptests/spfifo05/spfifo05.doc new file mode 100644 index 0000000000..4c168b0af3 --- /dev/null +++ b/testsuites/sptests/spfifo05/spfifo05.doc @@ -0,0 +1,23 @@ +# +# $Id$ +# +# COPYRIGHT (c) 1989-2010. +# On-Line Applications Research Corporation (OAR). +# +# The license and distribution terms for this file may be +# found in the file LICENSE in this distribution or at +# http://www.rtems.com/license/LICENSE. +# + +This file describes the directives and concepts tested by this test set. + +directives + ++ fifo_open ++ pipe_read ++ pipe_read + +concepts + ++ Exercise pipe_read completely, including the error paths ++ Exercise pipe_write completely, including the error paths diff --git a/testsuites/sptests/spfifo05/spfifo05.scn b/testsuites/sptests/spfifo05/spfifo05.scn new file mode 100644 index 0000000000..fb3933fdd7 --- /dev/null +++ b/testsuites/sptests/spfifo05/spfifo05.scn @@ -0,0 +1,36 @@ +*** FIFO / PIPE TESTS - 5 *** +Init - Creating fifo file /fifo +Init - starting the read task +Init - waiting at a barrier +read_task - opening /fifo in non-blocking mode +read_task - attempt to read with number of writers = 0 +read_task - releasing the write task +read_task - waiting at a barrier +Init - opening the fifo in write only mode -- OK +Init - writing to /fifo +Init - releasing the read_task +Init - waiting at a barrier +read_task - attempting to read from the fifo -- Expect EAGAIN +read_task - closing /fifo +read_task - opening /fifo in read-only mode +read_task - releasing the write task +read_task - reading from /fifo - OKInit - writing to /fifo - OK + +Init - writing to /fifo - OK +read_task - reading from /fifo - OK +read_task - waiting at a barrierInit - releasing the read_task + +Init - waiting at a barrier +read_task - reading from /fifo - OK +read_task - releasing the write task +read_task - waiting at a barrier +Init - converting the write-mode to non-block +Init - writing to /fifo - OK +Init - writing to /fifo - Expect EAGAIN +Init - releasing the read_task +Init - waiting at a barrier +read_task - releasing the write task +Init - writing to /fifo - Expect EPIPE +Removing the fifo +*** END OF FIFO / PIPE OPEN TEST - 6 *** + |