+TEST_F(KernelProxyTest, Utimes) {
+ struct timeval times[2];
+ times[0].tv_sec = 1000;
+ times[0].tv_usec = 2000;
+ times[1].tv_sec = 3000;
+ times[1].tv_usec = 4000;
+
+ int fd = ki_open("/dummy", O_CREAT | O_WRONLY, 0222);
+ ASSERT_GT(fd, -1);
+ EXPECT_EQ(0, ki_close(fd));
+
+ // utime should work if the file is write-only.
+ EXPECT_EQ(0, ki_utimes("/dummy", times));
+
+ // utime should work on directories (which can never be opened for write)
+ EXPECT_EQ(0, ki_utimes("/", times));
+
+ // or if the file is read-only.
+ EXPECT_EQ(0, ki_chmod("/dummy", 0444));
+ EXPECT_EQ(0, ki_utimes("/dummy", times));
+
+ // times can be NULL. In that case the access/mod times will be set to the
+ // current time.
+ struct timeval tm;
+ EXPECT_EQ(0, gettimeofday(&tm, NULL));
+
+ EXPECT_EQ(0, ki_utimes("/dummy", NULL));
+ struct stat buf;
+ EXPECT_EQ(0, ki_stat("/dummy", &buf));
+
+ EXPECT_GE(buf.st_atime, tm.tv_sec);
+ EXPECT_GE(buf.st_atimensec, tm.tv_usec * 1000);
+ EXPECT_GE(buf.st_mtime, tm.tv_sec);
+ EXPECT_GE(buf.st_mtimensec, tm.tv_usec * 1000);
+}
+
+TEST_F(KernelProxyTest, Utime) {
+ struct utimbuf times;
+ times.actime = 1000;
+ times.modtime = 2000;
+
+ int fd = ki_open("/dummy", O_CREAT | O_WRONLY, 0222);
+ ASSERT_GT(fd, -1);
+ EXPECT_EQ(0, ki_close(fd));
+
+ // utime should work if the file is write-only.
+ EXPECT_EQ(0, ki_utime("/dummy", ×));
+
+ // or if the file is read-only.
+ EXPECT_EQ(0, ki_chmod("/dummy", 0444));
+ EXPECT_EQ(0, ki_utime("/dummy", ×));
+
+ // times can be NULL. In that case the access/mod times will be set to the
+ // current time.
+ struct timeval tm;
+ EXPECT_EQ(0, gettimeofday(&tm, NULL));
+
+ EXPECT_EQ(0, ki_utime("/dummy", NULL));
+ struct stat buf;
+ EXPECT_EQ(0, ki_stat("/dummy", &buf));
+
+ EXPECT_GE(buf.st_atime, tm.tv_sec);
+ EXPECT_GE(buf.st_atimensec, tm.tv_usec * 1000);
+ EXPECT_GE(buf.st_mtime, tm.tv_sec);
+ EXPECT_GE(buf.st_mtimensec, tm.tv_usec * 1000);
+}
+
+TEST_F(KernelProxyTest, Umask) {
+ mode_t oldmask = ki_umask(0222);
+ EXPECT_EQ(0, oldmask);
+
+ int fd = ki_open("/foo", O_CREAT | O_RDONLY, 0666);
+ ASSERT_GT(fd, -1);
+ ki_close(fd);
+
+ EXPECT_EQ(0, ki_mkdir("/dir", 0777));
+
+ struct stat buf;
+ EXPECT_EQ(0, ki_stat("/foo", &buf));
+ EXPECT_EQ(0444, buf.st_mode & 0777);
+
+ EXPECT_EQ(0, ki_stat("/dir", &buf));
+ EXPECT_EQ(0555, buf.st_mode & 0777);
+
+ EXPECT_EQ(0222, ki_umask(0));
+}
+