aboutsummaryrefslogtreecommitdiff
path: root/tests/dirent/test_readdir.c
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-07-13 12:38:31 -0700
committerAlon Zakai <alonzakai@gmail.com>2013-07-13 12:38:31 -0700
commit673ea2ec24decdcfd5321f13dd68603b158dc5c5 (patch)
tree3d987c45b45fd95a4c89c9de715abbed19091a60 /tests/dirent/test_readdir.c
parent4db73843b367c57ad900a739bf8dec5f1799552c (diff)
parent49e6272b097fc930717998213d5c52c96fd6e3e6 (diff)
Merge pull request #1372 from inolen/dirent_fixes
minor fixes to return codes of closedir, telldir
Diffstat (limited to 'tests/dirent/test_readdir.c')
-rw-r--r--tests/dirent/test_readdir.c132
1 files changed, 132 insertions, 0 deletions
diff --git a/tests/dirent/test_readdir.c b/tests/dirent/test_readdir.c
new file mode 100644
index 00000000..9f7b12e8
--- /dev/null
+++ b/tests/dirent/test_readdir.c
@@ -0,0 +1,132 @@
+#include <assert.h>
+#include <dirent.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/stat.h>
+
+static 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() {
+ mkdir("nocanread", 0111);
+ mkdir("foobar", 0777);
+ create_file("foobar/file.txt", "ride into the danger zone", 0666);
+}
+
+void cleanup() {
+ rmdir("nocanread");
+ unlink("foobar/file.txt");
+ rmdir("foobar");
+}
+
+void test() {
+ int err;
+ int loc;
+ DIR *dir;
+ struct dirent *ent;
+ struct dirent ent_r;
+ struct dirent *result;
+
+ // check bad opendir input
+ dir = opendir("noexist");
+ assert(!dir);
+ assert(errno == ENOENT);
+ dir = opendir("nocanread");
+ assert(!dir);
+ assert(errno == EACCES);
+ dir = opendir("foobar/file.txt");
+ assert(!dir);
+ assert(errno == ENOTDIR);
+
+ // check bad readdir input
+ dir = opendir("foobar");
+ closedir(dir);
+ ent = readdir(dir);
+ assert(!ent);
+ assert(errno == EBADF);
+
+ // check bad readdir_r input
+ dir = opendir("foobar");
+ closedir(dir);
+ err = readdir_r(dir, NULL, &result);
+ assert(err == EBADF);
+
+ //
+ // do a normal read with readdir
+ //
+ dir = opendir("foobar");
+ assert(dir);
+ ent = readdir(dir);
+ assert(!strcmp(ent->d_name, "."));
+ assert(ent->d_type & DT_DIR);
+ ent = readdir(dir);
+ assert(!strcmp(ent->d_name, ".."));
+ assert(ent->d_type & DT_DIR);
+ ent = readdir(dir);
+ assert(!strcmp(ent->d_name, "file.txt"));
+ assert(ent->d_type & DT_REG);
+ ent = readdir(dir);
+ assert(!ent);
+
+ // test rewinddir
+ rewinddir(dir);
+ ent = readdir(dir);
+ assert(!strcmp(ent->d_name, "."));
+
+ // test seek / tell
+ rewinddir(dir);
+ ent = readdir(dir);
+ assert(!strcmp(ent->d_name, "."));
+ loc = telldir(dir);
+ ent = readdir(dir);
+ assert(!strcmp(ent->d_name, ".."));
+ ent = readdir(dir);
+ assert(!strcmp(ent->d_name, "file.txt"));
+ seekdir(dir, loc);
+ ent = readdir(dir);
+ assert(!strcmp(ent->d_name, ".."));
+
+ //
+ // do a normal read with readdir_r
+ //
+ rewinddir(dir);
+ err = readdir_r(dir, &ent_r, &result);
+ assert(!err);
+ assert(&ent_r == result);
+ assert(!strcmp(ent_r.d_name, "."));
+ err = readdir_r(dir, &ent_r, &result);
+ assert(!err);
+ assert(&ent_r == result);
+ assert(!strcmp(ent_r.d_name, ".."));
+ err = readdir_r(dir, &ent_r, &result);
+ assert(!err);
+ assert(&ent_r == result);
+ assert(!strcmp(ent_r.d_name, "file.txt"));
+ err = readdir_r(dir, &ent_r, &result);
+ assert(!err);
+ assert(!result);
+
+ err = closedir(dir);
+ assert(!err);
+
+ puts("success");
+}
+
+int main() {
+ atexit(cleanup);
+ signal(SIGABRT, cleanup);
+ setup();
+ test();
+ return EXIT_SUCCESS;
+} \ No newline at end of file