Index: ports/glibc-compat/src/test.cc |
diff --git a/ports/glibc-compat/src/test.cc b/ports/glibc-compat/src/test.cc |
index cbe5e13c71e65e96a43af45f6dcb9a9d31847432..61a82b9e95891563ccdbac80e7686cd728027e77 100644 |
--- a/ports/glibc-compat/src/test.cc |
+++ b/ports/glibc-compat/src/test.cc |
@@ -9,6 +9,12 @@ |
#include <stdlib.h> |
#include <sys/stat.h> |
#include <sys/types.h> |
+#include <sys/uio.h> |
+#include <fcntl.h> |
+#include <dirent.h> |
+#include <sys/file.h> |
+#include <err.h> |
+#include <time.h> |
#ifndef __GLIBC__ |
#include <sys/endian.h> |
@@ -29,7 +35,6 @@ TEST(TestMktemp, mkdtemp_errors) { |
ASSERT_EQ(EINVAL, errno); |
ASSERT_EQ((char*)NULL, mkdtemp(not_XXXXXX_suffix)); |
ASSERT_EQ(EINVAL, errno); |
- |
} |
TEST(TestMktemp, mkdtemp) { |
@@ -92,6 +97,68 @@ TEST(TestEndian, byte_swap) { |
} |
#endif |
+// readv is not implemented in glibc. |
+#ifndef __GLIBC__ |
+TEST(TestReadv, readv_writev) { |
+ struct iovec write_iov[3]; |
+ struct iovec read_iov[3]; |
+ char first[28], second[28], third[12]; |
+ read_iov[0].iov_base = first; |
+ read_iov[0].iov_len = sizeof(first); |
+ read_iov[1].iov_base = second; |
+ read_iov[1].iov_len = sizeof(second); |
+ read_iov[2].iov_base = third; |
+ read_iov[2].iov_len = sizeof(third); |
+ int i = 0; |
+ ssize_t ret = 0; |
+ const char* str1 = "abcdefghijklmnopqrstuvwxyz\n"; |
+ const char* str2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ\n"; |
+ const char* str3 = "0123456789\n"; |
+ write_iov[0].iov_base = (void*)str1; |
+ write_iov[0].iov_len = strlen(str1) + 1; |
+ write_iov[1].iov_base = (void*)str2; |
+ write_iov[1].iov_len = strlen(str2) + 1; |
+ write_iov[2].iov_base = (void*)str3; |
+ write_iov[2].iov_len = strlen(str3) + 1; |
+ int fd = open("test.txt", O_CREAT | O_WRONLY, S_IRUSR|S_IWUSR); |
+ ASSERT_NE(fd, -1); |
+ ret = writev(fd, write_iov, 3); |
+ ASSERT_NE(ret, -1); |
+ ASSERT_NE(close(fd), -1); |
+ fd = open("test.txt", O_RDONLY); |
+ ASSERT_NE(fd, -1); |
+ ret = readv(fd, read_iov, 3); |
+ ASSERT_NE(ret, -1); |
+ ASSERT_STREQ(str1, (const char*)read_iov[0].iov_base); |
+ ASSERT_EQ(28, read_iov[0].iov_len); |
+ ASSERT_STREQ(str2, (const char*)read_iov[1].iov_base); |
+ ASSERT_EQ(28, read_iov[1].iov_len); |
+ ASSERT_STREQ(str3, (const char*)read_iov[2].iov_base); |
+ ASSERT_EQ(12, read_iov[2].iov_len); |
+ ASSERT_NE(close(fd), -1); |
+ ASSERT_NE(-1, unlink("test.txt")); |
+} |
+#endif |
+ |
+// No tests for funtions ended with at, e.g. openat, fts_* |
+// fchdir is not implemented in sel_ldr |
+#if 0 |
+TEST(TestOpenat, openat) { |
+ ASSERT_NE(-1, mkdir("t1", S_IRWXU | S_IRWXG | S_IXGRP)); |
+ DIR* dir = opendir("t1"); |
+ ASSERT_NE((DIR*)NULL, dir); |
+ int fd_t1 = dirfd(dir); |
+ ASSERT_NE(-1, fd_t1); |
+ int fd_t2 = openat(fd_t1, "test.txt", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR); |
+ ASSERT_NE(-1, fd_t2); |
+ ASSERT_EQ(4, write(fd_t2, "test", 4)); |
+ ASSERT_NE(-1, close(fd_t2)); |
+ ASSERT_NE(-1, close(fd_t1)); |
+ ASSERT_NE(-1, unlink("t1/test.txt")); |
+ ASSERT_NE(-1, rmdir("t1")); |
+} |
+#endif |
+ |
TEST(TestLockf, lockf) { |
// The fcntl() method underlying lockf() is not implemented in NaCl. |
ASSERT_EQ(-1, lockf(1, F_LOCK, 1)); |
@@ -102,6 +169,33 @@ TEST(TestLockf, lockf) { |
ASSERT_EQ(ENOSYS, errno); |
} |
+TEST(TestFlock, flock) { |
+ // The fcntl() method underlying flock() is not implemented in NaCl. |
+ ASSERT_EQ(-1, flock(1, LOCK_SH)); |
+ ASSERT_EQ(ENOSYS, errno); |
+ ASSERT_EQ(-1, flock(1, LOCK_EX)); |
+ ASSERT_EQ(ENOSYS, errno); |
+ ASSERT_EQ(-1, flock(1, LOCK_UN)); |
+ ASSERT_EQ(ENOSYS, errno); |
+} |
+ |
+/* Calling err will cause the test program exit with failure code if errno |
+ * is set. No tests for err. |
+ */ |
+ |
+TEST(TestTimegm, timegm) { |
+ struct tm tmp; |
+ tmp.tm_sec = 1; |
+ tmp.tm_min = 0; |
+ tmp.tm_hour = 0; |
+ tmp.tm_mday = 3; |
+ tmp.tm_mon = 4 - 1; |
+ tmp.tm_year = 2015 - 1900; |
+ tmp.tm_isdst = -1; |
+ time_t tt = timegm(&tmp); |
+ ASSERT_EQ(1428019201, tt); |
+} |
+ |
int main(int argc, char** argv) { |
setenv("TERM", "xterm-256color", 0); |
::testing::InitGoogleTest(&argc, argv); |