]> git.ozlabs.org Git - ccan/blobdiff - noerr/test/run.c
Helper routines for saving errno in error paths.
[ccan] / noerr / test / run.c
diff --git a/noerr/test/run.c b/noerr/test/run.c
new file mode 100644 (file)
index 0000000..0cdd6d0
--- /dev/null
@@ -0,0 +1,48 @@
+#include "noerr/noerr.h"
+#include "tap.h"
+#include "noerr/noerr.c"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <assert.h>
+
+int main(int argc, char *argv[])
+{
+       /* tempnam(3) is generally a bad idea, but OK here. */
+       char *name = tempnam(NULL, "noerr");
+       int fd;
+
+       plan_tests(12);
+       /* Should fail to unlink. */
+       ok1(unlink(name) != 0);
+       ok1(errno == ENOENT);
+
+       /* This one should not set errno. */
+       errno = 100;
+       ok1(unlink_noerr(name) == ENOENT);
+       ok1(errno == 100);
+
+       /* Should fail to close. */
+       ok1(close(-1) != 0);
+       ok1(errno == EBADF);
+
+       /* This one should not set errno. */
+       errno = 100;
+       ok1(close_noerr(-1) == EBADF);
+       ok1(errno == 100);
+
+       /* Test successful close/unlink doesn't hit errno either. */
+       fd = open(name, O_WRONLY|O_CREAT|O_EXCL, 0600);
+       assert(fd >= 0);
+
+       errno = 100;
+       ok1(close_noerr(fd) == 0);
+       ok1(errno == 100);
+
+       errno = 100;
+       ok1(unlink_noerr(name) == 0);
+       ok1(errno == 100);
+
+       return exit_status();
+}