| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // The linux host build of nacl_io can't do wrapping of syscalls so all | 5 // The linux host build of nacl_io can't do wrapping of syscalls so all |
| 6 // these tests must be disabled. | 6 // these tests must be disabled. |
| 7 #if !defined(__linux__) | 7 #if !defined(__linux__) |
| 8 | 8 |
| 9 #include <unistd.h> | 9 #include <unistd.h> |
| 10 | 10 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 COMPARE_FIELD(st_rdev); | 54 COMPARE_FIELD(st_rdev); |
| 55 COMPARE_FIELD(st_size); | 55 COMPARE_FIELD(st_size); |
| 56 COMPARE_FIELD(st_atime); | 56 COMPARE_FIELD(st_atime); |
| 57 COMPARE_FIELD(st_mtime); | 57 COMPARE_FIELD(st_mtime); |
| 58 COMPARE_FIELD(st_ctime); | 58 COMPARE_FIELD(st_ctime); |
| 59 return true; | 59 return true; |
| 60 } | 60 } |
| 61 | 61 |
| 62 #undef COMPARE_FIELD | 62 #undef COMPARE_FIELD |
| 63 | 63 |
| 64 ACTION_P(SetErrno, value) { |
| 65 errno = value; |
| 66 } |
| 67 |
| 64 ACTION_P(SetStat, statbuf) { | 68 ACTION_P(SetStat, statbuf) { |
| 65 memset(arg1, 0, sizeof(struct stat)); | 69 memset(arg1, 0, sizeof(struct stat)); |
| 66 arg1->st_dev = statbuf->st_dev; | 70 arg1->st_dev = statbuf->st_dev; |
| 67 arg1->st_ino = statbuf->st_ino; | 71 arg1->st_ino = statbuf->st_ino; |
| 68 arg1->st_mode = statbuf->st_mode; | 72 arg1->st_mode = statbuf->st_mode; |
| 69 arg1->st_nlink = statbuf->st_nlink; | 73 arg1->st_nlink = statbuf->st_nlink; |
| 70 arg1->st_uid = statbuf->st_uid; | 74 arg1->st_uid = statbuf->st_uid; |
| 71 arg1->st_gid = statbuf->st_gid; | 75 arg1->st_gid = statbuf->st_gid; |
| 72 arg1->st_rdev = statbuf->st_rdev; | 76 arg1->st_rdev = statbuf->st_rdev; |
| 73 arg1->st_size = statbuf->st_size; | 77 arg1->st_size = statbuf->st_size; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 85 statbuf->st_uid = 5; | 89 statbuf->st_uid = 5; |
| 86 statbuf->st_gid = 6; | 90 statbuf->st_gid = 6; |
| 87 statbuf->st_rdev = 7; | 91 statbuf->st_rdev = 7; |
| 88 statbuf->st_size = 8; | 92 statbuf->st_size = 8; |
| 89 statbuf->st_atime = 9; | 93 statbuf->st_atime = 9; |
| 90 statbuf->st_mtime = 10; | 94 statbuf->st_mtime = 10; |
| 91 statbuf->st_ctime = 11; | 95 statbuf->st_ctime = 11; |
| 92 } | 96 } |
| 93 | 97 |
| 94 const mode_t kDummyMode = 0xbeef; | 98 const mode_t kDummyMode = 0xbeef; |
| 99 const int kDummyErrno = 0xfeeb; |
| 95 const int kDummyInt = 0xdedbeef; | 100 const int kDummyInt = 0xdedbeef; |
| 96 const int kDummyInt2 = 0xcabba6e; | 101 const int kDummyInt2 = 0xcabba6e; |
| 97 const int kDummyInt3 = 0xf00ba4; | 102 const int kDummyInt3 = 0xf00ba4; |
| 98 const int kDummyInt4 = 0xabacdba; | 103 const int kDummyInt4 = 0xabacdba; |
| 99 const size_t kDummySizeT = 0x60067e; | 104 const size_t kDummySizeT = 0x60067e; |
| 100 const char* kDummyConstChar = "foobar"; | 105 const char* kDummyConstChar = "foobar"; |
| 101 const char* kDummyConstChar2 = "g00gl3"; | 106 const char* kDummyConstChar2 = "g00gl3"; |
| 102 const char* kDummyConstChar3 = "fr00gl3"; | 107 const char* kDummyConstChar3 = "fr00gl3"; |
| 103 const void* kDummyVoidPtr = "blahblah"; | 108 const void* kDummyVoidPtr = "blahblah"; |
| 104 const uid_t kDummyUid = 1001; | 109 const uid_t kDummyUid = 1001; |
| 105 const gid_t kDummyGid = 1002; | 110 const gid_t kDummyGid = 1002; |
| 106 | 111 |
| 107 class KernelWrapTest : public ::testing::Test { | 112 class KernelWrapTest : public ::testing::Test { |
| 108 public: | 113 public: |
| 109 KernelWrapTest() {} | 114 KernelWrapTest() {} |
| 110 | 115 |
| 111 virtual void SetUp() { | 116 virtual void SetUp() { |
| 117 // Initialize the global errno value to a consistent value rather than |
| 118 // relying on its value from previous test runs. |
| 119 errno = 0; |
| 120 |
| 112 // Initializing the KernelProxy opens stdin/stdout/stderr. | 121 // Initializing the KernelProxy opens stdin/stdout/stderr. |
| 113 EXPECT_CALL(mock, open(_, _)) | 122 EXPECT_CALL(mock, open(_, _)) |
| 114 .WillOnce(Return(0)) | 123 .WillOnce(Return(0)) |
| 115 .WillOnce(Return(1)) | 124 .WillOnce(Return(1)) |
| 116 .WillOnce(Return(2)); | 125 .WillOnce(Return(2)); |
| 117 // And will call mount / and /dev. | 126 // And will call mount / and /dev. |
| 118 EXPECT_CALL(mock, mount(_, _, _, _, _)) | 127 EXPECT_CALL(mock, mount(_, _, _, _, _)) |
| 119 .WillOnce(Return(0)) | 128 .WillOnce(Return(0)) |
| 120 .WillOnce(Return(0)); | 129 .WillOnce(Return(0)); |
| 121 | 130 |
| 122 ASSERT_EQ(0, ki_push_state_for_testing()); | 131 ASSERT_EQ(0, ki_push_state_for_testing()); |
| 123 ASSERT_EQ(0, ki_init(&mock)); | 132 ASSERT_EQ(0, ki_init(&mock)); |
| 124 } | 133 } |
| 125 | 134 |
| 126 void TearDown() { | 135 void TearDown() { |
| 127 // Uninitialize the kernel proxy so wrapped functions passthrough to their | 136 // Uninitialize the kernel proxy so wrapped functions passthrough to their |
| 128 // unwrapped versions. | 137 // unwrapped versions. |
| 129 ki_uninit(); | 138 ki_uninit(); |
| 130 } | 139 } |
| 131 | 140 |
| 132 | |
| 133 MockKernelProxy mock; | 141 MockKernelProxy mock; |
| 134 }; | 142 }; |
| 135 | 143 |
| 136 } // namespace | 144 } // namespace |
| 137 | 145 |
| 138 TEST_F(KernelWrapTest, access) { | 146 TEST_F(KernelWrapTest, access) { |
| 139 EXPECT_CALL(mock, access(kDummyConstChar, kDummyInt)) .WillOnce(Return(-1)); | |
| 140 EXPECT_EQ(-1, access(kDummyConstChar, kDummyInt)); | |
| 141 | |
| 142 EXPECT_CALL(mock, access(kDummyConstChar, kDummyInt)) .WillOnce(Return(0)); | 147 EXPECT_CALL(mock, access(kDummyConstChar, kDummyInt)) .WillOnce(Return(0)); |
| 143 EXPECT_EQ(0, access(kDummyConstChar, kDummyInt)); | 148 EXPECT_EQ(0, access(kDummyConstChar, kDummyInt)); |
| 149 |
| 150 EXPECT_CALL(mock, access(kDummyConstChar, kDummyInt)) |
| 151 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 152 EXPECT_EQ(-1, access(kDummyConstChar, kDummyInt)); |
| 153 EXPECT_EQ(kDummyErrno, errno); |
| 154 |
| 144 } | 155 } |
| 145 | 156 |
| 146 TEST_F(KernelWrapTest, chdir) { | 157 TEST_F(KernelWrapTest, chdir) { |
| 147 EXPECT_CALL(mock, chdir(kDummyConstChar)).WillOnce(Return(-1)); | |
| 148 EXPECT_EQ(-1, chdir(kDummyConstChar)); | |
| 149 | |
| 150 EXPECT_CALL(mock, chdir(kDummyConstChar)).WillOnce(Return(0)); | 158 EXPECT_CALL(mock, chdir(kDummyConstChar)).WillOnce(Return(0)); |
| 151 EXPECT_EQ(0, chdir(kDummyConstChar)); | 159 EXPECT_EQ(0, chdir(kDummyConstChar)); |
| 160 |
| 161 EXPECT_CALL(mock, chdir(kDummyConstChar)) |
| 162 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 163 EXPECT_EQ(-1, chdir(kDummyConstChar)); |
| 164 ASSERT_EQ(kDummyErrno, errno); |
| 152 } | 165 } |
| 153 | 166 |
| 154 TEST_F(KernelWrapTest, chmod) { | 167 TEST_F(KernelWrapTest, chmod) { |
| 155 EXPECT_CALL(mock, chmod(kDummyConstChar, kDummyMode)) | 168 EXPECT_CALL(mock, chmod(kDummyConstChar, kDummyMode)) |
| 156 .WillOnce(Return(kDummyInt2)); | 169 .WillOnce(Return(kDummyInt2)); |
| 157 EXPECT_EQ(kDummyInt2,chmod(kDummyConstChar, kDummyMode)); | 170 EXPECT_EQ(kDummyInt2,chmod(kDummyConstChar, kDummyMode)); |
| 158 } | 171 } |
| 159 | 172 |
| 160 TEST_F(KernelWrapTest, chown) { | 173 TEST_F(KernelWrapTest, chown) { |
| 161 EXPECT_CALL(mock, chown(kDummyConstChar, kDummyUid, kDummyGid)) | 174 EXPECT_CALL(mock, chown(kDummyConstChar, kDummyUid, kDummyGid)) |
| 162 .WillOnce(Return(kDummyInt)); | 175 .WillOnce(Return(kDummyInt)); |
| 163 EXPECT_EQ(kDummyInt, chown(kDummyConstChar, kDummyUid, kDummyGid)); | 176 EXPECT_EQ(kDummyInt, chown(kDummyConstChar, kDummyUid, kDummyGid)); |
| 164 } | 177 } |
| 165 | 178 |
| 166 TEST_F(KernelWrapTest, close) { | 179 TEST_F(KernelWrapTest, close) { |
| 167 // The way we wrap close does not support returning arbitrary values, so we | 180 // The way we wrap close does not support returning arbitrary values, so we |
| 168 // test 0 and -1. | 181 // test 0 and -1. |
| 169 EXPECT_CALL(mock, close(kDummyInt)) | 182 EXPECT_CALL(mock, close(kDummyInt)) |
| 170 .WillOnce(Return(0)) | 183 .WillOnce(Return(0)); |
| 171 .WillOnce(Return(-1)); | |
| 172 | 184 |
| 173 EXPECT_EQ(0, close(kDummyInt)); | 185 EXPECT_EQ(0, close(kDummyInt)); |
| 186 |
| 187 EXPECT_CALL(mock, close(kDummyInt)) |
| 188 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 174 EXPECT_EQ(-1, close(kDummyInt)); | 189 EXPECT_EQ(-1, close(kDummyInt)); |
| 190 ASSERT_EQ(kDummyErrno, errno); |
| 175 } | 191 } |
| 176 | 192 |
| 177 TEST_F(KernelWrapTest, dup) { | 193 TEST_F(KernelWrapTest, dup) { |
| 178 EXPECT_CALL(mock, dup(kDummyInt)).WillOnce(Return(kDummyInt2)); | 194 EXPECT_CALL(mock, dup(kDummyInt)).WillOnce(Return(kDummyInt2)); |
| 179 EXPECT_EQ(kDummyInt2, dup(kDummyInt)); | 195 EXPECT_EQ(kDummyInt2, dup(kDummyInt)); |
| 180 } | 196 } |
| 181 | 197 |
| 182 TEST_F(KernelWrapTest, dup2) { | 198 TEST_F(KernelWrapTest, dup2) { |
| 183 // The way we wrap dup2 does not support returning aribtrary values, only -1 | 199 // The way we wrap dup2 does not support returning aribtrary values, only -1 |
| 184 // or the value of the new fd. | 200 // or the value of the new fd. |
| 185 EXPECT_CALL(mock, dup2(kDummyInt, kDummyInt2)) | 201 EXPECT_CALL(mock, dup2(kDummyInt, kDummyInt2)) |
| 186 .WillOnce(Return(kDummyInt2)) | 202 .WillOnce(Return(kDummyInt2)) |
| 187 .WillOnce(Return(-1)); | 203 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 204 |
| 188 EXPECT_EQ(kDummyInt2, dup2(kDummyInt, kDummyInt2)); | 205 EXPECT_EQ(kDummyInt2, dup2(kDummyInt, kDummyInt2)); |
| 189 EXPECT_EQ(-1, dup2(kDummyInt, kDummyInt2)); | 206 EXPECT_EQ(-1, dup2(kDummyInt, kDummyInt2)); |
| 207 ASSERT_EQ(kDummyErrno, errno); |
| 190 } | 208 } |
| 191 | 209 |
| 192 TEST_F(KernelWrapTest, fchdir) { | 210 TEST_F(KernelWrapTest, fchdir) { |
| 193 EXPECT_CALL(mock, fchdir(kDummyInt)) | 211 EXPECT_CALL(mock, fchdir(kDummyInt)) |
| 194 .WillOnce(Return(-1)); | 212 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 213 |
| 195 EXPECT_EQ(-1, fchdir(kDummyInt)); | 214 EXPECT_EQ(-1, fchdir(kDummyInt)); |
| 215 ASSERT_EQ(kDummyErrno, errno); |
| 196 } | 216 } |
| 197 | 217 |
| 198 TEST_F(KernelWrapTest, fchmod) { | 218 TEST_F(KernelWrapTest, fchmod) { |
| 199 EXPECT_CALL(mock, fchmod(kDummyInt, kDummyMode)) | 219 EXPECT_CALL(mock, fchmod(kDummyInt, kDummyMode)) |
| 200 .WillOnce(Return(-1)); | 220 .WillOnce(Return(0)) |
| 221 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 222 |
| 223 EXPECT_EQ(0, fchmod(kDummyInt, kDummyMode)); |
| 201 EXPECT_EQ(-1, fchmod(kDummyInt, kDummyMode)); | 224 EXPECT_EQ(-1, fchmod(kDummyInt, kDummyMode)); |
| 202 | 225 ASSERT_EQ(kDummyErrno, errno); |
| 203 EXPECT_CALL(mock, fchmod(kDummyInt, kDummyMode)) .WillOnce(Return(0)); | |
| 204 EXPECT_EQ(0, fchmod(kDummyInt, kDummyMode)); | |
| 205 } | 226 } |
| 206 | 227 |
| 207 TEST_F(KernelWrapTest, fchown) { | 228 TEST_F(KernelWrapTest, fchown) { |
| 208 EXPECT_CALL(mock, fchown(kDummyInt, kDummyUid, kDummyGid)) | 229 EXPECT_CALL(mock, fchown(kDummyInt, kDummyUid, kDummyGid)) |
| 209 .WillOnce(Return(kDummyInt)); | 230 .WillOnce(Return(kDummyInt)); |
| 210 EXPECT_EQ(kDummyInt, fchown(kDummyInt, kDummyUid, kDummyGid)); | 231 EXPECT_EQ(kDummyInt, fchown(kDummyInt, kDummyUid, kDummyGid)); |
| 211 } | 232 } |
| 212 | 233 |
| 213 TEST_F(KernelWrapTest, fcntl) { | 234 TEST_F(KernelWrapTest, fcntl) { |
| 214 char buffer[] = "fcntl"; | 235 char buffer[] = "fcntl"; |
| 215 EXPECT_CALL(mock, fcntl(kDummyInt, kDummyInt2, _)) | 236 EXPECT_CALL(mock, fcntl(kDummyInt, kDummyInt2, _)) |
| 216 .WillOnce(Return(kDummyInt3)); | 237 .WillOnce(Return(kDummyInt3)); |
| 217 EXPECT_EQ(kDummyInt3, fcntl(kDummyInt, kDummyInt2, buffer)); | 238 EXPECT_EQ(kDummyInt3, fcntl(kDummyInt, kDummyInt2, buffer)); |
| 218 } | 239 } |
| 219 | 240 |
| 220 TEST_F(KernelWrapTest, fdatasync) { | 241 TEST_F(KernelWrapTest, fdatasync) { |
| 221 EXPECT_CALL(mock, fdatasync(kDummyInt)).WillOnce(Return(-1)); | 242 EXPECT_CALL(mock, fdatasync(kDummyInt)).WillOnce(Return(0)) |
| 243 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 244 |
| 245 EXPECT_EQ(0, fdatasync(kDummyInt)); |
| 222 EXPECT_EQ(-1, fdatasync(kDummyInt)); | 246 EXPECT_EQ(-1, fdatasync(kDummyInt)); |
| 223 | 247 ASSERT_EQ(kDummyErrno, errno); |
| 224 EXPECT_CALL(mock, fdatasync(kDummyInt)).WillOnce(Return(0)); | |
| 225 EXPECT_EQ(0, fdatasync(kDummyInt)); | |
| 226 } | 248 } |
| 227 | 249 |
| 228 TEST_F(KernelWrapTest, fstat) { | 250 TEST_F(KernelWrapTest, fstat) { |
| 229 // The way we wrap fstat does not support returning aribtrary values, only 0 | 251 // The way we wrap fstat does not support returning aribtrary values, only 0 |
| 230 // or -1. | 252 // or -1. |
| 231 struct stat in_statbuf; | 253 struct stat in_statbuf; |
| 232 MakeDummyStatbuf(&in_statbuf); | 254 MakeDummyStatbuf(&in_statbuf); |
| 233 EXPECT_CALL(mock, fstat(kDummyInt, _)) | 255 EXPECT_CALL(mock, fstat(kDummyInt, _)) |
| 234 .WillOnce(DoAll(SetStat(&in_statbuf), Return(0))) | 256 .WillOnce(DoAll(SetStat(&in_statbuf), Return(0))) |
| 235 .WillOnce(Return(-1)); | 257 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 236 struct stat out_statbuf; | 258 struct stat out_statbuf; |
| 259 |
| 237 EXPECT_EQ(0, fstat(kDummyInt, &out_statbuf)); | 260 EXPECT_EQ(0, fstat(kDummyInt, &out_statbuf)); |
| 238 EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf)); | 261 EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf)); |
| 262 |
| 239 EXPECT_EQ(-1, fstat(kDummyInt, &out_statbuf)); | 263 EXPECT_EQ(-1, fstat(kDummyInt, &out_statbuf)); |
| 264 ASSERT_EQ(kDummyErrno, errno); |
| 240 } | 265 } |
| 241 | 266 |
| 242 TEST_F(KernelWrapTest, ftruncate) { | 267 TEST_F(KernelWrapTest, ftruncate) { |
| 243 EXPECT_CALL(mock, ftruncate(kDummyInt, kDummyInt2)) | 268 EXPECT_CALL(mock, ftruncate(kDummyInt, kDummyInt2)) |
| 244 .WillOnce(Return(kDummyInt3)); | 269 .WillOnce(Return(kDummyInt3)); |
| 245 EXPECT_EQ(kDummyInt3, ftruncate(kDummyInt, kDummyInt2)); | 270 EXPECT_EQ(kDummyInt3, ftruncate(kDummyInt, kDummyInt2)); |
| 246 } | 271 } |
| 247 | 272 |
| 248 TEST_F(KernelWrapTest, fsync) { | 273 TEST_F(KernelWrapTest, fsync) { |
| 249 EXPECT_CALL(mock, fsync(kDummyInt)).WillOnce(Return(-1)); | 274 EXPECT_CALL(mock, fsync(kDummyInt)) |
| 275 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 250 EXPECT_EQ(-1, fsync(kDummyInt)); | 276 EXPECT_EQ(-1, fsync(kDummyInt)); |
| 277 ASSERT_EQ(kDummyErrno, errno); |
| 251 } | 278 } |
| 252 | 279 |
| 253 TEST_F(KernelWrapTest, getcwd) { | 280 TEST_F(KernelWrapTest, getcwd) { |
| 254 char result[] = "getcwd_result"; | 281 char result[] = "getcwd_result"; |
| 255 char buffer[] = "getcwd"; | 282 char buffer[] = "getcwd"; |
| 256 EXPECT_CALL(mock, getcwd(buffer, kDummySizeT)).WillOnce(Return(result)); | 283 EXPECT_CALL(mock, getcwd(buffer, kDummySizeT)).WillOnce(Return(result)); |
| 257 EXPECT_EQ(result, getcwd(buffer, kDummySizeT)); | 284 EXPECT_EQ(result, getcwd(buffer, kDummySizeT)); |
| 258 } | 285 } |
| 259 | 286 |
| 260 TEST_F(KernelWrapTest, getdents) { | 287 TEST_F(KernelWrapTest, getdents) { |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 384 TEST_F(KernelWrapTest, munmap) { | 411 TEST_F(KernelWrapTest, munmap) { |
| 385 // The way we wrap munmap, calls the "real" mmap as well as the intercepted | 412 // The way we wrap munmap, calls the "real" mmap as well as the intercepted |
| 386 // one. The result returned is from the "real" mmap. | 413 // one. The result returned is from the "real" mmap. |
| 387 int dummy1 = 123; | 414 int dummy1 = 123; |
| 388 void* kDummyVoidPtr = &dummy1; | 415 void* kDummyVoidPtr = &dummy1; |
| 389 size_t kDummySizeT = sizeof(kDummyVoidPtr); | 416 size_t kDummySizeT = sizeof(kDummyVoidPtr); |
| 390 EXPECT_CALL(mock, munmap(kDummyVoidPtr, kDummySizeT)); | 417 EXPECT_CALL(mock, munmap(kDummyVoidPtr, kDummySizeT)); |
| 391 munmap(kDummyVoidPtr, kDummySizeT); | 418 munmap(kDummyVoidPtr, kDummySizeT); |
| 392 } | 419 } |
| 393 | 420 |
| 394 | |
| 395 TEST_F(KernelWrapTest, open) { | 421 TEST_F(KernelWrapTest, open) { |
| 396 // We pass O_RDONLY because we do not want an error in flags translation | 422 // We pass O_RDONLY because we do not want an error in flags translation |
| 397 EXPECT_CALL(mock, open(kDummyConstChar, 0)) | 423 EXPECT_CALL(mock, open(kDummyConstChar, 0)) |
| 424 .WillOnce(Return(kDummyInt2)) |
| 398 .WillOnce(Return(kDummyInt2)); | 425 .WillOnce(Return(kDummyInt2)); |
| 426 |
| 399 EXPECT_EQ(kDummyInt2, open(kDummyConstChar, 0)); | 427 EXPECT_EQ(kDummyInt2, open(kDummyConstChar, 0)); |
| 400 | |
| 401 EXPECT_CALL(mock, open(kDummyConstChar, 0)) | |
| 402 .WillOnce(Return(kDummyInt2)); | |
| 403 EXPECT_EQ(kDummyInt2, open(kDummyConstChar, 0)); | 428 EXPECT_EQ(kDummyInt2, open(kDummyConstChar, 0)); |
| 404 } | 429 } |
| 405 | 430 |
| 406 TEST_F(KernelWrapTest, pipe) { | 431 TEST_F(KernelWrapTest, pipe) { |
| 407 int fds[] = {1, 2}; | 432 int fds[] = {1, 2}; |
| 408 EXPECT_CALL(mock, pipe(fds)).WillOnce(Return(kDummyInt)); | 433 EXPECT_CALL(mock, pipe(fds)).WillOnce(Return(kDummyInt)); |
| 409 EXPECT_EQ(kDummyInt, pipe(fds)); | 434 EXPECT_EQ(kDummyInt, pipe(fds)); |
| 410 } | 435 } |
| 411 | 436 |
| 412 TEST_F(KernelWrapTest, read) { | 437 TEST_F(KernelWrapTest, read) { |
| 413 int dummy_value; | 438 int dummy_value; |
| 414 void* dummy_void_ptr = &dummy_value; | 439 void* dummy_void_ptr = &dummy_value; |
| 415 EXPECT_CALL(mock, read(kDummyInt, dummy_void_ptr, kDummyInt2)) | 440 EXPECT_CALL(mock, read(kDummyInt, dummy_void_ptr, kDummyInt2)) |
| 416 .WillOnce(Return(kDummyInt3)); | 441 .WillOnce(Return(kDummyInt3)); |
| 417 EXPECT_EQ(kDummyInt3, read(kDummyInt, dummy_void_ptr, kDummyInt2)); | 442 EXPECT_EQ(kDummyInt3, read(kDummyInt, dummy_void_ptr, kDummyInt2)); |
| 418 } | 443 } |
| 419 | 444 |
| 420 TEST_F(KernelWrapTest, readlink) { | 445 TEST_F(KernelWrapTest, readlink) { |
| 421 char buf[10]; | 446 char buf[10]; |
| 422 | 447 |
| 423 EXPECT_CALL(mock, readlink(kDummyConstChar, buf, 10)) | 448 EXPECT_CALL(mock, readlink(kDummyConstChar, buf, 10)) |
| 424 .WillOnce(Return(-1)); | 449 .WillOnce(Return(kDummyInt)) |
| 450 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 451 |
| 452 EXPECT_EQ(kDummyInt, readlink(kDummyConstChar, buf, 10)); |
| 425 EXPECT_EQ(-1, readlink(kDummyConstChar, buf, 10)); | 453 EXPECT_EQ(-1, readlink(kDummyConstChar, buf, 10)); |
| 426 | 454 ASSERT_EQ(kDummyErrno, errno); |
| 427 EXPECT_CALL(mock, readlink(kDummyConstChar, buf, 10)) | |
| 428 .WillOnce(Return(kDummyInt)); | |
| 429 EXPECT_EQ(kDummyInt, readlink(kDummyConstChar, buf, 10)); | |
| 430 } | 455 } |
| 431 | 456 |
| 432 #ifdef __GLIBC__ | 457 #ifdef __GLIBC__ |
| 433 // Under newlib there is no remove syscall. Instead it is implemented | 458 // Under newlib there is no remove syscall. Instead it is implemented |
| 434 // in terms of unlink()/rmdir(). | 459 // in terms of unlink()/rmdir(). |
| 435 TEST_F(KernelWrapTest, remove) { | 460 TEST_F(KernelWrapTest, remove) { |
| 436 EXPECT_CALL(mock, remove(kDummyConstChar)).WillOnce(Return(-1)); | 461 EXPECT_CALL(mock, remove(kDummyConstChar)).WillOnce(Return(-1)); |
| 437 EXPECT_EQ(-1, remove(kDummyConstChar)); | 462 EXPECT_EQ(-1, remove(kDummyConstChar)); |
| 438 } | 463 } |
| 439 #endif | 464 #endif |
| 440 | 465 |
| 441 TEST_F(KernelWrapTest, rename) { | 466 TEST_F(KernelWrapTest, rename) { |
| 442 EXPECT_CALL(mock, rename(kDummyConstChar, kDummyConstChar2)) | 467 EXPECT_CALL(mock, rename(kDummyConstChar, kDummyConstChar2)) |
| 443 .WillOnce(Return(-1)); | 468 .WillOnce(Return(0)) |
| 469 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 470 |
| 471 EXPECT_EQ(0, rename(kDummyConstChar, kDummyConstChar2)); |
| 444 EXPECT_EQ(-1, rename(kDummyConstChar, kDummyConstChar2)); | 472 EXPECT_EQ(-1, rename(kDummyConstChar, kDummyConstChar2)); |
| 445 | 473 ASSERT_EQ(kDummyErrno, errno); |
| 446 EXPECT_CALL(mock, rename(kDummyConstChar, kDummyConstChar2)) | |
| 447 .WillOnce(Return(0)); | |
| 448 EXPECT_EQ(0, rename(kDummyConstChar, kDummyConstChar2)); | |
| 449 } | 474 } |
| 450 | 475 |
| 451 TEST_F(KernelWrapTest, rmdir) { | 476 TEST_F(KernelWrapTest, rmdir) { |
| 452 EXPECT_CALL(mock, rmdir(kDummyConstChar)).WillOnce(Return(kDummyInt)); | 477 EXPECT_CALL(mock, rmdir(kDummyConstChar)).WillOnce(Return(kDummyInt)); |
| 453 EXPECT_EQ(kDummyInt, rmdir(kDummyConstChar)); | 478 EXPECT_EQ(kDummyInt, rmdir(kDummyConstChar)); |
| 454 } | 479 } |
| 455 | 480 |
| 456 static void new_handler(int) {} | 481 static void new_handler(int) {} |
| 457 | 482 |
| 458 TEST_F(KernelWrapTest, sigaction) { | 483 TEST_F(KernelWrapTest, sigaction) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 476 EXPECT_EQ(NULL, signal(kDummyInt, new_handler)); | 501 EXPECT_EQ(NULL, signal(kDummyInt, new_handler)); |
| 477 } | 502 } |
| 478 | 503 |
| 479 TEST_F(KernelWrapTest, stat) { | 504 TEST_F(KernelWrapTest, stat) { |
| 480 // The way we wrap stat does not support returning aribtrary values, only 0 | 505 // The way we wrap stat does not support returning aribtrary values, only 0 |
| 481 // or -1. | 506 // or -1. |
| 482 struct stat in_statbuf; | 507 struct stat in_statbuf; |
| 483 MakeDummyStatbuf(&in_statbuf); | 508 MakeDummyStatbuf(&in_statbuf); |
| 484 EXPECT_CALL(mock, stat(StrEq(kDummyConstChar), _)) | 509 EXPECT_CALL(mock, stat(StrEq(kDummyConstChar), _)) |
| 485 .WillOnce(DoAll(SetStat(&in_statbuf), Return(0))) | 510 .WillOnce(DoAll(SetStat(&in_statbuf), Return(0))) |
| 486 .WillOnce(Return(-1)); | 511 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 487 struct stat out_statbuf; | 512 struct stat out_statbuf; |
| 513 |
| 488 EXPECT_EQ(0, stat(kDummyConstChar, &out_statbuf)); | 514 EXPECT_EQ(0, stat(kDummyConstChar, &out_statbuf)); |
| 489 EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf)); | 515 EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf)); |
| 516 |
| 490 EXPECT_EQ(-1, stat(kDummyConstChar, &out_statbuf)); | 517 EXPECT_EQ(-1, stat(kDummyConstChar, &out_statbuf)); |
| 518 ASSERT_EQ(kDummyErrno, errno); |
| 491 } | 519 } |
| 492 | 520 |
| 493 TEST_F(KernelWrapTest, symlink) { | 521 TEST_F(KernelWrapTest, symlink) { |
| 494 EXPECT_CALL(mock, symlink(kDummyConstChar, kDummyConstChar2)) | 522 EXPECT_CALL(mock, symlink(kDummyConstChar, kDummyConstChar2)) |
| 495 .WillOnce(Return(kDummyInt)); | 523 .WillOnce(Return(kDummyInt)); |
| 496 EXPECT_EQ(kDummyInt, symlink(kDummyConstChar, kDummyConstChar2)); | 524 EXPECT_EQ(kDummyInt, symlink(kDummyConstChar, kDummyConstChar2)); |
| 497 } | 525 } |
| 498 | 526 |
| 499 #ifndef __BIONIC__ | 527 #ifndef __BIONIC__ |
| 500 TEST_F(KernelWrapTest, tcflush) { | 528 TEST_F(KernelWrapTest, tcflush) { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 516 EXPECT_EQ(kDummyInt3, tcsetattr(kDummyInt, kDummyInt2, &term)); | 544 EXPECT_EQ(kDummyInt3, tcsetattr(kDummyInt, kDummyInt2, &term)); |
| 517 } | 545 } |
| 518 #endif | 546 #endif |
| 519 | 547 |
| 520 TEST_F(KernelWrapTest, umount) { | 548 TEST_F(KernelWrapTest, umount) { |
| 521 EXPECT_CALL(mock, umount(kDummyConstChar)).WillOnce(Return(kDummyInt)); | 549 EXPECT_CALL(mock, umount(kDummyConstChar)).WillOnce(Return(kDummyInt)); |
| 522 EXPECT_EQ(kDummyInt, umount(kDummyConstChar)); | 550 EXPECT_EQ(kDummyInt, umount(kDummyConstChar)); |
| 523 } | 551 } |
| 524 | 552 |
| 525 TEST_F(KernelWrapTest, truncate) { | 553 TEST_F(KernelWrapTest, truncate) { |
| 526 EXPECT_CALL(mock, truncate(kDummyConstChar, kDummyInt3)).WillOnce(Return(-1)); | 554 EXPECT_CALL(mock, truncate(kDummyConstChar, kDummyInt3)) |
| 555 .WillOnce(Return(0)) |
| 556 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 557 |
| 558 EXPECT_EQ(0, truncate(kDummyConstChar, kDummyInt3)); |
| 559 |
| 527 EXPECT_EQ(-1, truncate(kDummyConstChar, kDummyInt3)); | 560 EXPECT_EQ(-1, truncate(kDummyConstChar, kDummyInt3)); |
| 528 | |
| 529 EXPECT_CALL(mock, truncate(kDummyConstChar, kDummyInt3)).WillOnce(Return(0)); | |
| 530 EXPECT_EQ(0, truncate(kDummyConstChar, kDummyInt3)); | |
| 531 } | 561 } |
| 532 | 562 |
| 533 TEST_F(KernelWrapTest, lstat) { | 563 TEST_F(KernelWrapTest, lstat) { |
| 534 struct stat in_statbuf; | 564 struct stat in_statbuf; |
| 535 MakeDummyStatbuf(&in_statbuf); | 565 MakeDummyStatbuf(&in_statbuf); |
| 536 EXPECT_CALL(mock, lstat(StrEq(kDummyConstChar), _)) | 566 EXPECT_CALL(mock, lstat(StrEq(kDummyConstChar), _)) |
| 537 .WillOnce(DoAll(SetStat(&in_statbuf), Return(0))) | 567 .WillOnce(DoAll(SetStat(&in_statbuf), Return(0))) |
| 538 .WillOnce(Return(-1)); | 568 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 539 struct stat out_statbuf; | 569 struct stat out_statbuf; |
| 570 |
| 540 EXPECT_EQ(0, lstat(kDummyConstChar, &out_statbuf)); | 571 EXPECT_EQ(0, lstat(kDummyConstChar, &out_statbuf)); |
| 541 EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf)); | 572 EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf)); |
| 573 |
| 542 EXPECT_EQ(-1, lstat(kDummyConstChar, &out_statbuf)); | 574 EXPECT_EQ(-1, lstat(kDummyConstChar, &out_statbuf)); |
| 575 ASSERT_EQ(kDummyErrno, errno); |
| 543 } | 576 } |
| 544 | 577 |
| 545 TEST_F(KernelWrapTest, unlink) { | 578 TEST_F(KernelWrapTest, unlink) { |
| 546 EXPECT_CALL(mock, unlink(kDummyConstChar)).WillOnce(Return(kDummyInt)); | 579 EXPECT_CALL(mock, unlink(kDummyConstChar)).WillOnce(Return(kDummyInt)); |
| 547 EXPECT_EQ(kDummyInt, unlink(kDummyConstChar)); | 580 EXPECT_EQ(kDummyInt, unlink(kDummyConstChar)); |
| 548 } | 581 } |
| 549 | 582 |
| 550 TEST_F(KernelWrapTest, utime) { | 583 TEST_F(KernelWrapTest, utime) { |
| 551 const struct utimbuf* times = NULL; | 584 const struct utimbuf* times = NULL; |
| 552 EXPECT_CALL(mock, utime(kDummyConstChar, times)).WillOnce(Return(kDummyInt)); | 585 EXPECT_CALL(mock, utime(kDummyConstChar, times)).WillOnce(Return(kDummyInt)); |
| 553 EXPECT_EQ(kDummyInt, utime(kDummyConstChar, times)); | 586 EXPECT_EQ(kDummyInt, utime(kDummyConstChar, times)); |
| 554 } | 587 } |
| 555 | 588 |
| 556 TEST_F(KernelWrapTest, utimes) { | 589 TEST_F(KernelWrapTest, utimes) { |
| 557 struct timeval* times = NULL; | 590 struct timeval* times = NULL; |
| 558 EXPECT_CALL(mock, utimes(kDummyConstChar, times)).WillOnce(Return(-1)); | 591 EXPECT_CALL(mock, utimes(kDummyConstChar, times)) |
| 592 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 559 EXPECT_EQ(-1, utimes(kDummyConstChar, times)); | 593 EXPECT_EQ(-1, utimes(kDummyConstChar, times)); |
| 594 ASSERT_EQ(kDummyErrno, errno); |
| 560 } | 595 } |
| 561 | 596 |
| 562 TEST_F(KernelWrapTest, write) { | 597 TEST_F(KernelWrapTest, write) { |
| 563 EXPECT_CALL(mock, write(kDummyInt, kDummyVoidPtr, kDummyInt2)) | 598 EXPECT_CALL(mock, write(kDummyInt, kDummyVoidPtr, kDummyInt2)) |
| 564 .WillOnce(Return(kDummyInt3)); | 599 .WillOnce(Return(kDummyInt3)); |
| 565 EXPECT_EQ(kDummyInt3, write(kDummyInt, kDummyVoidPtr, kDummyInt2)); | 600 EXPECT_EQ(kDummyInt3, write(kDummyInt, kDummyVoidPtr, kDummyInt2)); |
| 566 } | 601 } |
| 567 | 602 |
| 568 #if defined(PROVIDES_SOCKET_API) and !defined(__BIONIC__) | 603 #if defined(PROVIDES_SOCKET_API) and !defined(__BIONIC__) |
| 569 TEST_F(KernelWrapTest, poll) { | 604 TEST_F(KernelWrapTest, poll) { |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 739 int dummy_val; | 774 int dummy_val; |
| 740 EXPECT_CALL(mock, socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val)) | 775 EXPECT_CALL(mock, socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val)) |
| 741 .WillOnce(Return(kDummyInt4)); | 776 .WillOnce(Return(kDummyInt4)); |
| 742 EXPECT_EQ(kDummyInt4, | 777 EXPECT_EQ(kDummyInt4, |
| 743 socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val)); | 778 socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val)); |
| 744 } | 779 } |
| 745 | 780 |
| 746 #endif // PROVIDES_SOCKET_API | 781 #endif // PROVIDES_SOCKET_API |
| 747 | 782 |
| 748 #endif // __linux__ | 783 #endif // __linux__ |
| OLD | NEW |