Index: native_client_sdk/src/tests/nacl_io_test/kernel_proxy_test.cc |
diff --git a/native_client_sdk/src/tests/nacl_io_test/kernel_proxy_test.cc b/native_client_sdk/src/tests/nacl_io_test/kernel_proxy_test.cc |
index 4c0ab087853b0c8d4b5275713fe2412cfffd8ec9..7009e0ca6be0c08788a26361f654f68848f01ae3 100644 |
--- a/native_client_sdk/src/tests/nacl_io_test/kernel_proxy_test.cc |
+++ b/native_client_sdk/src/tests/nacl_io_test/kernel_proxy_test.cc |
@@ -85,7 +85,7 @@ static int ki_fcntl_wrapper(int fd, int request, ...) { |
* or the filesystem node but directly in the FD mapping. |
*/ |
TEST_F(KernelProxyTest, Fcntl_GETFD) { |
- int fd = ki_open("/test", O_RDWR | O_CREAT); |
+ int fd = ki_open("/test", O_RDWR | O_CREAT, 0777); |
ASSERT_NE(-1, fd); |
// FD flags should start as zero. |
@@ -116,7 +116,7 @@ TEST_F(KernelProxyTest, FileLeak) { |
for (int file_num = 0; file_num < 4096; file_num++) { |
sprintf(filename, "/foo%i.tmp", file_num++); |
- int fd = ki_open(filename, O_WRONLY | O_CREAT); |
+ int fd = ki_open(filename, O_WRONLY | O_CREAT, 0777); |
ASSERT_GT(fd, -1); |
ASSERT_EQ(1, root->ChildCount()); |
ASSERT_EQ(buffer_size, ki_write(fd, garbage, buffer_size)); |
@@ -232,7 +232,7 @@ TEST_F(KernelProxyTest, SignalSigwinch) { |
TEST_F(KernelProxyTest, Rename) { |
// Create a dummy file |
- int file1 = ki_open("/test1.txt", O_RDWR | O_CREAT); |
+ int file1 = ki_open("/test1.txt", O_RDWR | O_CREAT, 0777); |
ASSERT_GT(file1, -1); |
ASSERT_EQ(0, ki_close(file1)); |
@@ -293,27 +293,27 @@ TEST_F(KernelProxyTest, FDPathMapping) { |
EXPECT_EQ(0, ki_mkdir("/example", S_IREAD | S_IWRITE)); |
ki_chdir("/foo"); |
- fd1 = ki_open("/example", O_RDONLY); |
+ fd1 = ki_open("/example", O_RDONLY, 0); |
EXPECT_NE(-1, fd1); |
EXPECT_EQ(ki_fchdir(fd1), 0); |
EXPECT_EQ(text, ki_getcwd(text, sizeof(text))); |
EXPECT_STREQ("/example", text); |
EXPECT_EQ(0, ki_chdir("/foo")); |
- fd2 = ki_open("../example", O_RDONLY); |
+ fd2 = ki_open("../example", O_RDONLY, 0); |
EXPECT_NE(-1, fd2); |
EXPECT_EQ(0, ki_fchdir(fd2)); |
EXPECT_EQ(text, ki_getcwd(text, sizeof(text))); |
EXPECT_STREQ("/example", text); |
EXPECT_EQ(0, ki_chdir("/foo")); |
- fd3 = ki_open("../test", O_CREAT | O_RDWR); |
+ fd3 = ki_open("../test", O_CREAT | O_RDWR, 0777); |
EXPECT_NE(-1, fd3); |
EXPECT_EQ(-1, ki_fchdir(fd3)); |
EXPECT_EQ(ENOTDIR, errno); |
EXPECT_EQ(0, ki_chdir("/foo")); |
- fd4 = ki_open("bar", O_RDONLY); |
+ fd4 = ki_open("bar", O_RDONLY, 0); |
EXPECT_EQ(0, ki_fchdir(fd4)); |
EXPECT_EQ(text, ki_getcwd(text, sizeof(text))); |
EXPECT_STREQ("/foo/bar", text); |
@@ -360,19 +360,19 @@ TEST_F(KernelProxyTest, MemMountIO) { |
EXPECT_EQ(0, ki_mkdir("/foo", S_IREAD | S_IWRITE)); |
// Fail to open "/foo/bar" |
- EXPECT_EQ(-1, ki_open("/foo/bar", O_RDONLY)); |
+ EXPECT_EQ(-1, ki_open("/foo/bar", O_RDONLY, 0)); |
EXPECT_EQ(ENOENT, errno); |
// Create bar "/foo/bar" |
- fd1 = ki_open("/foo/bar", O_RDWR | O_CREAT); |
+ fd1 = ki_open("/foo/bar", O_RDWR | O_CREAT, 0777); |
ASSERT_NE(-1, fd1); |
// Open (optionally create) bar "/foo/bar" |
- fd2 = ki_open("/foo/bar", O_RDWR | O_CREAT); |
+ fd2 = ki_open("/foo/bar", O_RDWR | O_CREAT, 0777); |
ASSERT_NE(-1, fd2); |
// Fail to exclusively create bar "/foo/bar" |
- EXPECT_EQ(-1, ki_open("/foo/bar", O_RDONLY | O_CREAT | O_EXCL)); |
+ EXPECT_EQ(-1, ki_open("/foo/bar", O_RDONLY | O_CREAT | O_EXCL, 0777)); |
EXPECT_EQ(EEXIST, errno); |
// Write hello and world to same node with different descriptors |
@@ -380,7 +380,7 @@ TEST_F(KernelProxyTest, MemMountIO) { |
EXPECT_EQ(5, ki_write(fd2, "WORLD", 5)); |
EXPECT_EQ(5, ki_write(fd1, "HELLO", 5)); |
- fd3 = ki_open("/foo/bar", O_RDONLY); |
+ fd3 = ki_open("/foo/bar", O_RDONLY, 0); |
ASSERT_NE(-1, fd3); |
len = ki_read(fd3, text, sizeof(text)); |
@@ -390,7 +390,7 @@ TEST_F(KernelProxyTest, MemMountIO) { |
EXPECT_EQ(0, ki_close(fd1)); |
EXPECT_EQ(0, ki_close(fd2)); |
- fd1 = ki_open("/foo/bar", O_WRONLY | O_APPEND); |
+ fd1 = ki_open("/foo/bar", O_WRONLY | O_APPEND, 0); |
ASSERT_NE(-1, fd1); |
EXPECT_EQ(5, ki_write(fd1, "WORLD", 5)); |
@@ -399,7 +399,7 @@ TEST_F(KernelProxyTest, MemMountIO) { |
text[len] = 0; |
EXPECT_STREQ("WORLD", text); |
- fd2 = ki_open("/foo/bar", O_RDONLY); |
+ fd2 = ki_open("/foo/bar", O_RDONLY, 0); |
ASSERT_NE(-1, fd2); |
len = ki_read(fd2, text, sizeof(text)); |
if (len > 0) |
@@ -415,9 +415,9 @@ TEST_F(KernelProxyTest, MemMountFTruncate) { |
// Open a file write only, write some text, then test that using a |
// separate file descriptor pointing to it that it is correctly |
// truncated at a specified number of bytes (2). |
- fd1 = ki_open("/trunc", O_WRONLY | O_CREAT); |
+ fd1 = ki_open("/trunc", O_WRONLY | O_CREAT, 0777); |
ASSERT_NE(-1, fd1); |
- fd2 = ki_open("/trunc", O_RDONLY); |
+ fd2 = ki_open("/trunc", O_RDONLY, 0); |
ASSERT_NE(-1, fd2); |
EXPECT_EQ(5, ki_write(fd1, "HELLO", 5)); |
EXPECT_EQ(0, ki_ftruncate(fd1, 2)); |
@@ -435,20 +435,20 @@ TEST_F(KernelProxyTest, MemMountTruncate) { |
// Open a file write only, write some text, then test that by |
// referring to it by its path and truncating it we correctly truncate |
// it at a specified number of bytes (2). |
- fd1 = ki_open("/trunc", O_WRONLY | O_CREAT); |
+ fd1 = ki_open("/trunc", O_WRONLY | O_CREAT, 0777); |
ASSERT_NE(-1, fd1); |
EXPECT_EQ(5, ki_write(fd1, "HELLO", 5)); |
EXPECT_EQ(0, ki_close(fd1)); |
EXPECT_EQ(0, ki_truncate("/trunc", 2)); |
// Verify the text is only 2 bytes long with new file descriptor. |
- fd1 = ki_open("/trunc", O_RDONLY); |
+ fd1 = ki_open("/trunc", O_RDONLY, 0); |
ASSERT_NE(-1, fd1); |
EXPECT_EQ(2, ki_read(fd1, text, sizeof(text))); |
EXPECT_EQ(0, ki_close(fd1)); |
} |
TEST_F(KernelProxyTest, MemMountLseek) { |
- int fd = ki_open("/foo", O_CREAT | O_RDWR); |
+ int fd = ki_open("/foo", O_CREAT | O_RDWR, 0777); |
ASSERT_GT(fd, -1); |
ASSERT_EQ(9, ki_write(fd, "Some text", 9)); |
@@ -468,7 +468,7 @@ TEST_F(KernelProxyTest, MemMountLseek) { |
} |
TEST_F(KernelProxyTest, CloseTwice) { |
- int fd = ki_open("/foo", O_CREAT | O_RDWR); |
+ int fd = ki_open("/foo", O_CREAT | O_RDWR, 0777); |
ASSERT_GT(fd, -1); |
EXPECT_EQ(9, ki_write(fd, "Some text", 9)); |
@@ -481,7 +481,7 @@ TEST_F(KernelProxyTest, CloseTwice) { |
} |
TEST_F(KernelProxyTest, MemMountDup) { |
- int fd = ki_open("/foo", O_CREAT | O_RDWR); |
+ int fd = ki_open("/foo", O_CREAT | O_RDWR, 0777); |
ASSERT_GT(fd, -1); |
int dup_fd = ki_dup(fd); |
@@ -495,7 +495,7 @@ TEST_F(KernelProxyTest, MemMountDup) { |
ASSERT_EQ(dup2_fd, ki_dup2(fd, dup2_fd)); |
ASSERT_EQ(9, ki_lseek(dup2_fd, 0, SEEK_CUR)); |
- int new_fd = ki_open("/bar", O_CREAT | O_RDWR); |
+ int new_fd = ki_open("/bar", O_CREAT | O_RDWR, 0777); |
ASSERT_EQ(fd, ki_dup2(new_fd, fd)); |
// fd, new_fd -> "/bar" |
@@ -513,7 +513,7 @@ TEST_F(KernelProxyTest, MemMountDup) { |
} |
TEST_F(KernelProxyTest, Lstat) { |
- int fd = ki_open("/foo", O_CREAT | O_RDWR); |
+ int fd = ki_open("/foo", O_CREAT | O_RDWR, 0777); |
ASSERT_GT(fd, -1); |
ASSERT_EQ(0, ki_mkdir("/bar", S_IREAD | S_IWRITE)); |
@@ -530,8 +530,17 @@ TEST_F(KernelProxyTest, Lstat) { |
EXPECT_EQ(ENOENT, errno); |
} |
+TEST_F(KernelProxyTest, OpenWithMode) { |
+ int fd = ki_open("/foo", O_CREAT | O_RDWR, 0723); |
+ ASSERT_GT(fd, -1); |
+ |
+ struct stat buf; |
+ EXPECT_EQ(0, ki_lstat("/foo", &buf)); |
+ EXPECT_EQ(0723, buf.st_mode & ~S_IFMT); |
+} |
+ |
TEST_F(KernelProxyTest, UseAfterClose) { |
- int fd = ki_open("/dummy", O_CREAT | O_WRONLY); |
+ int fd = ki_open("/dummy", O_CREAT | O_WRONLY, 0777); |
ASSERT_GT(fd, -1); |
EXPECT_EQ(5, ki_write(fd, "hello", 5)); |
EXPECT_EQ(0, ki_close(fd)); |
@@ -627,7 +636,7 @@ TEST_F(KernelProxyMountTest, MountAndIoctl) { |
char path[100]; |
snprintf(path, 100, "dev/fs/%d", g_fs_dev); |
- int fd = ki_open(path, O_RDONLY); |
+ int fd = ki_open(path, O_RDONLY, 0); |
ASSERT_GT(fd, -1); |
EXPECT_EQ(0, ki_ioctl_wrapper(fd, 0xdeadbeef)); |
@@ -701,7 +710,8 @@ class KernelProxyMMapTest_Node : public Node { |
class KernelProxyMMapTest_Filesystem : public Filesystem { |
public: |
- virtual Error Open(const Path& path, int mode, ScopedNode* out_node) { |
+ virtual Error OpenWithMode(const Path& path, int open_flags, |
+ mode_t mode, ScopedNode* out_node) { |
out_node->reset(new KernelProxyMMapTest_Node(this)); |
return 0; |
} |
@@ -747,7 +757,7 @@ class KernelProxyMMapTest : public ::testing::Test { |
TEST_F(KernelProxyMMapTest, MMap) { |
ASSERT_EQ(0, ki_umount("/")); |
ASSERT_EQ(0, ki_mount("", "/", "mmapfs", 0, NULL)); |
- int fd = ki_open("/file", O_RDWR | O_CREAT); |
+ int fd = ki_open("/file", O_RDWR | O_CREAT, 0777); |
ASSERT_NE(-1, fd); |
void* addr1 = ki_mmap(NULL, 0x800, PROT_READ, MAP_PRIVATE, fd, 0); |
@@ -829,8 +839,8 @@ class KernelProxyErrorTest : public ::testing::Test { |
TEST_F(KernelProxyErrorTest, WriteError) { |
ScopedRef<MockFs> mock_fs(fs()); |
ScopedRef<MockNode> mock_node(new MockNode(&*mock_fs)); |
- EXPECT_CALL(*mock_fs, Open(_, _, _)) |
- .WillOnce(DoAll(SetArgPointee<2>(mock_node), Return(0))); |
+ EXPECT_CALL(*mock_fs, OpenWithMode(_, _, _, _)) |
+ .WillOnce(DoAll(SetArgPointee<3>(mock_node), Return(0))); |
EXPECT_CALL(*mock_node, Write(_, _, _, _)) |
.WillOnce(DoAll(SetArgPointee<3>(0), // Wrote 0 bytes. |
@@ -838,7 +848,7 @@ TEST_F(KernelProxyErrorTest, WriteError) { |
EXPECT_CALL(*mock_node, Destroy()).Times(1); |
- int fd = ki_open("/dummy", O_WRONLY); |
+ int fd = ki_open("/dummy", O_WRONLY, 0); |
EXPECT_NE(0, fd); |
char buf[20]; |
@@ -851,8 +861,8 @@ TEST_F(KernelProxyErrorTest, WriteError) { |
TEST_F(KernelProxyErrorTest, ReadError) { |
ScopedRef<MockFs> mock_fs(fs()); |
ScopedRef<MockNode> mock_node(new MockNode(&*mock_fs)); |
- EXPECT_CALL(*mock_fs, Open(_, _, _)) |
- .WillOnce(DoAll(SetArgPointee<2>(mock_node), Return(0))); |
+ EXPECT_CALL(*mock_fs, OpenWithMode(_, _, _, _)) |
+ .WillOnce(DoAll(SetArgPointee<3>(mock_node), Return(0))); |
EXPECT_CALL(*mock_node, Read(_, _, _, _)) |
.WillOnce(DoAll(SetArgPointee<3>(0), // Read 0 bytes. |
@@ -860,7 +870,7 @@ TEST_F(KernelProxyErrorTest, ReadError) { |
EXPECT_CALL(*mock_node, Destroy()).Times(1); |
- int fd = ki_open("/dummy", O_RDONLY); |
+ int fd = ki_open("/dummy", O_RDONLY, 0); |
EXPECT_NE(0, fd); |
char buf[20]; |