mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-05 23:23:13 +00:00
psx13: Reworked and relicensed
Changed the way the tests were structured, added rtems_test_assert()'s, updated psx13.scn and the license. Update #3899
This commit is contained in:
@@ -1,14 +1,37 @@
|
|||||||
/*
|
/* SPDX-License-Identifier: BSD-2-Clause */
|
||||||
* Simple test program -- simplified version of sample test hello.
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
*
|
*
|
||||||
* COPYRIGHT (c) 1989-2009.
|
* @brief Simple test program -- simplified version of sample test hello.
|
||||||
* 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.org/license/LICENSE.
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* COPYRIGHT (c) 1989-2009, 2021.
|
||||||
|
* On-Line Applications Research Corporation (OAR).
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|||||||
@@ -1,16 +1,7 @@
|
|||||||
*** POSIX TEST 13 ***
|
*** BEGIN OF TEST PSX 13 ***
|
||||||
|
*** TEST VERSION: 6.0.0.75f80242186af2dde0c5bc7272a119e3b78d7ba0
|
||||||
Files initialized successfully.
|
*** TEST STATE: EXPECTED_PASS
|
||||||
Testing device_lseek()... Failed!!!
|
*** TEST BUILD: RTEMS_DEBUG RTEMS_POSIX_API
|
||||||
Testing dup()............ Failed!!!
|
*** TEST TOOLS: 10.2.1 20210309 (RTEMS 6, RSB 5e449fb5c2cb6812a238f9f9764fd339cbbf05c2, Newlib d10d0d9)
|
||||||
Testing dup2()........... Success.
|
|
||||||
Testing fdatasync()...... Success.
|
|
||||||
Testing umask().......... Success.
|
|
||||||
Testing utime().......... Success.
|
|
||||||
Testing utimes().......... Success.
|
|
||||||
Testing fsync().......... Success.
|
|
||||||
Testing pathconf()....... Success.
|
|
||||||
Testing fpathconf()...... Success.
|
|
||||||
Testing sync()......
|
|
||||||
|
|
||||||
*** END OF TEST PSX 13 ***
|
*** END OF TEST PSX 13 ***
|
||||||
|
|||||||
@@ -1,26 +1,49 @@
|
|||||||
/*
|
/* SPDX-License-Identifier: BSD-2-Clause */
|
||||||
* Psx13
|
|
||||||
* Chris Bond (working under Jennifer's account)
|
/**
|
||||||
|
* @file
|
||||||
|
*
|
||||||
|
* @brief This tests various file system functions.
|
||||||
*
|
*
|
||||||
* This test exercises the following routines:
|
* This test exercises the following routines:
|
||||||
*
|
*
|
||||||
* device_lseek - test implemented
|
* - lseek()
|
||||||
* dup - test implemented
|
* - dup()
|
||||||
* dup2 - test implemented
|
* - dup2()
|
||||||
* fdatasync - test implemented
|
* - fdatasync()
|
||||||
* fsync - test implemented
|
* - fsync()
|
||||||
* pathconf - test implemented
|
* - pathconf()
|
||||||
* fpathconf - test implemented
|
* - fpathconf()
|
||||||
* umask - test implemented
|
* - umask()
|
||||||
* utime - test implemented
|
* - utime()
|
||||||
* utimes - test implemented
|
* - utimes()
|
||||||
*
|
* - sync()
|
||||||
* COPYRIGHT (c) 1989-2009.
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* COPYRIGHT (c) 1989-2009, 2021.
|
||||||
* On-Line Applications Research Corporation (OAR).
|
* On-Line Applications Research Corporation (OAR).
|
||||||
*
|
*
|
||||||
* The license and distribution terms for this file may be
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* found in the file LICENSE in this distribution or at
|
* modification, are permitted provided that the following conditions
|
||||||
* http://www.rtems.org/license/LICENSE.
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||||
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||||
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||||
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||||
|
* * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||||
|
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||||
|
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||||
|
* POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
@@ -34,6 +57,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <utime.h>
|
#include <utime.h>
|
||||||
|
#include <tmacros.h>
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@@ -42,47 +66,25 @@
|
|||||||
|
|
||||||
const char rtems_test_name[] = "PSX 13";
|
const char rtems_test_name[] = "PSX 13";
|
||||||
|
|
||||||
int InitFiles(void);
|
/**
|
||||||
int DeviceLSeekTest(void);
|
* @brief Initializes the three files to be used for the test.
|
||||||
int DupTest(void);
|
|
||||||
int Dup2Test(void);
|
|
||||||
int FDataSyncTest(void);
|
|
||||||
int UMaskTest(void);
|
|
||||||
int UTimeTest(void);
|
|
||||||
int UTimesTest(void);
|
|
||||||
int PathConfTest(void);
|
|
||||||
int FPathConfTest(void);
|
|
||||||
int FSyncTest(void);
|
|
||||||
|
|
||||||
/*-------------------------------------------------------------------
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* ------------------------------------------------------------------
|
|
||||||
*/
|
*/
|
||||||
|
static void InitFiles( void )
|
||||||
int InitFiles (void)
|
|
||||||
{
|
{
|
||||||
int count;
|
int count;
|
||||||
|
int rv;
|
||||||
FILE *fp1, *fp2, *fp3;
|
FILE *fp1, *fp2, *fp3;
|
||||||
char letter;
|
char letter;
|
||||||
int number;
|
int number;
|
||||||
int retval;
|
|
||||||
|
|
||||||
fp1 = fopen( "testfile1.tst", "wt" );
|
fp1 = fopen( "testfile1.tst", "wt" );
|
||||||
fp2 = fopen("testfile2.tst", "wt");
|
rtems_test_assert( fp1 != NULL );
|
||||||
fp3 = fopen("testfile4.tst", "wb");
|
|
||||||
|
|
||||||
if ((fp1 != NULL) && (fp2 != NULL) && (fp3 !=NULL)) {
|
fp2 = fopen( "testfile2.tst", "wt" );
|
||||||
|
rtems_test_assert( fp2 != NULL );
|
||||||
|
|
||||||
|
fp3 = fopen( "testfile4.tst", "wb" );
|
||||||
|
rtems_test_assert( fp3 != NULL );
|
||||||
|
|
||||||
letter = 'a';
|
letter = 'a';
|
||||||
|
|
||||||
@@ -98,7 +100,6 @@ int InitFiles (void)
|
|||||||
number = 0;
|
number = 0;
|
||||||
|
|
||||||
for( count = 0; count < 40; ++count ) {
|
for( count = 0; count < 40; ++count ) {
|
||||||
|
|
||||||
fwrite( &number, 1, sizeof(int), fp3 );
|
fwrite( &number, 1, sizeof(int), fp3 );
|
||||||
|
|
||||||
++number;
|
++number;
|
||||||
@@ -106,621 +107,348 @@ int InitFiles (void)
|
|||||||
number = 0;
|
number = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(fp1);
|
rv = fclose( fp1 );
|
||||||
fclose(fp2);
|
rtems_test_assert( rv != EOF );
|
||||||
fclose(fp3);
|
|
||||||
|
|
||||||
retval = TRUE;
|
rv = fclose( fp2 );
|
||||||
|
rtems_test_assert( rv != EOF );
|
||||||
|
|
||||||
|
rv = fclose( fp3 );
|
||||||
|
rtems_test_assert( rv != EOF );
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
/**
|
||||||
retval = FALSE;
|
* @brief Exercises lseek() by lseeking on the console.
|
||||||
|
|
||||||
/* 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.
|
|
||||||
*
|
|
||||||
* ---------------------------------------------------------------
|
|
||||||
*/
|
*/
|
||||||
|
static void DeviceLSeekTest( void )
|
||||||
int DeviceLSeekTest (void)
|
|
||||||
{
|
{
|
||||||
int error = -1, retval = FALSE;
|
int rv;
|
||||||
|
int fd;
|
||||||
|
|
||||||
int fd = open ("/dev/console", O_RDONLY);
|
fd = open( "/dev/console", O_RDONLY );
|
||||||
|
rtems_test_assert( fd != -1 );
|
||||||
|
|
||||||
error = lseek(fd, 5, SEEK_SET);
|
rv = lseek( fd, 5, SEEK_SET );
|
||||||
|
rtems_test_assert( rv == -1 );
|
||||||
|
rtems_test_assert( errno == ESPIPE );
|
||||||
|
|
||||||
if (error == 0)
|
rv = close( fd );
|
||||||
retval = TRUE;
|
rtems_test_assert( rv == 0 );
|
||||||
else
|
|
||||||
retval = FALSE;
|
|
||||||
|
|
||||||
close( fd ); /* assert (retval == TRUE);*/
|
|
||||||
|
|
||||||
return (retval);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------
|
/**
|
||||||
* DupTest function
|
* @brief Exercises dup().
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
* ---------------------------------------------------------------
|
|
||||||
*/
|
*/
|
||||||
|
static void DupTest( void )
|
||||||
int DupTest(void)
|
|
||||||
{
|
{
|
||||||
int fd1, fd2;
|
int fd1, fd2;
|
||||||
|
int flags;
|
||||||
int flags = 0, retval = FALSE;
|
int rv;
|
||||||
|
|
||||||
fd1 = open( "testfile1.tst", O_RDONLY );
|
fd1 = open( "testfile1.tst", O_RDONLY );
|
||||||
|
rtems_test_assert( fd1 != -1 );
|
||||||
|
|
||||||
fd2 = dup( fd1 );
|
fd2 = dup( fd1 );
|
||||||
|
rtems_test_assert( fd2 != -1 );
|
||||||
|
|
||||||
if (fd2 != -1) {
|
rv = fcntl( fd1, F_SETFL, O_APPEND );
|
||||||
|
rtems_test_assert( rv != -1 );
|
||||||
|
|
||||||
fcntl(fd1, F_SETFL, O_APPEND);
|
flags = fcntl( fd2, F_GETFL ) & O_APPEND;
|
||||||
flags = fcntl(fd2, F_GETFL);
|
rtems_test_assert( flags == 0 );
|
||||||
|
|
||||||
close (fd1);
|
rv = close( fd1 );
|
||||||
|
rtems_test_assert( rv == 0 );
|
||||||
|
|
||||||
flags = (flags & O_APPEND);
|
rv = close( fd2 );
|
||||||
|
rtems_test_assert( rv == 0 );
|
||||||
retval = (flags == O_APPEND);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
/**
|
||||||
retval = FALSE;
|
* @brief Exercises dup2().
|
||||||
|
|
||||||
close( fd1 );
|
|
||||||
close( fd2 );
|
|
||||||
/* 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.
|
|
||||||
*
|
|
||||||
* ---------------------------------------------------------------
|
|
||||||
*/
|
*/
|
||||||
|
static void Dup2Test( void )
|
||||||
int Dup2Test(void)
|
|
||||||
{
|
{
|
||||||
int fd1, fd2;
|
int fd1, fd2;
|
||||||
|
int flags;
|
||||||
int flags = 0, retval = FALSE;
|
int rv;
|
||||||
|
|
||||||
int error = 0;
|
|
||||||
|
|
||||||
fd1 = open( "testfile1.tst", O_RDONLY );
|
fd1 = open( "testfile1.tst", O_RDONLY );
|
||||||
|
rtems_test_assert( fd1 != -1 );
|
||||||
|
|
||||||
fd2 = open( "testfile2.tst", O_RDONLY );
|
fd2 = open( "testfile2.tst", O_RDONLY );
|
||||||
error = dup2(fd1, fd2);
|
rtems_test_assert( fd2 != -1 );
|
||||||
|
|
||||||
/* make sure dup2 works if both fd1 and fd2 are valid file descriptors. */
|
/* make sure dup2 works if both fd1 and fd2 are valid file descriptors. */
|
||||||
|
rv = dup2( fd1, fd2 );
|
||||||
|
rtems_test_assert( rv != -1 );
|
||||||
|
|
||||||
if (error != -1) {
|
rv = fcntl( fd1, F_SETFL, O_APPEND );
|
||||||
|
rtems_test_assert( rv != -1 );
|
||||||
|
|
||||||
fcntl(fd1, F_SETFL, O_APPEND);
|
flags = fcntl( fd1, F_GETFL ) & O_APPEND;
|
||||||
flags = fcntl(fd1, F_GETFL);
|
rtems_test_assert( flags == O_APPEND );
|
||||||
|
|
||||||
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. */
|
/* 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) */
|
/* this assumes -1 is an invalid value for a file descriptor!!! (POSIX book, p.135) */
|
||||||
|
rv = close( fd1 );
|
||||||
|
rtems_test_assert( rv == 0 );
|
||||||
|
|
||||||
fd1 = -1;
|
fd1 = -1;
|
||||||
|
|
||||||
if (dup2 (fd1, fd2) != -1)
|
rv = dup2( fd1, fd2 );
|
||||||
retval = FALSE;
|
rtems_test_assert( rv == -1 );
|
||||||
else {
|
|
||||||
fd1 = dup( fd2 );
|
fd1 = dup( fd2 );
|
||||||
fd2 = -1;
|
fd2 = -1;
|
||||||
|
|
||||||
if (dup2(fd1, fd2) != -1)
|
rv = dup2( fd1, fd2 );
|
||||||
retval = FALSE;
|
rtems_test_assert( rv == -1 );
|
||||||
}
|
|
||||||
|
rv = close( fd1 );
|
||||||
|
rtems_test_assert( rv == 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
close (fd1);
|
/**
|
||||||
close (fd2);
|
* @brief Exercises fdatasync(). Does NOT test the functionality of the
|
||||||
/* 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.
|
* 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
|
|
||||||
* descriptor fail, and fdatasync succeeds on valid fd.
|
|
||||||
* FALSE otherwise.
|
|
||||||
*
|
|
||||||
* ---------------------------------------------------------------
|
|
||||||
*/
|
*/
|
||||||
|
static void FDataSyncTest( void )
|
||||||
int FDataSyncTest(void)
|
|
||||||
{
|
{
|
||||||
int fd = -1;
|
int fd;
|
||||||
int error = 0, retval = TRUE;
|
int rv;
|
||||||
|
|
||||||
/* Try it with a RD_ONLY file. */
|
/* Try it with a RD_ONLY file. */
|
||||||
|
|
||||||
fd = open( "testfile1.tst", O_RDONLY );
|
fd = open( "testfile1.tst", O_RDONLY );
|
||||||
|
rtems_test_assert( fd != -1 );
|
||||||
|
|
||||||
error = fdatasync(fd);
|
rv = fdatasync( fd );
|
||||||
if ((error == -1) && (errno == EINVAL))
|
rtems_test_assert( rv == -1 );
|
||||||
retval = TRUE;
|
rtems_test_assert( errno == EBADF );
|
||||||
else
|
|
||||||
retval = FALSE;
|
|
||||||
|
|
||||||
close (fd);
|
rv = close(fd);
|
||||||
|
rtems_test_assert( rv == 0 );
|
||||||
if (retval == TRUE) {
|
|
||||||
|
|
||||||
/* Try it with a bad file descriptor */
|
/* Try it with a bad file descriptor */
|
||||||
|
|
||||||
fd = -1;
|
fd = -1;
|
||||||
|
|
||||||
error = fdatasync(fd);
|
rv = fdatasync( fd );
|
||||||
if ((errno == EBADF) && (error == -1))
|
rtems_test_assert( rv == -1 );
|
||||||
retval = TRUE;
|
rtems_test_assert( errno == EBADF );
|
||||||
else
|
|
||||||
retval = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Okay - now the success case... */
|
/* Okay - now the success case... */
|
||||||
|
|
||||||
if (retval == TRUE) {
|
|
||||||
fd = open( "testfile1.tst", O_RDWR );
|
fd = open( "testfile1.tst", O_RDWR );
|
||||||
error = fdatasync(fd);
|
rv = fdatasync( fd );
|
||||||
|
rtems_test_assert( rv == 0 );
|
||||||
|
|
||||||
if (error == 0)
|
rv = close( fd );
|
||||||
retval = TRUE;
|
rtems_test_assert( rv == 0 );
|
||||||
else
|
|
||||||
retval = FALSE;
|
|
||||||
|
|
||||||
close (fd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* assert (retval == TRUE);*/
|
/**
|
||||||
|
* @brief Exercises umask().
|
||||||
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.
|
|
||||||
*
|
|
||||||
* ---------------------------------------------------------------
|
|
||||||
*/
|
*/
|
||||||
|
static void UMaskTest( void )
|
||||||
int UMaskTest (void)
|
|
||||||
{
|
{
|
||||||
mode_t error = 0;
|
mode_t rv;
|
||||||
int retval = FALSE;
|
|
||||||
|
|
||||||
umask(023);
|
(void) umask( 023 );
|
||||||
error = umask(022);
|
|
||||||
|
|
||||||
if (error == 023)
|
rv = umask( 022 );
|
||||||
retval = TRUE;
|
rtems_test_assert( rv == 023 );
|
||||||
else
|
|
||||||
retval = FALSE;
|
|
||||||
|
|
||||||
/* assert (retval == TRUE);*/
|
|
||||||
|
|
||||||
return(retval);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------
|
/**
|
||||||
* UTimeTest function
|
* @brief Exercises utime(). Does not test the functionality of the
|
||||||
*
|
* underlying utime entry in the IMFS op table.
|
||||||
* 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 invalid filename.
|
|
||||||
* FALSE otherwise.
|
|
||||||
*
|
|
||||||
* ---------------------------------------------------------------
|
|
||||||
*/
|
*/
|
||||||
|
static void UTimeTest( void )
|
||||||
int UTimeTest (void)
|
|
||||||
{
|
{
|
||||||
int error = 0, retval = FALSE;
|
int rv;
|
||||||
struct utimbuf time;
|
struct utimbuf time;
|
||||||
struct stat fstat;
|
struct stat fstat;
|
||||||
|
|
||||||
/* First, an invalid filename. */
|
/* First, an invalid filename. */
|
||||||
error = utime("!This is an =invalid p@thname!!! :)", NULL);
|
rv = utime( "!This is an =invalid p@thname!!! :)", NULL );
|
||||||
|
rtems_test_assert( rv == -1 );
|
||||||
if (error == -1)
|
rtems_test_assert( errno == ENOENT );
|
||||||
retval = TRUE;
|
|
||||||
else
|
|
||||||
retval = FALSE;
|
|
||||||
|
|
||||||
/* Now, the success test. */
|
/* Now, the success test. */
|
||||||
if (retval == TRUE) {
|
|
||||||
|
|
||||||
time.actime = 12345;
|
time.actime = 12345;
|
||||||
time.modtime = 54321;
|
time.modtime = 54321;
|
||||||
|
|
||||||
error = utime("testfile1.tst", &time);
|
rv = utime( "testfile1.tst", &time );
|
||||||
|
rtems_test_assert( rv == 0 );
|
||||||
if (error == 0) {
|
|
||||||
|
|
||||||
/* But, did it set the time? */
|
/* But, did it set the time? */
|
||||||
stat ("testfile1.tst", &fstat);
|
rv = stat( "testfile1.tst", &fstat );
|
||||||
|
rtems_test_assert( rv == 0 );
|
||||||
|
rtems_test_assert( fstat.st_atime == 12345 );
|
||||||
|
rtems_test_assert( fstat.st_mtime == 54321 );
|
||||||
|
|
||||||
if ((fstat.st_atime == 12345) && (fstat.st_mtime == 54321 ))
|
rv = utime( "testfile1.tst", NULL );
|
||||||
retval = TRUE;
|
rtems_test_assert( rv == 0 );
|
||||||
else
|
|
||||||
retval = FALSE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
retval = FALSE;
|
|
||||||
|
|
||||||
error = utime("testfile1.tst", NULL );
|
|
||||||
retval &= (error == 0) ? TRUE : FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* assert (retval == TRUE);*/
|
/**
|
||||||
|
* @brief Exercises utimes(). Does NOT test the functionality of the
|
||||||
return (retval);
|
* underlying utime entry in the IMFS op table.
|
||||||
}
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------
|
|
||||||
* UTimesTest function
|
|
||||||
*
|
|
||||||
* Hits the utimes code. Does NOT test the functionality of the underlying utime
|
|
||||||
* entry in the IMFS op table.
|
|
||||||
*
|
|
||||||
* arguments: none
|
|
||||||
* assumptions: utimes function available.
|
|
||||||
* actions: set utimes for an invalid filename.
|
|
||||||
* set utimes for a valid filename.
|
|
||||||
*
|
|
||||||
* returns: TRUE if time on valid file is set correctly and utimes failed on
|
|
||||||
* an invalid filename.
|
|
||||||
* FALSE otherwise.
|
|
||||||
*
|
|
||||||
* ---------------------------------------------------------------
|
|
||||||
*/
|
*/
|
||||||
|
static void UTimesTest( void )
|
||||||
int UTimesTest (void)
|
|
||||||
{
|
{
|
||||||
int error = 0, retval = FALSE;
|
int rv;
|
||||||
struct timeval time[2];
|
struct timeval time[2];
|
||||||
struct stat fstat;
|
struct stat fstat;
|
||||||
|
|
||||||
/* First, an invalid filename. */
|
/* First, an invalid filename. */
|
||||||
error = utimes("!This is an =invalid p@thname!!! :)", NULL);
|
rv = utimes( "!This is an =invalid p@thname!!! : )", NULL);
|
||||||
|
rtems_test_assert( rv == -1 );
|
||||||
if (error == -1)
|
rtems_test_assert( errno == ENOENT );
|
||||||
retval = TRUE;
|
|
||||||
else
|
|
||||||
retval = FALSE;
|
|
||||||
|
|
||||||
/* Now, the success test. */
|
/* Now, the success test. */
|
||||||
if (retval == TRUE) {
|
|
||||||
|
|
||||||
time[0].tv_sec = 12345;
|
time[0].tv_sec = 12345;
|
||||||
time[1].tv_sec = 54321;
|
time[1].tv_sec = 54321;
|
||||||
|
|
||||||
error = utimes("testfile1.tst", (struct timeval *)&time);
|
rv = utimes( "testfile1.tst", (struct timeval *)&time );
|
||||||
|
rtems_test_assert( rv == 0 );
|
||||||
if (error == 0) {
|
|
||||||
|
|
||||||
/* But, did it set the time? */
|
/* But, did it set the time? */
|
||||||
stat ("testfile1.tst", &fstat);
|
rv = stat( "testfile1.tst", &fstat );
|
||||||
|
rtems_test_assert( rv == 0 );
|
||||||
if ((fstat.st_atime == 12345) && (fstat.st_mtime == 54321 ))
|
rtems_test_assert( fstat.st_atime == 12345 );
|
||||||
retval = TRUE;
|
rtems_test_assert( fstat.st_mtime == 54321 );
|
||||||
else
|
|
||||||
retval = FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
/**
|
||||||
retval = FALSE;
|
* @brief Exercises pathconf().
|
||||||
}
|
|
||||||
|
|
||||||
/* 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.
|
|
||||||
*
|
|
||||||
* ---------------------------------------------------------------
|
|
||||||
*/
|
*/
|
||||||
|
static void PathConfTest( void )
|
||||||
int PathConfTest (void)
|
|
||||||
{
|
{
|
||||||
int error = 0, retval = FALSE;
|
int rv;
|
||||||
|
|
||||||
error = pathconf("thisfiledoesnotexist", _PC_LINK_MAX);
|
rv = pathconf( "thisfiledoesnotexist", _PC_LINK_MAX );
|
||||||
|
rtems_test_assert( rv == -1 );
|
||||||
|
|
||||||
if (error == -1) {
|
rv = pathconf( "testfile1.tst", _PC_LINK_MAX );
|
||||||
error = pathconf("testfile1.tst", _PC_LINK_MAX);
|
rtems_test_assert( rv != -1 );
|
||||||
|
|
||||||
if (error != -1)
|
|
||||||
retval = TRUE;
|
|
||||||
else
|
|
||||||
retval = FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
/**
|
||||||
retval = FALSE;
|
* @brief Exercises fpathconf().
|
||||||
|
|
||||||
/* 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.
|
|
||||||
*
|
|
||||||
* ---------------------------------------------------------------
|
|
||||||
*/
|
*/
|
||||||
|
static void FPathConfTest( void )
|
||||||
int FPathConfTest (void)
|
|
||||||
{
|
{
|
||||||
int error = 0, retval = TRUE;
|
int rv;
|
||||||
|
int fd;
|
||||||
|
|
||||||
int fd = -1;
|
fd = -1;
|
||||||
|
rv = fpathconf( fd, _PC_LINK_MAX );
|
||||||
|
rtems_test_assert( rv == -1 );
|
||||||
|
|
||||||
error = fpathconf(fd, _PC_LINK_MAX);
|
|
||||||
|
|
||||||
if (error == -1) {
|
|
||||||
fd = open( "testfile1.tst", O_RDWR );
|
fd = open( "testfile1.tst", O_RDWR );
|
||||||
|
rtems_test_assert( fd != -1 );
|
||||||
|
|
||||||
error = fpathconf(fd, _PC_LINK_MAX);
|
rv = fpathconf( fd, _PC_LINK_MAX );
|
||||||
error = fpathconf(fd, _PC_MAX_CANON);
|
rtems_test_assert( rv != -1 );
|
||||||
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);
|
|
||||||
|
|
||||||
close(fd);
|
rv = fpathconf( fd, _PC_MAX_CANON );
|
||||||
|
rtems_test_assert( rv != -1 );
|
||||||
|
|
||||||
|
rv = fpathconf( fd, _PC_MAX_INPUT );
|
||||||
|
rtems_test_assert( rv != -1 );
|
||||||
|
|
||||||
|
rv = fpathconf( fd, _PC_NAME_MAX );
|
||||||
|
rtems_test_assert( rv != -1 );
|
||||||
|
|
||||||
|
rv = fpathconf( fd, _PC_PATH_MAX );
|
||||||
|
rtems_test_assert( rv != -1 );
|
||||||
|
|
||||||
|
rv = fpathconf( fd, _PC_PIPE_BUF );
|
||||||
|
rtems_test_assert( rv != -1 );
|
||||||
|
|
||||||
|
rv = fpathconf( fd, _PC_CHOWN_RESTRICTED );
|
||||||
|
rtems_test_assert( rv != -1 );
|
||||||
|
|
||||||
|
rv = fpathconf( fd, _PC_NO_TRUNC );
|
||||||
|
rtems_test_assert( rv != -1 );
|
||||||
|
|
||||||
|
rv = fpathconf( fd, _PC_VDISABLE );
|
||||||
|
rtems_test_assert( rv != -1 );
|
||||||
|
|
||||||
|
rv = fpathconf( fd, _PC_ASYNC_IO );
|
||||||
|
rtems_test_assert( rv != -1 );
|
||||||
|
|
||||||
|
rv = fpathconf( fd, _PC_PRIO_IO );
|
||||||
|
rtems_test_assert( rv != -1 );
|
||||||
|
|
||||||
|
rv = fpathconf( fd, _PC_SYNC_IO );
|
||||||
|
rtems_test_assert( rv != -1 );
|
||||||
|
|
||||||
|
rv = fpathconf( fd, 255 );
|
||||||
|
rtems_test_assert( rv == -1 );
|
||||||
|
|
||||||
|
rv = close( fd );
|
||||||
|
rtems_test_assert( rv == 0 );
|
||||||
|
|
||||||
fd = open( "testfile1.tst", O_WRONLY );
|
fd = open( "testfile1.tst", O_WRONLY );
|
||||||
|
rtems_test_assert( rv != -1 );
|
||||||
|
|
||||||
error = fpathconf(fd, _PC_LINK_MAX);
|
rv = fpathconf( fd, _PC_LINK_MAX );
|
||||||
|
rtems_test_assert( rv != -1 );
|
||||||
|
|
||||||
retval = TRUE;
|
rv = close( fd );
|
||||||
|
rtems_test_assert( rv == 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
/**
|
||||||
retval = FALSE;
|
* @brief Exercises fsync().
|
||||||
|
|
||||||
/* 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.
|
|
||||||
*
|
|
||||||
* ---------------------------------------------------------------
|
|
||||||
*/
|
*/
|
||||||
|
static void FSyncTest( void )
|
||||||
int FSyncTest (void)
|
|
||||||
{
|
{
|
||||||
int error = 0, retval = FALSE;
|
int rv;
|
||||||
int fd = -1;
|
int fd;
|
||||||
|
|
||||||
fd = open( "testfile1.tst", O_RDWR );
|
fd = open( "testfile1.tst", O_RDWR );
|
||||||
|
rtems_test_assert( fd != -1 );
|
||||||
|
|
||||||
if (fd != -1) {
|
rv = fsync(fd);
|
||||||
|
rtems_test_assert( rv != -1 );
|
||||||
|
|
||||||
error = fsync(fd);
|
rv = close( fd );
|
||||||
|
rtems_test_assert( rv == 0 );
|
||||||
if (error != -1)
|
|
||||||
retval = TRUE;
|
|
||||||
else
|
|
||||||
retval = FALSE;
|
|
||||||
|
|
||||||
close(fd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
/**
|
||||||
retval = FALSE;
|
* @brief Exercises sync().
|
||||||
|
|
||||||
/* assert (retval == TRUE);*/
|
|
||||||
|
|
||||||
return(retval);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------
|
|
||||||
* Main function
|
|
||||||
*
|
|
||||||
* main entry point to the test
|
|
||||||
*
|
|
||||||
* ---------------------------------------------------------------
|
|
||||||
*/
|
*/
|
||||||
|
static void SyncTest( void )
|
||||||
|
{
|
||||||
|
sync();
|
||||||
|
}
|
||||||
|
|
||||||
#if defined(__rtems__)
|
/**
|
||||||
|
* @brief The main entry point to the test.
|
||||||
|
*/
|
||||||
int test_main( void );
|
int test_main( void );
|
||||||
int test_main( void )
|
int test_main( void )
|
||||||
#else
|
|
||||||
int main(
|
|
||||||
int argc,
|
|
||||||
char **argv
|
|
||||||
)
|
|
||||||
#endif
|
|
||||||
{
|
{
|
||||||
TEST_BEGIN();
|
TEST_BEGIN();
|
||||||
|
|
||||||
if (InitFiles() == TRUE) {
|
InitFiles();
|
||||||
printf ("\nFiles initialized successfully.\n");
|
|
||||||
|
|
||||||
printf ("Testing device_lseek()... ");
|
DeviceLSeekTest();
|
||||||
if (DeviceLSeekTest() == TRUE)
|
DupTest();
|
||||||
printf ("Success.\n");
|
Dup2Test();
|
||||||
else
|
FDataSyncTest();
|
||||||
printf ("Failed!!!\n");
|
UMaskTest();
|
||||||
|
UTimeTest();
|
||||||
printf ("Testing dup()............ ");
|
UTimesTest();
|
||||||
if (DupTest() == TRUE)
|
FSyncTest();
|
||||||
printf ("Success.\n");
|
PathConfTest();
|
||||||
else
|
FPathConfTest();
|
||||||
printf ("Failed!!!\n");
|
SyncTest();
|
||||||
|
|
||||||
printf ("Testing dup2()........... ");
|
|
||||||
if (Dup2Test() == TRUE)
|
|
||||||
printf ("Success.\n");
|
|
||||||
else
|
|
||||||
printf ("Failed!!!\n");
|
|
||||||
|
|
||||||
printf ("Testing fdatasync()...... ");
|
|
||||||
if (FDataSyncTest() == TRUE)
|
|
||||||
printf ("Success.\n");
|
|
||||||
else
|
|
||||||
printf ("Failed!!!\n");
|
|
||||||
|
|
||||||
printf ("Testing umask().......... ");
|
|
||||||
if (UMaskTest() == TRUE)
|
|
||||||
printf ("Success.\n");
|
|
||||||
else
|
|
||||||
printf ("Failed!!!\n");
|
|
||||||
|
|
||||||
printf ("Testing utime().......... ");
|
|
||||||
if (UTimeTest() == TRUE)
|
|
||||||
printf ("Success.\n");
|
|
||||||
else
|
|
||||||
printf ("Failed!!!\n");
|
|
||||||
|
|
||||||
printf ("Testing utimes().......... ");
|
|
||||||
if (UTimesTest() == TRUE)
|
|
||||||
printf ("Success.\n");
|
|
||||||
else
|
|
||||||
printf ("Failed!!!\n");
|
|
||||||
|
|
||||||
printf ("Testing fsync().......... ");
|
|
||||||
if (FSyncTest() == TRUE)
|
|
||||||
printf ("Success.\n");
|
|
||||||
else
|
|
||||||
printf ("Failed!!!\n");
|
|
||||||
|
|
||||||
printf ("Testing pathconf()....... ");
|
|
||||||
if (PathConfTest() == TRUE)
|
|
||||||
printf ("Success.\n");
|
|
||||||
else
|
|
||||||
printf ("Failed!!!\n");
|
|
||||||
|
|
||||||
printf ("Testing fpathconf()...... ");
|
|
||||||
if (FPathConfTest() == TRUE)
|
|
||||||
printf ("Success.\n");
|
|
||||||
else
|
|
||||||
printf ("Failed!!!\n");
|
|
||||||
|
|
||||||
printf ("Testing sync()...... ");
|
|
||||||
sync();
|
|
||||||
printf ("Done.\n");
|
|
||||||
|
|
||||||
TEST_END();
|
TEST_END();
|
||||||
}
|
|
||||||
|
|
||||||
rtems_test_exit( 0 );
|
rtems_test_exit( 0 );
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user