Index: native_client_sdk/src/tests/nacl_io_test/kernel_wrap_test.cc |
diff --git a/native_client_sdk/src/tests/nacl_io_test/kernel_wrap_test.cc b/native_client_sdk/src/tests/nacl_io_test/kernel_wrap_test.cc |
index d0f59b467caa5a5f9ff460662d2c7302e238557e..299592bb903582571259735622bde73cdc95d463 100644 |
--- a/native_client_sdk/src/tests/nacl_io_test/kernel_wrap_test.cc |
+++ b/native_client_sdk/src/tests/nacl_io_test/kernel_wrap_test.cc |
@@ -64,6 +64,10 @@ MATCHER_P(IsEqualToStatbuf, statbuf, "") { |
#undef COMPARE_FIELD |
+ACTION_P(SetErrno, value) { |
+ errno = value; |
+} |
+ |
ACTION_P(SetStat, statbuf) { |
memset(arg1, 0, sizeof(struct stat)); |
arg1->st_dev = statbuf->st_dev; |
@@ -95,6 +99,7 @@ void MakeDummyStatbuf(struct stat* statbuf) { |
} |
const mode_t kDummyMode = 0xbeef; |
+const int kDummyErrno = 0xfeeb; |
const int kDummyInt = 0xdedbeef; |
const int kDummyInt2 = 0xcabba6e; |
const int kDummyInt3 = 0xf00ba4; |
@@ -112,6 +117,10 @@ class KernelWrapTest : public ::testing::Test { |
KernelWrapTest() {} |
virtual void SetUp() { |
+ // Initialize the global errno value to a consistent value rather than |
+ // relying on its value from previous test runs. |
+ errno = 0; |
+ |
// Initializing the KernelProxy opens stdin/stdout/stderr. |
EXPECT_CALL(mock, open(_, _)) |
.WillOnce(Return(0)) |
@@ -157,19 +166,24 @@ class KernelWrapTest : public ::testing::Test { |
} // namespace |
TEST_F(KernelWrapTest, access) { |
- EXPECT_CALL(mock, access(kDummyConstChar, kDummyInt)) .WillOnce(Return(-1)); |
- EXPECT_EQ(-1, access(kDummyConstChar, kDummyInt)); |
- |
EXPECT_CALL(mock, access(kDummyConstChar, kDummyInt)) .WillOnce(Return(0)); |
EXPECT_EQ(0, access(kDummyConstChar, kDummyInt)); |
+ |
+ EXPECT_CALL(mock, access(kDummyConstChar, kDummyInt)) |
+ .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
+ EXPECT_EQ(-1, access(kDummyConstChar, kDummyInt)); |
+ EXPECT_EQ(kDummyErrno, errno); |
+ |
} |
TEST_F(KernelWrapTest, chdir) { |
- EXPECT_CALL(mock, chdir(kDummyConstChar)).WillOnce(Return(-1)); |
- EXPECT_EQ(-1, chdir(kDummyConstChar)); |
- |
EXPECT_CALL(mock, chdir(kDummyConstChar)).WillOnce(Return(0)); |
EXPECT_EQ(0, chdir(kDummyConstChar)); |
+ |
+ EXPECT_CALL(mock, chdir(kDummyConstChar)) |
+ .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
+ EXPECT_EQ(-1, chdir(kDummyConstChar)); |
+ ASSERT_EQ(kDummyErrno, errno); |
} |
TEST_F(KernelWrapTest, chmod) { |
@@ -188,11 +202,14 @@ TEST_F(KernelWrapTest, close) { |
// The way we wrap close does not support returning arbitrary values, so we |
// test 0 and -1. |
EXPECT_CALL(mock, close(kDummyInt)) |
- .WillOnce(Return(0)) |
- .WillOnce(Return(-1)); |
+ .WillOnce(Return(0)); |
EXPECT_EQ(0, close(kDummyInt)); |
+ |
+ EXPECT_CALL(mock, close(kDummyInt)) |
+ .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
EXPECT_EQ(-1, close(kDummyInt)); |
+ ASSERT_EQ(kDummyErrno, errno); |
} |
TEST_F(KernelWrapTest, dup) { |
@@ -205,24 +222,29 @@ TEST_F(KernelWrapTest, dup2) { |
// or the value of the new fd. |
EXPECT_CALL(mock, dup2(kDummyInt, kDummyInt2)) |
.WillOnce(Return(kDummyInt2)) |
- .WillOnce(Return(-1)); |
+ .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
+ |
EXPECT_EQ(kDummyInt2, dup2(kDummyInt, kDummyInt2)); |
EXPECT_EQ(-1, dup2(kDummyInt, kDummyInt2)); |
+ ASSERT_EQ(kDummyErrno, errno); |
} |
TEST_F(KernelWrapTest, fchdir) { |
EXPECT_CALL(mock, fchdir(kDummyInt)) |
- .WillOnce(Return(-1)); |
+ .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
+ |
EXPECT_EQ(-1, fchdir(kDummyInt)); |
+ ASSERT_EQ(kDummyErrno, errno); |
} |
TEST_F(KernelWrapTest, fchmod) { |
EXPECT_CALL(mock, fchmod(kDummyInt, kDummyMode)) |
- .WillOnce(Return(-1)); |
- EXPECT_EQ(-1, fchmod(kDummyInt, kDummyMode)); |
+ .WillOnce(Return(0)) |
+ .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
- EXPECT_CALL(mock, fchmod(kDummyInt, kDummyMode)) .WillOnce(Return(0)); |
EXPECT_EQ(0, fchmod(kDummyInt, kDummyMode)); |
+ EXPECT_EQ(-1, fchmod(kDummyInt, kDummyMode)); |
+ ASSERT_EQ(kDummyErrno, errno); |
} |
TEST_F(KernelWrapTest, fchown) { |
@@ -239,11 +261,12 @@ TEST_F(KernelWrapTest, fcntl) { |
} |
TEST_F(KernelWrapTest, fdatasync) { |
- EXPECT_CALL(mock, fdatasync(kDummyInt)).WillOnce(Return(-1)); |
- EXPECT_EQ(-1, fdatasync(kDummyInt)); |
+ EXPECT_CALL(mock, fdatasync(kDummyInt)).WillOnce(Return(0)) |
+ .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
- EXPECT_CALL(mock, fdatasync(kDummyInt)).WillOnce(Return(0)); |
EXPECT_EQ(0, fdatasync(kDummyInt)); |
+ EXPECT_EQ(-1, fdatasync(kDummyInt)); |
+ ASSERT_EQ(kDummyErrno, errno); |
} |
TEST_F(KernelWrapTest, fstat) { |
@@ -253,11 +276,14 @@ TEST_F(KernelWrapTest, fstat) { |
MakeDummyStatbuf(&in_statbuf); |
EXPECT_CALL(mock, fstat(kDummyInt, _)) |
.WillOnce(DoAll(SetStat(&in_statbuf), Return(0))) |
- .WillOnce(Return(-1)); |
+ .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
struct stat out_statbuf; |
+ |
EXPECT_EQ(0, fstat(kDummyInt, &out_statbuf)); |
EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf)); |
+ |
EXPECT_EQ(-1, fstat(kDummyInt, &out_statbuf)); |
+ ASSERT_EQ(kDummyErrno, errno); |
} |
TEST_F(KernelWrapTest, ftruncate) { |
@@ -267,8 +293,10 @@ TEST_F(KernelWrapTest, ftruncate) { |
} |
TEST_F(KernelWrapTest, fsync) { |
- EXPECT_CALL(mock, fsync(kDummyInt)).WillOnce(Return(-1)); |
+ EXPECT_CALL(mock, fsync(kDummyInt)) |
+ .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
EXPECT_EQ(-1, fsync(kDummyInt)); |
+ ASSERT_EQ(kDummyErrno, errno); |
} |
TEST_F(KernelWrapTest, getcwd) { |
@@ -412,15 +440,13 @@ TEST_F(KernelWrapTest, munmap) { |
munmap(kDummyVoidPtr, kDummySizeT); |
} |
- |
TEST_F(KernelWrapTest, open) { |
// We pass O_RDONLY because we do not want an error in flags translation |
EXPECT_CALL(mock, open(kDummyConstChar, 0)) |
+ .WillOnce(Return(kDummyInt2)) |
.WillOnce(Return(kDummyInt2)); |
- EXPECT_EQ(kDummyInt2, open(kDummyConstChar, 0)); |
- EXPECT_CALL(mock, open(kDummyConstChar, 0)) |
- .WillOnce(Return(kDummyInt2)); |
+ EXPECT_EQ(kDummyInt2, open(kDummyConstChar, 0)); |
EXPECT_EQ(kDummyInt2, open(kDummyConstChar, 0)); |
} |
@@ -442,12 +468,12 @@ TEST_F(KernelWrapTest, readlink) { |
char buf[10]; |
EXPECT_CALL(mock, readlink(kDummyConstChar, buf, 10)) |
- .WillOnce(Return(-1)); |
- EXPECT_EQ(-1, readlink(kDummyConstChar, buf, 10)); |
+ .WillOnce(Return(kDummyInt)) |
+ .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
- EXPECT_CALL(mock, readlink(kDummyConstChar, buf, 10)) |
- .WillOnce(Return(kDummyInt)); |
EXPECT_EQ(kDummyInt, readlink(kDummyConstChar, buf, 10)); |
+ EXPECT_EQ(-1, readlink(kDummyConstChar, buf, 10)); |
+ ASSERT_EQ(kDummyErrno, errno); |
} |
#ifdef __GLIBC__ |
@@ -461,12 +487,12 @@ TEST_F(KernelWrapTest, remove) { |
TEST_F(KernelWrapTest, rename) { |
EXPECT_CALL(mock, rename(kDummyConstChar, kDummyConstChar2)) |
- .WillOnce(Return(-1)); |
- EXPECT_EQ(-1, rename(kDummyConstChar, kDummyConstChar2)); |
+ .WillOnce(Return(0)) |
+ .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
- EXPECT_CALL(mock, rename(kDummyConstChar, kDummyConstChar2)) |
- .WillOnce(Return(0)); |
EXPECT_EQ(0, rename(kDummyConstChar, kDummyConstChar2)); |
+ EXPECT_EQ(-1, rename(kDummyConstChar, kDummyConstChar2)); |
+ ASSERT_EQ(kDummyErrno, errno); |
} |
TEST_F(KernelWrapTest, rmdir) { |
@@ -504,11 +530,14 @@ TEST_F(KernelWrapTest, stat) { |
MakeDummyStatbuf(&in_statbuf); |
EXPECT_CALL(mock, stat(StrEq(kDummyConstChar), _)) |
.WillOnce(DoAll(SetStat(&in_statbuf), Return(0))) |
- .WillOnce(Return(-1)); |
+ .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
struct stat out_statbuf; |
+ |
EXPECT_EQ(0, stat(kDummyConstChar, &out_statbuf)); |
EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf)); |
+ |
EXPECT_EQ(-1, stat(kDummyConstChar, &out_statbuf)); |
+ ASSERT_EQ(kDummyErrno, errno); |
} |
TEST_F(KernelWrapTest, symlink) { |
@@ -544,11 +573,13 @@ TEST_F(KernelWrapTest, umount) { |
} |
TEST_F(KernelWrapTest, truncate) { |
- EXPECT_CALL(mock, truncate(kDummyConstChar, kDummyInt3)).WillOnce(Return(-1)); |
- EXPECT_EQ(-1, truncate(kDummyConstChar, kDummyInt3)); |
+ EXPECT_CALL(mock, truncate(kDummyConstChar, kDummyInt3)) |
+ .WillOnce(Return(0)) |
+ .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
- EXPECT_CALL(mock, truncate(kDummyConstChar, kDummyInt3)).WillOnce(Return(0)); |
EXPECT_EQ(0, truncate(kDummyConstChar, kDummyInt3)); |
+ |
+ EXPECT_EQ(-1, truncate(kDummyConstChar, kDummyInt3)); |
} |
TEST_F(KernelWrapTest, lstat) { |
@@ -556,11 +587,14 @@ TEST_F(KernelWrapTest, lstat) { |
MakeDummyStatbuf(&in_statbuf); |
EXPECT_CALL(mock, lstat(StrEq(kDummyConstChar), _)) |
.WillOnce(DoAll(SetStat(&in_statbuf), Return(0))) |
- .WillOnce(Return(-1)); |
+ .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
struct stat out_statbuf; |
+ |
EXPECT_EQ(0, lstat(kDummyConstChar, &out_statbuf)); |
EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf)); |
+ |
EXPECT_EQ(-1, lstat(kDummyConstChar, &out_statbuf)); |
+ ASSERT_EQ(kDummyErrno, errno); |
} |
TEST_F(KernelWrapTest, unlink) { |
@@ -576,8 +610,10 @@ TEST_F(KernelWrapTest, utime) { |
TEST_F(KernelWrapTest, utimes) { |
struct timeval* times = NULL; |
- EXPECT_CALL(mock, utimes(kDummyConstChar, times)).WillOnce(Return(-1)); |
+ EXPECT_CALL(mock, utimes(kDummyConstChar, times)) |
+ .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
EXPECT_EQ(-1, utimes(kDummyConstChar, times)); |
+ ASSERT_EQ(kDummyErrno, errno); |
} |
TEST_F(KernelWrapTest, write) { |