diff options
Diffstat (limited to 'tests/stdio')
-rw-r--r-- | tests/stdio/test_fgetc_ungetc.c | 7 | ||||
-rw-r--r-- | tests/stdio/test_rename.c | 107 |
2 files changed, 112 insertions, 2 deletions
diff --git a/tests/stdio/test_fgetc_ungetc.c b/tests/stdio/test_fgetc_ungetc.c index c69a3d1a..0eea4007 100644 --- a/tests/stdio/test_fgetc_ungetc.c +++ b/tests/stdio/test_fgetc_ungetc.c @@ -1,5 +1,6 @@ #include <assert.h> #include <fcntl.h> +#include <signal.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -47,7 +48,9 @@ void test() { ungetc('a', file); err = fgetc(file); assert(err == (int)'a'); - fread(buffer, sizeof(char), sizeof(buffer), file); + int r = fread(buffer, sizeof(char), sizeof(buffer), file); + assert(r == 3); + buffer[3] = 0; assert(!strcmp(buffer, "bcd")); // rewind and fseek should reset anything that's been @@ -84,4 +87,4 @@ int main() { setup(); test(); return EXIT_SUCCESS; -}
\ No newline at end of file +} diff --git a/tests/stdio/test_rename.c b/tests/stdio/test_rename.c new file mode 100644 index 00000000..20ffb513 --- /dev/null +++ b/tests/stdio/test_rename.c @@ -0,0 +1,107 @@ +#include <assert.h> +#include <errno.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sys/stat.h> + +void create_file(const char *path, const char *buffer, int mode) { + int fd = open(path, O_WRONLY | O_CREAT | O_EXCL, mode); + assert(fd >= 0); + + int err = write(fd, buffer, sizeof(char) * strlen(buffer)); + assert(err == (sizeof(char) * strlen(buffer))); + + close(fd); +} + +void setup() { + create_file("file", "abcdef", 0777); + mkdir("dir", 0777); + create_file("dir/file", "abcdef", 0777); + mkdir("dir/subdir", 0777); + mkdir("dir-readonly", 0555); + mkdir("dir-nonempty", 0777); + create_file("dir-nonempty/file", "abcdef", 0777); +} + +void cleanup() { + // we're hulk-smashing and removing original + renamed files to + // make sure we get it all regardless of anything failing + unlink("file"); + unlink("dir/file"); + unlink("dir/file1"); + unlink("dir/file2"); + rmdir("dir/subdir"); + rmdir("dir/subdir1"); + rmdir("dir/subdir2"); + rmdir("dir"); + rmdir("dir-readonly"); + unlink("dir-nonempty/file"); + rmdir("dir-nonempty"); +} + +void test() { + int err; + + // can't rename something that doesn't exist + err = rename("noexist", "dir"); + assert(err == -1); + assert(errno == ENOENT); + + // can't overwrite a folder with a file + err = rename("file", "dir"); + assert(err == -1); + assert(errno == EISDIR); + + // can't overwrite a file with a folder + err = rename("dir", "file"); + assert(err == -1); + assert(errno == ENOTDIR); + + // can't overwrite a non-empty folder + err = rename("dir", "dir-nonempty"); + assert(err == -1); + assert(errno == ENOTEMPTY); + + // can't create anything in a read-only directory + err = rename("dir", "dir-readonly/dir"); + assert(err == -1); + assert(errno == EACCES); + + // source should not be ancestor of target + err = rename("dir", "dir/somename"); + assert(err == -1); + assert(errno == EINVAL); + + // target should not be an ancestor of source + err = rename("dir/subdir", "dir"); + assert(err == -1); + assert(errno == ENOTEMPTY); + + // do some valid renaming + err = rename("dir/file", "dir/file1"); + assert(!err); + err = rename("dir/file1", "dir/file2"); + assert(!err); + err = access("dir/file2", F_OK); + assert(!err); + err = rename("dir/subdir", "dir/subdir1"); + assert(!err); + err = rename("dir/subdir1", "dir/subdir2"); + assert(!err); + err = access("dir/subdir2", F_OK); + assert(!err); + + puts("success"); +} + +int main() { + atexit(cleanup); + signal(SIGABRT, cleanup); + setup(); + test(); + return EXIT_SUCCESS; +}
\ No newline at end of file |