aboutsummaryrefslogtreecommitdiff
path: root/tests/utime/test_utime.c
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2013-07-13 12:24:47 -0700
committerAlon Zakai <alonzakai@gmail.com>2013-07-13 12:24:47 -0700
commit4db73843b367c57ad900a739bf8dec5f1799552c (patch)
tree438b0151ea45188120c56457aa46f17634ee92d0 /tests/utime/test_utime.c
parentce440b5a43c800fa363bd23b64ba8b34020ec1c1 (diff)
parentc089e7d8c6b7f9a5eae596dcdb6df4e2eceac42e (diff)
Merge pull request #1376 from inolen/utime_fixes
utime fixes
Diffstat (limited to 'tests/utime/test_utime.c')
-rw-r--r--tests/utime/test_utime.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/tests/utime/test_utime.c b/tests/utime/test_utime.c
new file mode 100644
index 00000000..1793f4a5
--- /dev/null
+++ b/tests/utime/test_utime.c
@@ -0,0 +1,53 @@
+#include <assert.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <utime.h>
+#include <sys/stat.h>
+
+void setup() {
+ mkdir("writeable", 0777);
+ mkdir("unwriteable", 0111);
+}
+
+void cleanup() {
+ rmdir("writeable");
+ rmdir("unwriteable");
+}
+
+void test() {
+ struct stat s;
+ // currently, the most recent timestamp is shared for atime,
+ // ctime and mtime. using unique values for each in the test
+ // will fail
+ struct utimbuf t = {1000000000, 1000000000};
+
+ utime("writeable", &t);
+ assert(!errno);
+ memset(&s, 0, sizeof s);
+ stat("writeable", &s);
+ assert(s.st_atime == t.actime);
+ assert(s.st_mtime == t.modtime);
+
+ // write permissions aren't checked when setting node
+ // attributes unless the user uid isn't the owner (so
+ // therefor, this should work fine)
+ utime("unwriteable", &t);
+ assert(!errno);
+ memset(&s, 0, sizeof s);
+ stat("unwriteable", &s);
+ assert(s.st_atime == t.actime);
+ assert(s.st_mtime == t.modtime);
+
+ puts("success");
+}
+
+int main() {
+ atexit(cleanup);
+ signal(SIGABRT, cleanup);
+ setup();
+ test();
+ return EXIT_SUCCESS;
+} \ No newline at end of file