diff options
-rw-r--r-- | test/misc/tst-mkostemps.c | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/test/misc/tst-mkostemps.c b/test/misc/tst-mkostemps.c new file mode 100644 index 000000000..2f45bfd99 --- /dev/null +++ b/test/misc/tst-mkostemps.c @@ -0,0 +1,159 @@ +/* + * Test application for mkstemp/mkstemps/mkostemp/mkostemps + * Copyright (C) 2015 by Romain Naour <romain.naour@openwide.fr> + * + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ + +#include <stdio.h> +#include <stdlib.h> +#include <sys/stat.h> +#include <unistd.h> +#include <fcntl.h> +#include <errno.h> + +#define assert(x) \ + if (!(x)) \ + { \ + fputs ("test failed: " #x "\n", stderr); \ + retval = 1; \ + goto the_end; \ + } + +int +main (int argc, char *argv[]) +{ + char name[256]; + char name_suffix[256]; + FILE *fp = NULL; + int retval = 0; + int fd; + int flags = O_RDONLY | O_CLOEXEC; + struct stat sb_f1; + struct stat sb_f2; + + /* mkstemp test */ + sprintf(name, "%s-uClibc-test.XXXXXX", __FILE__); + + fd = mkstemp(name); + + fstat(fd, &sb_f1); + assert ((sb_f1.st_mode & S_IFMT) == S_IFREG) + + stat(name, &sb_f2); + assert ((sb_f2.st_mode & S_IFMT) == S_IFREG) + + assert (sb_f1.st_ino == sb_f2.st_ino) + + close(fd); + unlink (name); + + /* mkstemps test */ + sprintf(name_suffix, "%s-uClibc-test.XXXXXX.txt", __FILE__); + + fd = mkstemps(name_suffix, 4); + + fstat(fd, &sb_f1); + assert ((sb_f1.st_mode & S_IFMT) == S_IFREG) + + stat(name_suffix, &sb_f2); + assert ((sb_f2.st_mode & S_IFMT) == S_IFREG) + + assert (sb_f1.st_ino == sb_f2.st_ino) + + close(fd); + unlink (name_suffix); + + /* mkostemp test */ + sprintf(name, "%s-uClibc-test.XXXXXX", __FILE__); + + fd = mkostemp(name, flags); + + fstat(fd, &sb_f1); + assert ((sb_f1.st_mode & S_IFMT) == S_IFREG) + + stat(name, &sb_f2); + assert ((sb_f2.st_mode & S_IFMT) == S_IFREG) + + assert (sb_f1.st_ino == sb_f2.st_ino) + assert (sb_f1.st_mode == sb_f2.st_mode) + + close(fd); + unlink (name); + + /* mkostemps test */ + sprintf(name_suffix, "%s-uClibc-test.XXXXXX.txt", __FILE__); + + fd = mkostemps(name_suffix, 4, flags); + + fstat(fd, &sb_f1); + assert ((sb_f1.st_mode & S_IFMT) == S_IFREG) + + stat(name, &sb_f2); + assert ((sb_f2.st_mode & S_IFMT) == S_IFREG) + + assert (sb_f1.st_ino == sb_f2.st_ino) + assert (sb_f1.st_mode == sb_f2.st_mode) + + close(fd); + unlink (name_suffix); + + /* suffixlen = 0 */ + sprintf(name_suffix, "%s-uClibc-test.XXXXXX", __FILE__); + + fd = mkostemps(name_suffix, 0, flags); + + fstat(fd, &sb_f1); + assert ((sb_f1.st_mode & S_IFMT) == S_IFREG) + + stat(name, &sb_f2); + assert ((sb_f2.st_mode & S_IFMT) == S_IFREG) + + assert (sb_f1.st_ino == sb_f2.st_ino) + assert (sb_f1.st_mode == sb_f2.st_mode) + + close(fd); + unlink (name_suffix); + + /* stress tests */ + + /* template len < 6 */ + sprintf(name, "XXXXX"); + + fd = mkstemp(name); + + assert(fd == -1); + assert(errno == EINVAL); + + /* suffixlen < 0 */ + sprintf(name_suffix, "%s-uClibc-test.XXXXXX.txt", __FILE__); + + fd = mkostemps(name_suffix, -1, flags); + + assert(fd == -1); + assert(errno == EINVAL); + + /* Missing one X */ + sprintf(name_suffix, "%s-uClibc-test.XXXXX.txt", __FILE__); + + fd = mkostemps(name_suffix, 4, flags); + + assert(fd == -1); + assert(errno == EINVAL); + + /* wrong suffixlen */ + sprintf(name_suffix, "%s-uClibc-test.XXXXXX.txt", __FILE__); + + fd = mkostemps(name_suffix, 2, flags); + + assert(fd == -1); + assert(errno == EINVAL); + +the_end: + if (fp != NULL) + assert (fclose (fp) == 0); + unlink (name); + unlink (name_suffix); + + return retval; +} |