From 0895bdb89c1674d01ecb9886a0624096ef939ad1 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Mon, 23 Nov 1998 18:57:48 +0000 Subject: Added tests in support of the file system infrastructure. --- testsuites/psxtests/psx13/test.c | 687 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 687 insertions(+) create mode 100644 testsuites/psxtests/psx13/test.c (limited to 'testsuites/psxtests/psx13/test.c') diff --git a/testsuites/psxtests/psx13/test.c b/testsuites/psxtests/psx13/test.c new file mode 100644 index 0000000000..733b8824a7 --- /dev/null +++ b/testsuites/psxtests/psx13/test.c @@ -0,0 +1,687 @@ +/* + * Psx13 + * Chris Bond (working under Jennifer's account) + * + * This test exercises the following routines: + * + * device_lseek - test implemented + * dup - test implemented + * dup2 - test implemented + * fdatasync - test implemented + * fsync - test implemented + * pathconf - test implemented + * fpathconf - test implemented + * pipe - test implemented + * umask - test implemented + * utime - test implemented + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include +#include +#include +#include +#include +#include + +#include + +/*------------------------------------------------------------------- + * InitFiles function + * + * Initializes the three files to be used in the test. + * + * arguments: none + * assumptions: fopen, fprintf, fwrite, FILE are available + * actions: creates testfile1, a text file with 'a'..'z' listed 4 times. + * creates testfile2, a text file with 'a'..'z' listed 4 times. + * creates testfile3, a binary file with 0..9 listed 4 times. + * returns: TRUE if files opened successfully. + * FALSE if fail on file open for write. + * + * ------------------------------------------------------------------ + */ + +int InitFiles (void) { + + int count; + FILE *fp1, *fp2, *fp3; + char letter; + int number; + int retval; + + fp1 = fopen("testfile1.tst", "wt"); + fp2 = fopen("testfile2.tst", "wt"); + fp3 = fopen("testfile4.tst", "wb"); + + if ((fp1 != NULL) && (fp2 != NULL) && (fp3 !=NULL)) { + + letter = 'a'; + + for (count=0 ; count<(26*4); ++count) { + fprintf (fp1, "%c", letter); + fprintf (fp2, "%c", letter); + + ++letter; + if (letter > 'z') + letter = 'a'; + } + + number = 0; + + for (count = 0; count <40; ++count) { + + fwrite (&number, 1, sizeof(int), fp3); + + ++number; + if (number > 9) + number = 0; + } + + fclose(fp1); + fclose(fp2); + fclose(fp3); + + retval = TRUE; + } + + else + retval = FALSE; + + /* assert (retval == TRUE);*/ + + return (retval); +} + +/* --------------------------------------------------------------- + * DeviceLSeekTest function + * + * Hits the device_lseek code by lseeking on the console. + * + * arguments: none + * assumptions: lseek available + * actions: hits lseek with some dummy arguments. + * returns: value of return from lseek. + * + * --------------------------------------------------------------- + */ + +int DeviceLSeekTest (void) { + + int error = -1, retval = FALSE; + + int fd = open ("/dev/console", O_RDONLY); + + error = lseek(fd, 5, SEEK_SET); + + if (error == 0) + retval = TRUE; + else + retval = FALSE; + + /* assert (retval == TRUE);*/ + + return (retval); + +} + +/* --------------------------------------------------------------- + * DupTest function + * + * Hits the dup code. + * + * arguments: none + * assumptions: dup, open, close, fcntl available. + * actions: Gets a file descriptor(fd1) for test file1. + * dups fd1 to fd2. + * sets fd1 to append mode + * checks fd2 to ensure it's in append mode, also. + * returns: success if fd2 is indeed a copy of fd1. + * + * --------------------------------------------------------------- + */ + +int DupTest(void) { + + int fd1, fd2; + + int flags = 0, retval = FALSE; + + fd1 = open ("testfile1.tst", O_RDONLY); + fd2 = dup(fd1); + + if (fd2 != -1) { + + fcntl(F_SETFL, fd1, O_APPEND); + flags = fcntl(F_GETFL, fd2); + + close (fd1); + + flags = (flags & O_APPEND); + + retval = (flags == O_APPEND); + } + + else + retval = FALSE; + + /* assert (retval == TRUE);*/ + + return (retval); + +} + +/* --------------------------------------------------------------- + * Dup2Test function + * + * Hits the dup2 code. + * + * arguments: none + * assumptions: dup, dup2, open, close, fcntl available. + * actions: Gets a file descriptor(fd1) for test file1. + * dups fd1 to fd2. + * sets fd1 to append mode + * checks fd2 to ensure it's in append mode, also. + * sets fd1 to invalid value, fd2 to valid, tries to dup2. + * sets fd2 to invalid value, fd1 to valid tries to dup2. + * returns: success if fd2 is a copy of fd1, and invalid fd1 or fd2 produce errors. + * + * --------------------------------------------------------------- + */ + +int Dup2Test(void) { + + int fd1, fd2; + + int flags = 0, retval = FALSE; + + int error = 0; + + fd1 = open ("testfile1.tst", O_RDONLY); + fd2 = open ("testfile2.tst", O_RDONLY); + error = dup2(fd1, fd2); + + /* make sure dup2 works if both fd1 and fd2 are valid file descriptors. */ + + if (error != -1) { + + fcntl(F_SETFL, fd1, O_APPEND); + flags = fcntl(F_GETFL, fd1); + + flags = (flags & O_APPEND); + retval = (flags == O_APPEND); + } + + else { + retval = FALSE; + close(fd2); + } + + if (retval == TRUE) { + + /* make sure dup2 fails correctly if one or the other arguments are invalid. */ + /* this assumes -1 is an invalid value for a file descriptor!!! (POSIX book, p.135) */ + + fd1 = -1; + + if (dup2 (fd1, fd2) != -1) + retval = FALSE; + else { + fd1 = dup(fd2); + fd2 = -1; + + if (dup2(fd1, fd2) != -1) + retval = FALSE; + } + } + + close (fd1); + + /* assert (retval == TRUE);*/ + + return (retval); + +} + +/* --------------------------------------------------------------- + * FDataSyncTest function + * + * Hits the fdatasync code. Does NOT test the functionality of the + * underlying fdatasync entry in the IMFS op table. + * + * arguments: none + * assumptions: open, close, fdatasync functions available. + * actions: attempts to fdatasync a file descriptor flagged as read-only. + * attempts to fdatasync an invalid file descriptor (-1). + * attempts to fdatasync a perfectly valid fd opened as RDWR + * + * returns: TRUE if attempt to fdatasync invalid and read-only filed escriptor fail, and fdatasync succeeds on valid fd. + * FALSE otherwise. + * + * --------------------------------------------------------------- + */ + +int FDataSyncTest(void) { + + int fd = -1; + int error = 0, retval = TRUE; + + /* Try it with a RD_ONLY file. */ + + fd = open ("testfile1.tst", O_RDONLY); + + error = fdatasync(fd); + if ((error == -1) && (errno == EINVAL)) + retval = TRUE; + else + retval = FALSE; + + close (fd); + + if (retval == TRUE) { + + /* Try it with a bad file descriptor */ + + fd = -1; + + error = fdatasync(fd); + if ((errno == EBADF) && (error == -1)) + retval = TRUE; + else + retval = FALSE; + } + + /* Okay - now the success case... */ + + if (retval == TRUE) { + fd = open ("testfile1.tst", O_RDWR); + error = fdatasync(fd); + + if (error == 0) + retval = TRUE; + else + retval = FALSE; + + close (fd); + + } + + /* assert (retval == TRUE);*/ + + return (retval); +} + +/* --------------------------------------------------------------- + * UMaskTest function + * + * Hits the umask code. + * + * arguments: none + * assumptions: umask function available. + * actions: set umask to 0ctal 23. + * set umask to Octal 22, retrieve the old value. + * + * returns: TRUE if old value is 23, + * FALSE otherwise. + * + * --------------------------------------------------------------- + */ + +int UMaskTest (void) { + + int error = 0, retval = FALSE; + + umask (023); + error = umask(022); + + if (error == 023) + retval = TRUE; + else + retval = FALSE; + + /* assert (retval == TRUE);*/ + + return(retval); + +} + +/* --------------------------------------------------------------- + * UTimeTest function + * + * Hits the utime code. Does NOT test the functionality of the underlying utime + * entry in the IMFS op table. + * + * arguments: none + * assumptions: utime function available. + * actions: set utime for an invalid filename. + * set utime for a valid filename. + * + * returns: TRUE if time on valid file is set correctly and utime failed on an invaid filename. + * FALSE otherwise. + * + * --------------------------------------------------------------- + */ + +int UTimeTest (void) { + + int error = 0, retval = FALSE; + struct utimbuf time; + struct stat fstat; + + /* First, an invalid filename. */ + error = utime("!This is an =invalid p@thname!!! :)", NULL); + + if (error == -1) + retval = TRUE; + else + retval = FALSE; + + /* Now, the success test. */ + if (retval == TRUE) { + + time.actime = 12345; + time.modtime = 54321; + + error = utime("testfile1.tst", &time); + + if (error == 0) { + + /* But, did it set the time? */ + stat ("testfile1.tst", &fstat); + + if ((fstat.st_atime == 12345) && (fstat.st_mtime == 54321 )) + retval = TRUE; + else + retval = FALSE; + } + + else + retval = FALSE; + } + + /* assert (retval == TRUE);*/ + + return (retval); + +} + +/* --------------------------------------------------------------- + * PipeTest function + * + * Hits the pipe code. + * + * arguments: none + * assumptions: pipe function available. + * actions: call pipe. + * + * returns: TRUE if pipe retuens ENOSYS, + * FALSE otherwise. + * + * --------------------------------------------------------------- + */ + +int PipeTest (void) { + + int error = 0, retval = FALSE; + int fd[2]; + + error = pipe(fd); + + if ((error == -1) && (errno == ENOSYS)) + retval = TRUE; + else + retval = FALSE; + + /* assert (retval == TRUE);*/ + + return(retval); + +} + +/* --------------------------------------------------------------- + * PathConfTest function + * + * Hits the pathconf code. + * + * arguments: none + * assumptions: pathconf function available. + * actions: Try to pathconf a bad filename. + * Try to pathconf a good filename. + * + * returns: TRUE if pathconf fails on bad file, succeeds on good file. + * FALSE otherwise. + * + * --------------------------------------------------------------- + */ + +int PathConfTest (void) { + + int error = 0, retval = FALSE; + + error = pathconf("thisfiledoesnotexist", _PC_LINK_MAX); + + if (error == -1) { + error = pathconf("testfile1.tst", _PC_LINK_MAX); + + if (error != -1) + retval = TRUE; + else + retval = FALSE; + } + + else + retval = FALSE; + + /* assert (retval == TRUE);*/ + + return(retval); + +} + +/* --------------------------------------------------------------- + * FPathConfTest function + * + * Hits the fpathconf code. + * + * arguments: none + * assumptions: fpathconf function available. + * actions: Call fpathconf with all arguments, plus an invalid. + * + * returns: TRUE always. + * + * --------------------------------------------------------------- + */ + +int FPathConfTest (void) { + + int error = 0, retval = TRUE; + + int fd = -1; + + error = fpathconf(fd, _PC_LINK_MAX); + + if (error == -1) { + fd = open("testfile1.tst", O_RDWR); + + error = fpathconf(fd, _PC_LINK_MAX); + error = fpathconf(fd, _PC_MAX_CANON); + error = fpathconf(fd, _PC_MAX_INPUT); + error = fpathconf(fd, _PC_NAME_MAX); + error = fpathconf(fd, _PC_PATH_MAX); + error = fpathconf(fd, _PC_PIPE_BUF); + error = fpathconf(fd, _PC_CHOWN_RESTRICTED); + error = fpathconf(fd, _PC_NO_TRUNC); + error = fpathconf(fd, _PC_VDISABLE); + error = fpathconf(fd, _PC_ASYNC_IO); + error = fpathconf(fd, _PC_PRIO_IO); + error = fpathconf(fd, _PC_SYNC_IO); + error = fpathconf(fd, 255); + + retval = TRUE; + } + + else + retval = FALSE; + + /* assert (retval == TRUE);*/ + + return(retval); + +} + +/* --------------------------------------------------------------- + * FSyncTest function + * + * Hits the fsync code. + * + * arguments: none + * assumptions: open, fsync functions available. + * actions: open test file, + * try to fsync it. + * + * returns: TRUE if fsync doesn't return -1, + * FALSE otherwise. + * + * --------------------------------------------------------------- + */ + +int FSyncTest (void) { + + int error = 0, retval = FALSE; + int fd = -1; + + fd = open("testfile1.tst", O_RDWR); + + if (fd != -1) { + + error = fsync(fd); + + if (error != -1) + retval = TRUE; + else + retval = FALSE; + + close(fd); + } + + else + retval = FALSE; + + /* assert (retval == TRUE);*/ + + return(retval); + +} + +/* --------------------------------------------------------------- + * Main function + * + * main entry point to the test + * + * --------------------------------------------------------------- + */ + +#if defined(__rtems__) +int test_main(void) +#else +int main( + int argc, + char **argv +) +#endif +{ + if (InitFiles() == TRUE) { + puts ("\nFiles initialized successfully.\n"); + + puts ("Testing device_lseek()..."); + if (DeviceLSeekTest() == TRUE) + puts ("Success.\n"); + else + puts ("Failed!!!\n"); + + puts ("Testing dup()..."); + if (DupTest() == TRUE) + puts ("Success.\n"); + else + puts ("Failed!!!\n"); + + puts ("Testing dup2()..."); + if (Dup2Test() == TRUE) + puts ("Success.\n"); + else + puts ("Failed!!!\n"); + + puts ("Testing fdatasync()..."); + if (FDataSyncTest() == TRUE) + puts ("Success.\n"); + else + puts ("Failed!!!\n"); + + puts ("Testing umask()..."); + if (UMaskTest() == TRUE) + puts ("Success.\n"); + else + puts ("Failed!!!\n"); + + puts ("Testing utime()..."); + if (UTimeTest() == TRUE) + puts ("Success.\n"); + else + puts ("Failed!!!\n"); + + puts ("Testing pipe()..."); + if (PipeTest() == TRUE) + puts ("Success.\n"); + else + puts ("Failed!!!\n"); + + puts ("Testing fsync()..."); + if (FSyncTest() == TRUE) + puts ("Success.\n"); + else + puts ("Failed!!!\n"); + + puts ("Testing pathconf()..."); + if (PathConfTest() == TRUE) + puts ("Success.\n"); + else + puts ("Failed!!!\n"); + + puts ("Testing fpathconf()..."); + if (FPathConfTest() == TRUE) + puts ("Success.\n"); + else + puts ("Failed!!!\n"); + } + + + else + puts ("\n\nError opening files for write!!!!\n"); + + puts( "\n\n*** XXX ***" ); + + puts( "\n\n*** END OF TEST PSX13 ***" ); + exit(0); +} + + + + + + + + + + + + + -- cgit v1.2.3