summaryrefslogtreecommitdiffstats
path: root/testsuites/sptests/spfifo05
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2010-07-05 20:14:19 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2010-07-05 20:14:19 +0000
commit9cdd944dce8b26ff3eb1d0ed1965a242f6fcf628 (patch)
tree3981ce23df1a293faf403b92ff9370ea8ce787bc /testsuites/sptests/spfifo05
parent2010-07-04 Joel Sherrill <joel.sherrill@oarcorp.com> (diff)
downloadrtems-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/.cvsignore2
-rw-r--r--testsuites/sptests/spfifo05/Makefile.am24
-rw-r--r--testsuites/sptests/spfifo05/init.c275
-rw-r--r--testsuites/sptests/spfifo05/spfifo05.doc23
-rw-r--r--testsuites/sptests/spfifo05/spfifo05.scn36
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 ***
+