diff options
Diffstat (limited to 'testsuites/psxtests/psxrdwrv/test.c')
-rw-r--r-- | testsuites/psxtests/psxrdwrv/test.c | 415 |
1 files changed, 415 insertions, 0 deletions
diff --git a/testsuites/psxtests/psxrdwrv/test.c b/testsuites/psxtests/psxrdwrv/test.c new file mode 100644 index 0000000000..aa583bc61f --- /dev/null +++ b/testsuites/psxtests/psxrdwrv/test.c @@ -0,0 +1,415 @@ +/* + * Psx13 + * + * This test exercises the following routines: + * + * readv - implemented + * writev - implemented + * + * + * COPYRIGHT (c) 1989-2007. + * 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$ + */ + + +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> +#include <utime.h> +#include <string.h> +#include <inttypes.h> + +#include <stdio.h> +#include <unistd.h> +#include <sys/uio.h> + +#if defined(__rtems__) + #include <rtems.h> + #include <rtems/libio.h> + #include <pmacros.h> +#else + #define TRUE 1 + #define FALSE 0 + #include <stdlib.h> + #define rtems_test_exit(_s) exit(_s) +#endif + +#define TESTFILE "testfile1.tst" + + +/* This buffer size is assumed in the iovec initialization below */ +#define MAX_BUFFER 1000 +unsigned char PatternBuffer[MAX_BUFFER]; +unsigned char ReadBuffer[MAX_BUFFER]; + +/* + * fillPatternBuffer function + * + * Fill the test buffer. + * + * Returns: TRUE if buffer filled + * FALSE if buffer failed to fill + * + */ + +int fillPatternBuffer(void) +{ + int retval = TRUE; + int i; + + for (i=0 ; i<200 ; i++ ) PatternBuffer[i] = 'a'; + for ( ; i<400 ; i++ ) PatternBuffer[i] = 'b'; + for ( ; i<600 ; i++ ) PatternBuffer[i] = 'c'; + for ( ; i<800 ; i++ ) PatternBuffer[i] = 'd'; + for ( ; i<1000 ; i++ ) PatternBuffer[i] = 'e'; + return retval; +} + +/* + * doFunctionalTest function + * + * Write a file with writev and then read it back with readv. + * + * Returns: TRUE if all operations worked as expected + * FALSE if an operation did not work as expected. + * + */ + +int doFunctionalTest(void) { + FILE *fp; + int fd; + struct iovec rdvec[4]; + struct iovec wrvec[4]; + int rc; + + + /* + * Setup the iovec + */ + wrvec[0].iov_base = &PatternBuffer[0]; + wrvec[0].iov_len = 100; + wrvec[1].iov_base = &PatternBuffer[100]; + wrvec[1].iov_len = 200; + wrvec[2].iov_base = &PatternBuffer[300]; + wrvec[2].iov_len = 300; + wrvec[3].iov_base = &PatternBuffer[600]; + wrvec[3].iov_len = 400; + + rdvec[0].iov_base = &ReadBuffer[0]; + rdvec[0].iov_len = 400; + rdvec[1].iov_base = &ReadBuffer[400]; + rdvec[1].iov_len = 300; + rdvec[2].iov_base = &ReadBuffer[700]; + rdvec[2].iov_len = 200; + rdvec[3].iov_base = &ReadBuffer[900]; + rdvec[3].iov_len = 100; + + /* + * Write the File + */ + fp = fopen(TESTFILE, "wt"); + if ( fp == NULL ) { + printf( "fopen for write: %d=%s\n", errno, strerror(errno)); + return FALSE; + } + fd = fileno(fp); + + rc = writev(fd, wrvec, 4); + if ( rc <= 0 ) { + printf( "writev: %d=%s\n", errno, strerror(errno) ); + return FALSE; + } + + fclose(fp); + + puts("File written using writev .. OK"); + + /* + * Now read it back and check it + */ + + fp = fopen(TESTFILE, "rt"); + if ( fp == NULL ) { + printf( "fopen for write: %d=%s\n", errno, strerror(errno)); + return FALSE; + } + fd = fileno(fp); + + rc = readv(fd, rdvec, 4); + if ( rc <= 0 ) { + printf( "rd: %d=%s\n", errno, strerror(errno) ); + return FALSE; + } + + if ( memcmp( PatternBuffer, ReadBuffer, MAX_BUFFER ) ) { + puts("readv .. Buffers do not match"); + return FALSE; + } + + puts("File read using readv .. OK"); + + return TRUE; +} + +/* + * doErrorTest function + * + * Hit all the error cases in readv/writev. + * + * Returns: TRUE if all operations worked as expected + * FALSE if an operation did not work as expected. + * + */ + +int doErrorTest(void) +{ + FILE *fp; + int fd; + struct iovec vec[4]; + int rc; + + /* + * Open and close the file to get a bad file descriptor + */ + fp = fopen(TESTFILE, "wt"); + if ( fp == NULL ) { + printf( "fopen for error 1: %d=%s\n", errno, strerror(errno)); + return FALSE; + } + fd = fileno(fp); + fclose(fp); + + /* writev -- bad file descriptor */ + puts("writev bad file descriptor -- EBADF"); + rc = writev(fd, vec, 4); + if ( (rc != -1) || (errno != EBADF) ) { + printf( "writev error 1: %d=%s\n", errno, strerror(errno) ); + return FALSE; + } + + /* readv -- bad file descriptor */ + puts("readv bad file descriptor -- EBADF"); + rc = read(fd, vec, 4); + if ( (rc != -1) || (errno != EBADF) ) { + printf( "readv error 1: %d=%s\n", errno, strerror(errno) ); + return FALSE; + } + + /* + * Open the file for the rest of the tests + */ + fp = fopen(TESTFILE, "wt"); + if ( fp == NULL ) { + printf( "fopen for error 2: %d=%s\n", errno, strerror(errno)); + return FALSE; + } + fd = fileno(fp); + + /* writev -- bad iovec pointer */ + puts("writev bad iovec pointer -- EINVAL"); + rc = writev(fd, NULL, 4); + if ( (rc != -1) || (errno != EINVAL) ) { + printf( "writev error 2: %d=%s\n", errno, strerror(errno) ); + fclose(fp); + return FALSE; + } + + /* readv -- bad iovec pointer */ + puts("readv bad iovec pointer -- EINVAL"); + rc = readv(fd, NULL, 4); + if ( (rc != -1) || (errno != EINVAL) ) { + printf( "readv error 2: %d=%s\n", errno, strerror(errno) ); + fclose(fp); + return FALSE; + } + + /* writev -- bad iovcnt 0 */ + puts("readv bad iovcnt of 0 -- EINVAL"); + rc = writev(fd, vec, 0); + if ( (rc != -1) || (errno != EINVAL) ) { + printf( "writev error 3: %d=%s\n", errno, strerror(errno) ); + fclose(fp); + return FALSE; + } + + /* readv -- bad iovcnt 0 */ + puts("readv bad iovcnt of 0 -- EINVAL"); + rc = readv(fd, vec, 0); + if ( (rc != -1) || (errno != EINVAL) ) { + printf( "readv error 3: %d=%s\n", errno, strerror(errno) ); + fclose(fp); + return FALSE; + } + + /* writev -- bad iovcnt negative */ + puts("writev bad iovcnt negative -- EINVAL"); + rc = writev(fd, vec, -2); + if ( (rc != -1) || (errno != EINVAL) ) { + printf( "writev error 4: %d=%s\n", errno, strerror(errno) ); + fclose(fp); + return FALSE; + } + + /* readv -- bad iovcnt negative */ + puts("readv bad iovcnt negative -- EINVAL"); + rc = readv(fd, vec, -100); + if ( (rc != -1) || (errno != EINVAL) ) { + printf( "readv error 4: %d=%s\n", errno, strerror(errno) ); + fclose(fp); + return FALSE; + } + + /* writev -- bad iov[i].iov_base */ + vec[0].iov_base = vec; + vec[0].iov_len = 100; + vec[1].iov_base = NULL; + vec[1].iov_len = 100; + puts("writev bad iov[i].iov_base -- EINVAL"); + rc = writev(fd, vec, 2); + if ( (rc != -1) || (errno != EINVAL) ) { + printf( "writev error 5: %d=%s\n", errno, strerror(errno) ); + fclose(fp); + return FALSE; + } + + /* readv -- bad iov[i].iov_base */ + vec[0].iov_base = vec; + vec[0].iov_len = 100; + vec[1].iov_base = NULL; + vec[1].iov_len = 100; + puts("readv bad iov[i].iov_base -- EINVAL"); + rc = readv(fd, vec, 2); + if ( (rc != -1) || (errno != EINVAL) ) { + printf( "readv error 5: %d=%s\n", errno, strerror(errno) ); + fclose(fp); + return FALSE; + } + + /* writev -- bad iov[i].iov_len < 0 */ + vec[0].iov_base = vec; + vec[0].iov_len = 100; + vec[1].iov_base = vec; + vec[1].iov_len = -10; + puts("writev bad iov[i].iov_len < 0 -- EINVAL"); + rc = writev(fd, vec, 2); + if ( (rc != -1) || (errno != EINVAL) ) { + printf( "writev error 6: %d=%s\n", errno, strerror(errno) ); + fclose(fp); + return FALSE; + } + + /* readv -- bad iov[i].iov_len = 0 */ + vec[0].iov_base = vec; + vec[0].iov_len = 100; + vec[1].iov_base = vec; + vec[1].iov_len = -1024; + puts("readv bad iov[i].iov_len = 0 -- EINVAL"); + rc = readv(fd, vec, 2); + if ( (rc != -1) || (errno != EINVAL) ) { + printf( "readv error 6: %d=%s\n", errno, strerror(errno) ); + fclose(fp); + return FALSE; + } + + /* writev -- iov_len total overflows */ + vec[0].iov_base = vec; + vec[0].iov_len = SSIZE_MAX; + vec[1].iov_base = vec; + vec[1].iov_len = SSIZE_MAX; + vec[2].iov_base = vec; + vec[2].iov_len = SSIZE_MAX; + puts("writev iov_len total overflows -- EINVAL"); + rc = writev(fd, vec, 3); + if ( (rc != -1) || (errno != EINVAL) ) { + printf( "writev error 7: %d=%s\n", errno, strerror(errno) ); + fclose(fp); + return FALSE; + } + + /* readv -- iov_len total overflows */ + vec[0].iov_base = vec; + vec[0].iov_len = SSIZE_MAX; + vec[1].iov_base = vec; + vec[1].iov_len = SSIZE_MAX; + puts("readv iov_len total overflows -- EINVAL"); + rc = readv(fd, vec, 2); + if ( (rc != -1) || (errno != EINVAL) ) { + printf( "readv error 7: %d=%s\n", errno, strerror(errno) ); + fclose(fp); + return FALSE; + } + + /* writev -- all zero length buffers */ + vec[0].iov_base = vec; + vec[0].iov_len = 0; + vec[1].iov_base = vec; + vec[1].iov_len = 0; + puts("writev iov_len works with no effect -- OK"); + rc = writev(fd, vec, 2); + if ( (rc != 0) ) { + printf( "writev error 8: %d=%s\n", errno, strerror(errno) ); + fclose(fp); + return FALSE; + } + + /* readv -- all zero length buffers */ + vec[0].iov_base = vec; + vec[0].iov_len = 0; + vec[1].iov_base = vec; + vec[1].iov_len = 0; + puts("readv iov_len works with no effect -- OK"); + rc = readv(fd, vec, 2); + if ( (rc != 0) ) { + printf( "readv error 8: %d=%s\n", errno, strerror(errno) ); + fclose(fp); + return FALSE; + } + + fclose(fp); + return TRUE; +} + + +/* --------------------------------------------------------------- + * Main function + * + * main entry point to the test + * + * --------------------------------------------------------------- + */ + +#if defined(__rtems__) +int test_main(void) +#else +int main( + int argc, + char **argv +) +#endif +{ + puts( "*** POSIX TEST READV/WRITEV ***" ); + + if ( fillPatternBuffer() != TRUE ) { + puts("Error filling pattern buffer" ); + rtems_test_exit(0); + } + + if (doErrorTest() != TRUE) { + puts("Error during error test!!!!"); + rtems_test_exit(0); + } + if (doFunctionalTest() != TRUE) { + puts("Error during functional test!!!!"); + rtems_test_exit(0); + } + + unlink(TESTFILE); + puts( "*** END OF TEST PSXRDWRV ***" ); + rtems_test_exit(0); +} |