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 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
57 COMPARE_FIELD(st_rdev); | 57 COMPARE_FIELD(st_rdev); |
58 COMPARE_FIELD(st_size); | 58 COMPARE_FIELD(st_size); |
59 COMPARE_FIELD(st_atime); | 59 COMPARE_FIELD(st_atime); |
60 COMPARE_FIELD(st_mtime); | 60 COMPARE_FIELD(st_mtime); |
61 COMPARE_FIELD(st_ctime); | 61 COMPARE_FIELD(st_ctime); |
62 return true; | 62 return true; |
63 } | 63 } |
64 | 64 |
65 #undef COMPARE_FIELD | 65 #undef COMPARE_FIELD |
66 | 66 |
| 67 ACTION_P(SetErrno, value) { |
| 68 errno = value; |
| 69 } |
| 70 |
67 ACTION_P(SetStat, statbuf) { | 71 ACTION_P(SetStat, statbuf) { |
68 memset(arg1, 0, sizeof(struct stat)); | 72 memset(arg1, 0, sizeof(struct stat)); |
69 arg1->st_dev = statbuf->st_dev; | 73 arg1->st_dev = statbuf->st_dev; |
70 arg1->st_ino = statbuf->st_ino; | 74 arg1->st_ino = statbuf->st_ino; |
71 arg1->st_mode = statbuf->st_mode; | 75 arg1->st_mode = statbuf->st_mode; |
72 arg1->st_nlink = statbuf->st_nlink; | 76 arg1->st_nlink = statbuf->st_nlink; |
73 arg1->st_uid = statbuf->st_uid; | 77 arg1->st_uid = statbuf->st_uid; |
74 arg1->st_gid = statbuf->st_gid; | 78 arg1->st_gid = statbuf->st_gid; |
75 arg1->st_rdev = statbuf->st_rdev; | 79 arg1->st_rdev = statbuf->st_rdev; |
76 arg1->st_size = statbuf->st_size; | 80 arg1->st_size = statbuf->st_size; |
(...skipping 11 matching lines...) Expand all Loading... |
88 statbuf->st_uid = 5; | 92 statbuf->st_uid = 5; |
89 statbuf->st_gid = 6; | 93 statbuf->st_gid = 6; |
90 statbuf->st_rdev = 7; | 94 statbuf->st_rdev = 7; |
91 statbuf->st_size = 8; | 95 statbuf->st_size = 8; |
92 statbuf->st_atime = 9; | 96 statbuf->st_atime = 9; |
93 statbuf->st_mtime = 10; | 97 statbuf->st_mtime = 10; |
94 statbuf->st_ctime = 11; | 98 statbuf->st_ctime = 11; |
95 } | 99 } |
96 | 100 |
97 const mode_t kDummyMode = 0xbeef; | 101 const mode_t kDummyMode = 0xbeef; |
| 102 const int kDummyErrno = 0xfeeb; |
98 const int kDummyInt = 0xdedbeef; | 103 const int kDummyInt = 0xdedbeef; |
99 const int kDummyInt2 = 0xcabba6e; | 104 const int kDummyInt2 = 0xcabba6e; |
100 const int kDummyInt3 = 0xf00ba4; | 105 const int kDummyInt3 = 0xf00ba4; |
101 const int kDummyInt4 = 0xabacdba; | 106 const int kDummyInt4 = 0xabacdba; |
102 const size_t kDummySizeT = 0x60067e; | 107 const size_t kDummySizeT = 0x60067e; |
103 const char* kDummyConstChar = "foobar"; | 108 const char* kDummyConstChar = "foobar"; |
104 const char* kDummyConstChar2 = "g00gl3"; | 109 const char* kDummyConstChar2 = "g00gl3"; |
105 const char* kDummyConstChar3 = "fr00gl3"; | 110 const char* kDummyConstChar3 = "fr00gl3"; |
106 const void* kDummyVoidPtr = "blahblah"; | 111 const void* kDummyVoidPtr = "blahblah"; |
107 const uid_t kDummyUid = 1001; | 112 const uid_t kDummyUid = 1001; |
108 const gid_t kDummyGid = 1002; | 113 const gid_t kDummyGid = 1002; |
109 | 114 |
110 class KernelWrapTest : public ::testing::Test { | 115 class KernelWrapTest : public ::testing::Test { |
111 public: | 116 public: |
112 KernelWrapTest() {} | 117 KernelWrapTest() {} |
113 | 118 |
114 virtual void SetUp() { | 119 virtual void SetUp() { |
| 120 // Initialize the global errno value to a consistent value rather than |
| 121 // relying on its value from previous test runs. |
| 122 errno = 0; |
| 123 |
115 // Initializing the KernelProxy opens stdin/stdout/stderr. | 124 // Initializing the KernelProxy opens stdin/stdout/stderr. |
116 EXPECT_CALL(mock, open(_, _)) | 125 EXPECT_CALL(mock, open(_, _)) |
117 .WillOnce(Return(0)) | 126 .WillOnce(Return(0)) |
118 .WillOnce(Return(1)) | 127 .WillOnce(Return(1)) |
119 .WillOnce(Return(2)); | 128 .WillOnce(Return(2)); |
120 // And will call mount / and /dev. | 129 // And will call mount / and /dev. |
121 EXPECT_CALL(mock, mount(_, _, _, _, _)) | 130 EXPECT_CALL(mock, mount(_, _, _, _, _)) |
122 .WillOnce(Return(0)) | 131 .WillOnce(Return(0)) |
123 .WillOnce(Return(0)); | 132 .WillOnce(Return(0)); |
124 | 133 |
(...skipping 25 matching lines...) Expand all Loading... |
150 errno = rtn; | 159 errno = rtn; |
151 return -1; | 160 return -1; |
152 } | 161 } |
153 return nwrote; | 162 return nwrote; |
154 } | 163 } |
155 }; | 164 }; |
156 | 165 |
157 } // namespace | 166 } // namespace |
158 | 167 |
159 TEST_F(KernelWrapTest, access) { | 168 TEST_F(KernelWrapTest, access) { |
160 EXPECT_CALL(mock, access(kDummyConstChar, kDummyInt)) .WillOnce(Return(-1)); | |
161 EXPECT_EQ(-1, access(kDummyConstChar, kDummyInt)); | |
162 | |
163 EXPECT_CALL(mock, access(kDummyConstChar, kDummyInt)) .WillOnce(Return(0)); | 169 EXPECT_CALL(mock, access(kDummyConstChar, kDummyInt)) .WillOnce(Return(0)); |
164 EXPECT_EQ(0, access(kDummyConstChar, kDummyInt)); | 170 EXPECT_EQ(0, access(kDummyConstChar, kDummyInt)); |
| 171 |
| 172 EXPECT_CALL(mock, access(kDummyConstChar, kDummyInt)) |
| 173 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 174 EXPECT_EQ(-1, access(kDummyConstChar, kDummyInt)); |
| 175 EXPECT_EQ(kDummyErrno, errno); |
| 176 |
165 } | 177 } |
166 | 178 |
167 TEST_F(KernelWrapTest, chdir) { | 179 TEST_F(KernelWrapTest, chdir) { |
168 EXPECT_CALL(mock, chdir(kDummyConstChar)).WillOnce(Return(-1)); | |
169 EXPECT_EQ(-1, chdir(kDummyConstChar)); | |
170 | |
171 EXPECT_CALL(mock, chdir(kDummyConstChar)).WillOnce(Return(0)); | 180 EXPECT_CALL(mock, chdir(kDummyConstChar)).WillOnce(Return(0)); |
172 EXPECT_EQ(0, chdir(kDummyConstChar)); | 181 EXPECT_EQ(0, chdir(kDummyConstChar)); |
| 182 |
| 183 EXPECT_CALL(mock, chdir(kDummyConstChar)) |
| 184 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 185 EXPECT_EQ(-1, chdir(kDummyConstChar)); |
| 186 ASSERT_EQ(kDummyErrno, errno); |
173 } | 187 } |
174 | 188 |
175 TEST_F(KernelWrapTest, chmod) { | 189 TEST_F(KernelWrapTest, chmod) { |
176 EXPECT_CALL(mock, chmod(kDummyConstChar, kDummyMode)) | 190 EXPECT_CALL(mock, chmod(kDummyConstChar, kDummyMode)) |
177 .WillOnce(Return(kDummyInt2)); | 191 .WillOnce(Return(kDummyInt2)); |
178 EXPECT_EQ(kDummyInt2,chmod(kDummyConstChar, kDummyMode)); | 192 EXPECT_EQ(kDummyInt2,chmod(kDummyConstChar, kDummyMode)); |
179 } | 193 } |
180 | 194 |
181 TEST_F(KernelWrapTest, chown) { | 195 TEST_F(KernelWrapTest, chown) { |
182 EXPECT_CALL(mock, chown(kDummyConstChar, kDummyUid, kDummyGid)) | 196 EXPECT_CALL(mock, chown(kDummyConstChar, kDummyUid, kDummyGid)) |
183 .WillOnce(Return(kDummyInt)); | 197 .WillOnce(Return(kDummyInt)); |
184 EXPECT_EQ(kDummyInt, chown(kDummyConstChar, kDummyUid, kDummyGid)); | 198 EXPECT_EQ(kDummyInt, chown(kDummyConstChar, kDummyUid, kDummyGid)); |
185 } | 199 } |
186 | 200 |
187 TEST_F(KernelWrapTest, close) { | 201 TEST_F(KernelWrapTest, close) { |
188 // The way we wrap close does not support returning arbitrary values, so we | 202 // The way we wrap close does not support returning arbitrary values, so we |
189 // test 0 and -1. | 203 // test 0 and -1. |
190 EXPECT_CALL(mock, close(kDummyInt)) | 204 EXPECT_CALL(mock, close(kDummyInt)) |
191 .WillOnce(Return(0)) | 205 .WillOnce(Return(0)); |
192 .WillOnce(Return(-1)); | |
193 | 206 |
194 EXPECT_EQ(0, close(kDummyInt)); | 207 EXPECT_EQ(0, close(kDummyInt)); |
| 208 |
| 209 EXPECT_CALL(mock, close(kDummyInt)) |
| 210 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
195 EXPECT_EQ(-1, close(kDummyInt)); | 211 EXPECT_EQ(-1, close(kDummyInt)); |
| 212 ASSERT_EQ(kDummyErrno, errno); |
196 } | 213 } |
197 | 214 |
198 TEST_F(KernelWrapTest, dup) { | 215 TEST_F(KernelWrapTest, dup) { |
199 EXPECT_CALL(mock, dup(kDummyInt)).WillOnce(Return(kDummyInt2)); | 216 EXPECT_CALL(mock, dup(kDummyInt)).WillOnce(Return(kDummyInt2)); |
200 EXPECT_EQ(kDummyInt2, dup(kDummyInt)); | 217 EXPECT_EQ(kDummyInt2, dup(kDummyInt)); |
201 } | 218 } |
202 | 219 |
203 TEST_F(KernelWrapTest, dup2) { | 220 TEST_F(KernelWrapTest, dup2) { |
204 // The way we wrap dup2 does not support returning aribtrary values, only -1 | 221 // The way we wrap dup2 does not support returning aribtrary values, only -1 |
205 // or the value of the new fd. | 222 // or the value of the new fd. |
206 EXPECT_CALL(mock, dup2(kDummyInt, kDummyInt2)) | 223 EXPECT_CALL(mock, dup2(kDummyInt, kDummyInt2)) |
207 .WillOnce(Return(kDummyInt2)) | 224 .WillOnce(Return(kDummyInt2)) |
208 .WillOnce(Return(-1)); | 225 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 226 |
209 EXPECT_EQ(kDummyInt2, dup2(kDummyInt, kDummyInt2)); | 227 EXPECT_EQ(kDummyInt2, dup2(kDummyInt, kDummyInt2)); |
210 EXPECT_EQ(-1, dup2(kDummyInt, kDummyInt2)); | 228 EXPECT_EQ(-1, dup2(kDummyInt, kDummyInt2)); |
| 229 ASSERT_EQ(kDummyErrno, errno); |
211 } | 230 } |
212 | 231 |
213 TEST_F(KernelWrapTest, fchdir) { | 232 TEST_F(KernelWrapTest, fchdir) { |
214 EXPECT_CALL(mock, fchdir(kDummyInt)) | 233 EXPECT_CALL(mock, fchdir(kDummyInt)) |
215 .WillOnce(Return(-1)); | 234 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 235 |
216 EXPECT_EQ(-1, fchdir(kDummyInt)); | 236 EXPECT_EQ(-1, fchdir(kDummyInt)); |
| 237 ASSERT_EQ(kDummyErrno, errno); |
217 } | 238 } |
218 | 239 |
219 TEST_F(KernelWrapTest, fchmod) { | 240 TEST_F(KernelWrapTest, fchmod) { |
220 EXPECT_CALL(mock, fchmod(kDummyInt, kDummyMode)) | 241 EXPECT_CALL(mock, fchmod(kDummyInt, kDummyMode)) |
221 .WillOnce(Return(-1)); | 242 .WillOnce(Return(0)) |
| 243 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 244 |
| 245 EXPECT_EQ(0, fchmod(kDummyInt, kDummyMode)); |
222 EXPECT_EQ(-1, fchmod(kDummyInt, kDummyMode)); | 246 EXPECT_EQ(-1, fchmod(kDummyInt, kDummyMode)); |
223 | 247 ASSERT_EQ(kDummyErrno, errno); |
224 EXPECT_CALL(mock, fchmod(kDummyInt, kDummyMode)) .WillOnce(Return(0)); | |
225 EXPECT_EQ(0, fchmod(kDummyInt, kDummyMode)); | |
226 } | 248 } |
227 | 249 |
228 TEST_F(KernelWrapTest, fchown) { | 250 TEST_F(KernelWrapTest, fchown) { |
229 EXPECT_CALL(mock, fchown(kDummyInt, kDummyUid, kDummyGid)) | 251 EXPECT_CALL(mock, fchown(kDummyInt, kDummyUid, kDummyGid)) |
230 .WillOnce(Return(kDummyInt)); | 252 .WillOnce(Return(kDummyInt)); |
231 EXPECT_EQ(kDummyInt, fchown(kDummyInt, kDummyUid, kDummyGid)); | 253 EXPECT_EQ(kDummyInt, fchown(kDummyInt, kDummyUid, kDummyGid)); |
232 } | 254 } |
233 | 255 |
234 TEST_F(KernelWrapTest, fcntl) { | 256 TEST_F(KernelWrapTest, fcntl) { |
235 char buffer[] = "fcntl"; | 257 char buffer[] = "fcntl"; |
236 EXPECT_CALL(mock, fcntl(kDummyInt, kDummyInt2, _)) | 258 EXPECT_CALL(mock, fcntl(kDummyInt, kDummyInt2, _)) |
237 .WillOnce(Return(kDummyInt3)); | 259 .WillOnce(Return(kDummyInt3)); |
238 EXPECT_EQ(kDummyInt3, fcntl(kDummyInt, kDummyInt2, buffer)); | 260 EXPECT_EQ(kDummyInt3, fcntl(kDummyInt, kDummyInt2, buffer)); |
239 } | 261 } |
240 | 262 |
241 TEST_F(KernelWrapTest, fdatasync) { | 263 TEST_F(KernelWrapTest, fdatasync) { |
242 EXPECT_CALL(mock, fdatasync(kDummyInt)).WillOnce(Return(-1)); | 264 EXPECT_CALL(mock, fdatasync(kDummyInt)).WillOnce(Return(0)) |
| 265 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 266 |
| 267 EXPECT_EQ(0, fdatasync(kDummyInt)); |
243 EXPECT_EQ(-1, fdatasync(kDummyInt)); | 268 EXPECT_EQ(-1, fdatasync(kDummyInt)); |
244 | 269 ASSERT_EQ(kDummyErrno, errno); |
245 EXPECT_CALL(mock, fdatasync(kDummyInt)).WillOnce(Return(0)); | |
246 EXPECT_EQ(0, fdatasync(kDummyInt)); | |
247 } | 270 } |
248 | 271 |
249 TEST_F(KernelWrapTest, fstat) { | 272 TEST_F(KernelWrapTest, fstat) { |
250 // The way we wrap fstat does not support returning aribtrary values, only 0 | 273 // The way we wrap fstat does not support returning aribtrary values, only 0 |
251 // or -1. | 274 // or -1. |
252 struct stat in_statbuf; | 275 struct stat in_statbuf; |
253 MakeDummyStatbuf(&in_statbuf); | 276 MakeDummyStatbuf(&in_statbuf); |
254 EXPECT_CALL(mock, fstat(kDummyInt, _)) | 277 EXPECT_CALL(mock, fstat(kDummyInt, _)) |
255 .WillOnce(DoAll(SetStat(&in_statbuf), Return(0))) | 278 .WillOnce(DoAll(SetStat(&in_statbuf), Return(0))) |
256 .WillOnce(Return(-1)); | 279 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
257 struct stat out_statbuf; | 280 struct stat out_statbuf; |
| 281 |
258 EXPECT_EQ(0, fstat(kDummyInt, &out_statbuf)); | 282 EXPECT_EQ(0, fstat(kDummyInt, &out_statbuf)); |
259 EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf)); | 283 EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf)); |
| 284 |
260 EXPECT_EQ(-1, fstat(kDummyInt, &out_statbuf)); | 285 EXPECT_EQ(-1, fstat(kDummyInt, &out_statbuf)); |
| 286 ASSERT_EQ(kDummyErrno, errno); |
261 } | 287 } |
262 | 288 |
263 TEST_F(KernelWrapTest, ftruncate) { | 289 TEST_F(KernelWrapTest, ftruncate) { |
264 EXPECT_CALL(mock, ftruncate(kDummyInt, kDummyInt2)) | 290 EXPECT_CALL(mock, ftruncate(kDummyInt, kDummyInt2)) |
265 .WillOnce(Return(kDummyInt3)); | 291 .WillOnce(Return(kDummyInt3)); |
266 EXPECT_EQ(kDummyInt3, ftruncate(kDummyInt, kDummyInt2)); | 292 EXPECT_EQ(kDummyInt3, ftruncate(kDummyInt, kDummyInt2)); |
267 } | 293 } |
268 | 294 |
269 TEST_F(KernelWrapTest, fsync) { | 295 TEST_F(KernelWrapTest, fsync) { |
270 EXPECT_CALL(mock, fsync(kDummyInt)).WillOnce(Return(-1)); | 296 EXPECT_CALL(mock, fsync(kDummyInt)) |
| 297 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
271 EXPECT_EQ(-1, fsync(kDummyInt)); | 298 EXPECT_EQ(-1, fsync(kDummyInt)); |
| 299 ASSERT_EQ(kDummyErrno, errno); |
272 } | 300 } |
273 | 301 |
274 TEST_F(KernelWrapTest, getcwd) { | 302 TEST_F(KernelWrapTest, getcwd) { |
275 char result[] = "getcwd_result"; | 303 char result[] = "getcwd_result"; |
276 char buffer[] = "getcwd"; | 304 char buffer[] = "getcwd"; |
277 EXPECT_CALL(mock, getcwd(buffer, kDummySizeT)).WillOnce(Return(result)); | 305 EXPECT_CALL(mock, getcwd(buffer, kDummySizeT)).WillOnce(Return(result)); |
278 EXPECT_EQ(result, getcwd(buffer, kDummySizeT)); | 306 EXPECT_EQ(result, getcwd(buffer, kDummySizeT)); |
279 } | 307 } |
280 | 308 |
281 TEST_F(KernelWrapTest, getdents) { | 309 TEST_F(KernelWrapTest, getdents) { |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
405 TEST_F(KernelWrapTest, munmap) { | 433 TEST_F(KernelWrapTest, munmap) { |
406 // The way we wrap munmap, calls the "real" mmap as well as the intercepted | 434 // The way we wrap munmap, calls the "real" mmap as well as the intercepted |
407 // one. The result returned is from the "real" mmap. | 435 // one. The result returned is from the "real" mmap. |
408 int dummy1 = 123; | 436 int dummy1 = 123; |
409 void* kDummyVoidPtr = &dummy1; | 437 void* kDummyVoidPtr = &dummy1; |
410 size_t kDummySizeT = sizeof(kDummyVoidPtr); | 438 size_t kDummySizeT = sizeof(kDummyVoidPtr); |
411 EXPECT_CALL(mock, munmap(kDummyVoidPtr, kDummySizeT)); | 439 EXPECT_CALL(mock, munmap(kDummyVoidPtr, kDummySizeT)); |
412 munmap(kDummyVoidPtr, kDummySizeT); | 440 munmap(kDummyVoidPtr, kDummySizeT); |
413 } | 441 } |
414 | 442 |
415 | |
416 TEST_F(KernelWrapTest, open) { | 443 TEST_F(KernelWrapTest, open) { |
417 // We pass O_RDONLY because we do not want an error in flags translation | 444 // We pass O_RDONLY because we do not want an error in flags translation |
418 EXPECT_CALL(mock, open(kDummyConstChar, 0)) | 445 EXPECT_CALL(mock, open(kDummyConstChar, 0)) |
| 446 .WillOnce(Return(kDummyInt2)) |
419 .WillOnce(Return(kDummyInt2)); | 447 .WillOnce(Return(kDummyInt2)); |
| 448 |
420 EXPECT_EQ(kDummyInt2, open(kDummyConstChar, 0)); | 449 EXPECT_EQ(kDummyInt2, open(kDummyConstChar, 0)); |
421 | |
422 EXPECT_CALL(mock, open(kDummyConstChar, 0)) | |
423 .WillOnce(Return(kDummyInt2)); | |
424 EXPECT_EQ(kDummyInt2, open(kDummyConstChar, 0)); | 450 EXPECT_EQ(kDummyInt2, open(kDummyConstChar, 0)); |
425 } | 451 } |
426 | 452 |
427 TEST_F(KernelWrapTest, pipe) { | 453 TEST_F(KernelWrapTest, pipe) { |
428 int fds[] = {1, 2}; | 454 int fds[] = {1, 2}; |
429 EXPECT_CALL(mock, pipe(fds)).WillOnce(Return(kDummyInt)); | 455 EXPECT_CALL(mock, pipe(fds)).WillOnce(Return(kDummyInt)); |
430 EXPECT_EQ(kDummyInt, pipe(fds)); | 456 EXPECT_EQ(kDummyInt, pipe(fds)); |
431 } | 457 } |
432 | 458 |
433 TEST_F(KernelWrapTest, read) { | 459 TEST_F(KernelWrapTest, read) { |
434 int dummy_value; | 460 int dummy_value; |
435 void* dummy_void_ptr = &dummy_value; | 461 void* dummy_void_ptr = &dummy_value; |
436 EXPECT_CALL(mock, read(kDummyInt, dummy_void_ptr, kDummyInt2)) | 462 EXPECT_CALL(mock, read(kDummyInt, dummy_void_ptr, kDummyInt2)) |
437 .WillOnce(Return(kDummyInt3)); | 463 .WillOnce(Return(kDummyInt3)); |
438 EXPECT_EQ(kDummyInt3, read(kDummyInt, dummy_void_ptr, kDummyInt2)); | 464 EXPECT_EQ(kDummyInt3, read(kDummyInt, dummy_void_ptr, kDummyInt2)); |
439 } | 465 } |
440 | 466 |
441 TEST_F(KernelWrapTest, readlink) { | 467 TEST_F(KernelWrapTest, readlink) { |
442 char buf[10]; | 468 char buf[10]; |
443 | 469 |
444 EXPECT_CALL(mock, readlink(kDummyConstChar, buf, 10)) | 470 EXPECT_CALL(mock, readlink(kDummyConstChar, buf, 10)) |
445 .WillOnce(Return(-1)); | 471 .WillOnce(Return(kDummyInt)) |
| 472 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 473 |
| 474 EXPECT_EQ(kDummyInt, readlink(kDummyConstChar, buf, 10)); |
446 EXPECT_EQ(-1, readlink(kDummyConstChar, buf, 10)); | 475 EXPECT_EQ(-1, readlink(kDummyConstChar, buf, 10)); |
447 | 476 ASSERT_EQ(kDummyErrno, errno); |
448 EXPECT_CALL(mock, readlink(kDummyConstChar, buf, 10)) | |
449 .WillOnce(Return(kDummyInt)); | |
450 EXPECT_EQ(kDummyInt, readlink(kDummyConstChar, buf, 10)); | |
451 } | 477 } |
452 | 478 |
453 #ifdef __GLIBC__ | 479 #ifdef __GLIBC__ |
454 // Under newlib there is no remove syscall. Instead it is implemented | 480 // Under newlib there is no remove syscall. Instead it is implemented |
455 // in terms of unlink()/rmdir(). | 481 // in terms of unlink()/rmdir(). |
456 TEST_F(KernelWrapTest, remove) { | 482 TEST_F(KernelWrapTest, remove) { |
457 EXPECT_CALL(mock, remove(kDummyConstChar)).WillOnce(Return(-1)); | 483 EXPECT_CALL(mock, remove(kDummyConstChar)).WillOnce(Return(-1)); |
458 EXPECT_EQ(-1, remove(kDummyConstChar)); | 484 EXPECT_EQ(-1, remove(kDummyConstChar)); |
459 } | 485 } |
460 #endif | 486 #endif |
461 | 487 |
462 TEST_F(KernelWrapTest, rename) { | 488 TEST_F(KernelWrapTest, rename) { |
463 EXPECT_CALL(mock, rename(kDummyConstChar, kDummyConstChar2)) | 489 EXPECT_CALL(mock, rename(kDummyConstChar, kDummyConstChar2)) |
464 .WillOnce(Return(-1)); | 490 .WillOnce(Return(0)) |
| 491 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 492 |
| 493 EXPECT_EQ(0, rename(kDummyConstChar, kDummyConstChar2)); |
465 EXPECT_EQ(-1, rename(kDummyConstChar, kDummyConstChar2)); | 494 EXPECT_EQ(-1, rename(kDummyConstChar, kDummyConstChar2)); |
466 | 495 ASSERT_EQ(kDummyErrno, errno); |
467 EXPECT_CALL(mock, rename(kDummyConstChar, kDummyConstChar2)) | |
468 .WillOnce(Return(0)); | |
469 EXPECT_EQ(0, rename(kDummyConstChar, kDummyConstChar2)); | |
470 } | 496 } |
471 | 497 |
472 TEST_F(KernelWrapTest, rmdir) { | 498 TEST_F(KernelWrapTest, rmdir) { |
473 EXPECT_CALL(mock, rmdir(kDummyConstChar)).WillOnce(Return(kDummyInt)); | 499 EXPECT_CALL(mock, rmdir(kDummyConstChar)).WillOnce(Return(kDummyInt)); |
474 EXPECT_EQ(kDummyInt, rmdir(kDummyConstChar)); | 500 EXPECT_EQ(kDummyInt, rmdir(kDummyConstChar)); |
475 } | 501 } |
476 | 502 |
477 static void new_handler(int) {} | 503 static void new_handler(int) {} |
478 | 504 |
479 TEST_F(KernelWrapTest, sigaction) { | 505 TEST_F(KernelWrapTest, sigaction) { |
(...skipping 17 matching lines...) Expand all Loading... |
497 EXPECT_EQ(NULL, signal(kDummyInt, new_handler)); | 523 EXPECT_EQ(NULL, signal(kDummyInt, new_handler)); |
498 } | 524 } |
499 | 525 |
500 TEST_F(KernelWrapTest, stat) { | 526 TEST_F(KernelWrapTest, stat) { |
501 // The way we wrap stat does not support returning aribtrary values, only 0 | 527 // The way we wrap stat does not support returning aribtrary values, only 0 |
502 // or -1. | 528 // or -1. |
503 struct stat in_statbuf; | 529 struct stat in_statbuf; |
504 MakeDummyStatbuf(&in_statbuf); | 530 MakeDummyStatbuf(&in_statbuf); |
505 EXPECT_CALL(mock, stat(StrEq(kDummyConstChar), _)) | 531 EXPECT_CALL(mock, stat(StrEq(kDummyConstChar), _)) |
506 .WillOnce(DoAll(SetStat(&in_statbuf), Return(0))) | 532 .WillOnce(DoAll(SetStat(&in_statbuf), Return(0))) |
507 .WillOnce(Return(-1)); | 533 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
508 struct stat out_statbuf; | 534 struct stat out_statbuf; |
| 535 |
509 EXPECT_EQ(0, stat(kDummyConstChar, &out_statbuf)); | 536 EXPECT_EQ(0, stat(kDummyConstChar, &out_statbuf)); |
510 EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf)); | 537 EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf)); |
| 538 |
511 EXPECT_EQ(-1, stat(kDummyConstChar, &out_statbuf)); | 539 EXPECT_EQ(-1, stat(kDummyConstChar, &out_statbuf)); |
| 540 ASSERT_EQ(kDummyErrno, errno); |
512 } | 541 } |
513 | 542 |
514 TEST_F(KernelWrapTest, symlink) { | 543 TEST_F(KernelWrapTest, symlink) { |
515 EXPECT_CALL(mock, symlink(kDummyConstChar, kDummyConstChar2)) | 544 EXPECT_CALL(mock, symlink(kDummyConstChar, kDummyConstChar2)) |
516 .WillOnce(Return(kDummyInt)); | 545 .WillOnce(Return(kDummyInt)); |
517 EXPECT_EQ(kDummyInt, symlink(kDummyConstChar, kDummyConstChar2)); | 546 EXPECT_EQ(kDummyInt, symlink(kDummyConstChar, kDummyConstChar2)); |
518 } | 547 } |
519 | 548 |
520 #ifndef __BIONIC__ | 549 #ifndef __BIONIC__ |
521 TEST_F(KernelWrapTest, tcflush) { | 550 TEST_F(KernelWrapTest, tcflush) { |
(...skipping 15 matching lines...) Expand all Loading... |
537 EXPECT_EQ(kDummyInt3, tcsetattr(kDummyInt, kDummyInt2, &term)); | 566 EXPECT_EQ(kDummyInt3, tcsetattr(kDummyInt, kDummyInt2, &term)); |
538 } | 567 } |
539 #endif | 568 #endif |
540 | 569 |
541 TEST_F(KernelWrapTest, umount) { | 570 TEST_F(KernelWrapTest, umount) { |
542 EXPECT_CALL(mock, umount(kDummyConstChar)).WillOnce(Return(kDummyInt)); | 571 EXPECT_CALL(mock, umount(kDummyConstChar)).WillOnce(Return(kDummyInt)); |
543 EXPECT_EQ(kDummyInt, umount(kDummyConstChar)); | 572 EXPECT_EQ(kDummyInt, umount(kDummyConstChar)); |
544 } | 573 } |
545 | 574 |
546 TEST_F(KernelWrapTest, truncate) { | 575 TEST_F(KernelWrapTest, truncate) { |
547 EXPECT_CALL(mock, truncate(kDummyConstChar, kDummyInt3)).WillOnce(Return(-1)); | 576 EXPECT_CALL(mock, truncate(kDummyConstChar, kDummyInt3)) |
| 577 .WillOnce(Return(0)) |
| 578 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
| 579 |
| 580 EXPECT_EQ(0, truncate(kDummyConstChar, kDummyInt3)); |
| 581 |
548 EXPECT_EQ(-1, truncate(kDummyConstChar, kDummyInt3)); | 582 EXPECT_EQ(-1, truncate(kDummyConstChar, kDummyInt3)); |
549 | |
550 EXPECT_CALL(mock, truncate(kDummyConstChar, kDummyInt3)).WillOnce(Return(0)); | |
551 EXPECT_EQ(0, truncate(kDummyConstChar, kDummyInt3)); | |
552 } | 583 } |
553 | 584 |
554 TEST_F(KernelWrapTest, lstat) { | 585 TEST_F(KernelWrapTest, lstat) { |
555 struct stat in_statbuf; | 586 struct stat in_statbuf; |
556 MakeDummyStatbuf(&in_statbuf); | 587 MakeDummyStatbuf(&in_statbuf); |
557 EXPECT_CALL(mock, lstat(StrEq(kDummyConstChar), _)) | 588 EXPECT_CALL(mock, lstat(StrEq(kDummyConstChar), _)) |
558 .WillOnce(DoAll(SetStat(&in_statbuf), Return(0))) | 589 .WillOnce(DoAll(SetStat(&in_statbuf), Return(0))) |
559 .WillOnce(Return(-1)); | 590 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
560 struct stat out_statbuf; | 591 struct stat out_statbuf; |
| 592 |
561 EXPECT_EQ(0, lstat(kDummyConstChar, &out_statbuf)); | 593 EXPECT_EQ(0, lstat(kDummyConstChar, &out_statbuf)); |
562 EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf)); | 594 EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf)); |
| 595 |
563 EXPECT_EQ(-1, lstat(kDummyConstChar, &out_statbuf)); | 596 EXPECT_EQ(-1, lstat(kDummyConstChar, &out_statbuf)); |
| 597 ASSERT_EQ(kDummyErrno, errno); |
564 } | 598 } |
565 | 599 |
566 TEST_F(KernelWrapTest, unlink) { | 600 TEST_F(KernelWrapTest, unlink) { |
567 EXPECT_CALL(mock, unlink(kDummyConstChar)).WillOnce(Return(kDummyInt)); | 601 EXPECT_CALL(mock, unlink(kDummyConstChar)).WillOnce(Return(kDummyInt)); |
568 EXPECT_EQ(kDummyInt, unlink(kDummyConstChar)); | 602 EXPECT_EQ(kDummyInt, unlink(kDummyConstChar)); |
569 } | 603 } |
570 | 604 |
571 TEST_F(KernelWrapTest, utime) { | 605 TEST_F(KernelWrapTest, utime) { |
572 const struct utimbuf* times = NULL; | 606 const struct utimbuf* times = NULL; |
573 EXPECT_CALL(mock, utime(kDummyConstChar, times)).WillOnce(Return(kDummyInt)); | 607 EXPECT_CALL(mock, utime(kDummyConstChar, times)).WillOnce(Return(kDummyInt)); |
574 EXPECT_EQ(kDummyInt, utime(kDummyConstChar, times)); | 608 EXPECT_EQ(kDummyInt, utime(kDummyConstChar, times)); |
575 } | 609 } |
576 | 610 |
577 TEST_F(KernelWrapTest, utimes) { | 611 TEST_F(KernelWrapTest, utimes) { |
578 struct timeval* times = NULL; | 612 struct timeval* times = NULL; |
579 EXPECT_CALL(mock, utimes(kDummyConstChar, times)).WillOnce(Return(-1)); | 613 EXPECT_CALL(mock, utimes(kDummyConstChar, times)) |
| 614 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1))); |
580 EXPECT_EQ(-1, utimes(kDummyConstChar, times)); | 615 EXPECT_EQ(-1, utimes(kDummyConstChar, times)); |
| 616 ASSERT_EQ(kDummyErrno, errno); |
581 } | 617 } |
582 | 618 |
583 TEST_F(KernelWrapTest, write) { | 619 TEST_F(KernelWrapTest, write) { |
584 EXPECT_CALL(mock, write(kDummyInt, kDummyVoidPtr, kDummyInt2)) | 620 EXPECT_CALL(mock, write(kDummyInt, kDummyVoidPtr, kDummyInt2)) |
585 .WillOnce(Return(kDummyInt3)); | 621 .WillOnce(Return(kDummyInt3)); |
586 EXPECT_EQ(kDummyInt3, write(kDummyInt, kDummyVoidPtr, kDummyInt2)); | 622 EXPECT_EQ(kDummyInt3, write(kDummyInt, kDummyVoidPtr, kDummyInt2)); |
587 } | 623 } |
588 | 624 |
589 #if defined(PROVIDES_SOCKET_API) and !defined(__BIONIC__) | 625 #if defined(PROVIDES_SOCKET_API) and !defined(__BIONIC__) |
590 TEST_F(KernelWrapTest, poll) { | 626 TEST_F(KernelWrapTest, poll) { |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
803 .WillOnce(Return(-1)); | 839 .WillOnce(Return(-1)); |
804 EXPECT_EQ(0, | 840 EXPECT_EQ(0, |
805 socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val)); | 841 socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val)); |
806 EXPECT_EQ(-1, | 842 EXPECT_EQ(-1, |
807 socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val)); | 843 socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val)); |
808 } | 844 } |
809 | 845 |
810 #endif // PROVIDES_SOCKET_API | 846 #endif // PROVIDES_SOCKET_API |
811 | 847 |
812 #endif // __linux__ | 848 #endif // __linux__ |
OLD | NEW |