diff options
author | Andreas Baumann <mail@andreasbaumann.cc> | 2015-05-07 10:01:10 +0200 |
---|---|---|
committer | Andreas Baumann <mail@andreasbaumann.cc> | 2015-05-07 10:01:10 +0200 |
commit | 96ed429c6ab22bd1f38f286a8ef58c16751067e8 (patch) | |
tree | 7a0d9e0c20e6995d42d4b8b80ea11190d86ec575 /tests/testopen.c | |
parent | 56f70fa76186e99d067380fb71530ec259365ba6 (diff) | |
download | pgfuse-96ed429c6ab22bd1f38f286a8ef58c16751067e8.tar.gz pgfuse-96ed429c6ab22bd1f38f286a8ef58c16751067e8.tar.bz2 |
added a test for open flag testing (O_TRUNC and O_EXCL so far)
Diffstat (limited to 'tests/testopen.c')
-rw-r--r-- | tests/testopen.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/tests/testopen.c b/tests/testopen.c new file mode 100644 index 0000000..c67a755 --- /dev/null +++ b/tests/testopen.c @@ -0,0 +1,101 @@ +/* + Copyright (C) 2012 Andreas Baumann <abaumann@yahoo.com> + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. +*/ + +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <errno.h> + +int main( void ) +{ + char buf[4096]; + int fd; + int res; + ssize_t wres; + struct stat s; + + /* Make sure no file is around from last invocation */ + (void)unlink( "./mnt/testopen" ); + + /* This should succeed */ + fd = open( "./mnt/testopen", O_CREAT | O_EXCL | O_WRONLY, S_IRUSR | S_IWUSR ); + if( fd < 0 ) { + perror( "Unable to create testopen" ); + return 1; + } + + /* write some data into it so we know if truncate really works */ + memset( buf, 0, 4096 ); + + wres = write( fd, buf, 4096 ); + if( wres != 4096 ) { + perror( "Error writing" ); + (void)close( fd ); + return 1; + } + + (void)close( fd ); + + /* check if the file has size 4096 */ + res = stat( "./mnt/testopen", &s ); + if( res < 0 ) { + perror( "Error stating testopen" ); + return 1; + } + if( s.st_size == 4096 ) { + // OK + } else { + fprintf( stderr, "Size of file should be 4096, but is %jd\n", s.st_size ); + return 1; + } + + /* Second one should fail with EEXIST */ + fd = open( "./mnt/testopen", O_CREAT | O_EXCL | O_WRONLY, S_IRUSR | S_IWUSR ); + if( fd < 0 && errno == EEXIST ) { + // OK + } else { + fprintf( stderr, "Second create succedded and should not" ); + return 1; + } + + /* Third one should success and truncate the file */ + fd = open( "./mnt/testopen", O_CREAT | O_WRONLY | O_TRUNC, S_IRUSR | S_IWUSR ); + (void)close( fd ); + + /* check if the file has size zero */ + res = stat( "./mnt/testopen", &s ); + if( res < 0 ) { + perror( "Error stating testopen" ); + return 1; + } + if( s.st_size == 0 ) { + // OK + } else { + fprintf( stderr, "Size of file should be 0, but is %jd\n", s.st_size ); + return 1; + } + + res = unlink( "./mnt/testopen" ); + if( res < 0 ) { + perror( "Error removing testopen" ); + return 1; + } + + return 0; +} |