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
3 // found in the LICENSE file.
5 // The linux host build of nacl_io can't do wrapping of syscalls so all
6 // these tests must be disabled.
7 #if !defined(__linux__)
14 #include "gtest/gtest.h"
15 #include "mock_kernel_proxy.h"
16 #include "nacl_io/kernel_intercept.h"
17 #include "nacl_io/kernel_wrap.h"
18 #include "nacl_io/kernel_wrap_real.h"
19 #include "nacl_io/osmman.h"
20 #include "nacl_io/ossocket.h"
21 #include "nacl_io/ostermios.h"
23 #if defined(__native_client__) && !defined(__GLIBC__)
25 // TODO(sbc): remove once these get added to the newlib toolchain headers.
27 int utimes(const char *filename, const struct timeval times[2]);
31 using namespace nacl_io;
34 using ::testing::AnyNumber;
35 using ::testing::DoAll;
36 using ::testing::Invoke;
37 using ::testing::Return;
38 using ::testing::StrEq;
42 #define COMPARE_FIELD(f) \
43 if (arg->f != statbuf->f) { \
44 *result_listener << "mismatch of field \"" #f \
46 "expected: " << statbuf->f << " actual: " << arg->f; \
50 MATCHER_P(IsEqualToStatbuf, statbuf, "") {
51 COMPARE_FIELD(st_dev);
52 COMPARE_FIELD(st_ino);
53 COMPARE_FIELD(st_mode);
54 COMPARE_FIELD(st_nlink);
55 COMPARE_FIELD(st_uid);
56 COMPARE_FIELD(st_gid);
57 COMPARE_FIELD(st_rdev);
58 COMPARE_FIELD(st_size);
59 COMPARE_FIELD(st_atime);
60 COMPARE_FIELD(st_mtime);
61 COMPARE_FIELD(st_ctime);
67 ACTION_P(SetErrno, value) {
71 ACTION_P2(SetString, target, source) {
72 strcpy(target, source);
75 ACTION_P(SetStat, statbuf) {
76 memset(arg1, 0, sizeof(struct stat));
77 arg1->st_dev = statbuf->st_dev;
78 arg1->st_ino = statbuf->st_ino;
79 arg1->st_mode = statbuf->st_mode;
80 arg1->st_nlink = statbuf->st_nlink;
81 arg1->st_uid = statbuf->st_uid;
82 arg1->st_gid = statbuf->st_gid;
83 arg1->st_rdev = statbuf->st_rdev;
84 arg1->st_size = statbuf->st_size;
85 arg1->st_atime = statbuf->st_atime;
86 arg1->st_mtime = statbuf->st_mtime;
87 arg1->st_ctime = statbuf->st_ctime;
90 void MakeDummyStatbuf(struct stat* statbuf) {
91 memset(&statbuf[0], 0, sizeof(struct stat));
95 statbuf->st_nlink = 4;
100 statbuf->st_atime = 9;
101 statbuf->st_mtime = 10;
102 statbuf->st_ctime = 11;
105 const mode_t kDummyMode = 0xbeef;
106 const int kDummyErrno = 0xfeeb;
107 const int kDummyInt = 0xdedbeef;
108 const int kDummyInt2 = 0xcabba6e;
109 const int kDummyInt3 = 0xf00ba4;
110 const int kDummyInt4 = 0xabacdba;
111 const size_t kDummySizeT = 0x60067e;
112 const char* kDummyConstChar = "foobar";
113 const char* kDummyConstChar2 = "g00gl3";
114 const char* kDummyConstChar3 = "fr00gl3";
115 const void* kDummyVoidPtr = "blahblah";
116 const uid_t kDummyUid = 1001;
117 const gid_t kDummyGid = 1002;
119 class KernelWrapTest : public ::testing::Test {
123 virtual void SetUp() {
124 // Initialize the global errno value to a consistent value rather than
125 // relying on its value from previous test runs.
128 // Initializing the KernelProxy opens stdin/stdout/stderr.
129 EXPECT_CALL(mock, open(_, _))
132 .WillOnce(Return(2));
134 ASSERT_EQ(0, ki_push_state_for_testing());
135 ASSERT_EQ(0, ki_init(&mock));
137 // We allow write to be called any number of times, and it forwards to
138 // _real_write. This prevents an infinite loop writing output if there is a
140 ON_CALL(mock, write(_, _, _))
141 .WillByDefault(Invoke(this, &KernelWrapTest::DefaultWrite));
142 EXPECT_CALL(mock, write(_, _, _)).Times(AnyNumber());
146 // Uninitialize the kernel proxy so wrapped functions passthrough to their
147 // unwrapped versions.
151 MockKernelProxy mock;
154 ssize_t DefaultWrite(int fd, const void* buf, size_t count) {
157 int rtn = _real_write(fd, buf, count, &nwrote);
168 TEST_F(KernelWrapTest, access) {
169 EXPECT_CALL(mock, access(kDummyConstChar, kDummyInt)) .WillOnce(Return(0));
170 EXPECT_EQ(0, access(kDummyConstChar, kDummyInt));
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);
179 TEST_F(KernelWrapTest, chdir) {
180 EXPECT_CALL(mock, chdir(kDummyConstChar)).WillOnce(Return(0));
181 EXPECT_EQ(0, chdir(kDummyConstChar));
183 EXPECT_CALL(mock, chdir(kDummyConstChar))
184 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
185 EXPECT_EQ(-1, chdir(kDummyConstChar));
186 ASSERT_EQ(kDummyErrno, errno);
189 TEST_F(KernelWrapTest, chmod) {
190 EXPECT_CALL(mock, chmod(kDummyConstChar, kDummyMode))
191 .WillOnce(Return(kDummyInt2));
192 EXPECT_EQ(kDummyInt2,chmod(kDummyConstChar, kDummyMode));
195 TEST_F(KernelWrapTest, chown) {
196 EXPECT_CALL(mock, chown(kDummyConstChar, kDummyUid, kDummyGid))
197 .WillOnce(Return(kDummyInt));
198 EXPECT_EQ(kDummyInt, chown(kDummyConstChar, kDummyUid, kDummyGid));
201 TEST_F(KernelWrapTest, close) {
202 // The way we wrap close does not support returning arbitrary values, so we
204 EXPECT_CALL(mock, close(kDummyInt))
205 .WillOnce(Return(0));
207 EXPECT_EQ(0, close(kDummyInt));
209 EXPECT_CALL(mock, close(kDummyInt))
210 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
211 EXPECT_EQ(-1, close(kDummyInt));
212 ASSERT_EQ(kDummyErrno, errno);
215 TEST_F(KernelWrapTest, dup) {
216 EXPECT_CALL(mock, dup(kDummyInt)).WillOnce(Return(kDummyInt2));
217 EXPECT_EQ(kDummyInt2, dup(kDummyInt));
220 TEST_F(KernelWrapTest, dup2) {
221 // The way we wrap dup2 does not support returning aribtrary values, only -1
222 // or the value of the new fd.
223 EXPECT_CALL(mock, dup2(kDummyInt, kDummyInt2))
224 .WillOnce(Return(kDummyInt2))
225 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
227 EXPECT_EQ(kDummyInt2, dup2(kDummyInt, kDummyInt2));
228 EXPECT_EQ(-1, dup2(kDummyInt, kDummyInt2));
229 ASSERT_EQ(kDummyErrno, errno);
232 TEST_F(KernelWrapTest, fchdir) {
233 EXPECT_CALL(mock, fchdir(kDummyInt))
234 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
236 EXPECT_EQ(-1, fchdir(kDummyInt));
237 ASSERT_EQ(kDummyErrno, errno);
240 TEST_F(KernelWrapTest, fchmod) {
241 EXPECT_CALL(mock, fchmod(kDummyInt, kDummyMode))
243 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
245 EXPECT_EQ(0, fchmod(kDummyInt, kDummyMode));
246 EXPECT_EQ(-1, fchmod(kDummyInt, kDummyMode));
247 ASSERT_EQ(kDummyErrno, errno);
250 TEST_F(KernelWrapTest, fchown) {
251 EXPECT_CALL(mock, fchown(kDummyInt, kDummyUid, kDummyGid))
252 .WillOnce(Return(kDummyInt));
253 EXPECT_EQ(kDummyInt, fchown(kDummyInt, kDummyUid, kDummyGid));
256 TEST_F(KernelWrapTest, fcntl) {
257 char buffer[] = "fcntl";
258 EXPECT_CALL(mock, fcntl(kDummyInt, kDummyInt2, _))
259 .WillOnce(Return(kDummyInt3));
260 EXPECT_EQ(kDummyInt3, fcntl(kDummyInt, kDummyInt2, buffer));
263 TEST_F(KernelWrapTest, fdatasync) {
264 EXPECT_CALL(mock, fdatasync(kDummyInt)).WillOnce(Return(0))
265 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
267 EXPECT_EQ(0, fdatasync(kDummyInt));
268 EXPECT_EQ(-1, fdatasync(kDummyInt));
269 ASSERT_EQ(kDummyErrno, errno);
272 TEST_F(KernelWrapTest, fstat) {
273 // The way we wrap fstat does not support returning aribtrary values, only 0
275 struct stat in_statbuf;
276 MakeDummyStatbuf(&in_statbuf);
277 EXPECT_CALL(mock, fstat(kDummyInt, _))
278 .WillOnce(DoAll(SetStat(&in_statbuf), Return(0)))
279 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
280 struct stat out_statbuf;
282 EXPECT_EQ(0, fstat(kDummyInt, &out_statbuf));
283 EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf));
285 EXPECT_EQ(-1, fstat(kDummyInt, &out_statbuf));
286 ASSERT_EQ(kDummyErrno, errno);
289 TEST_F(KernelWrapTest, ftruncate) {
290 EXPECT_CALL(mock, ftruncate(kDummyInt, kDummyInt2))
291 .WillOnce(Return(kDummyInt3));
292 EXPECT_EQ(kDummyInt3, ftruncate(kDummyInt, kDummyInt2));
295 TEST_F(KernelWrapTest, fsync) {
296 EXPECT_CALL(mock, fsync(kDummyInt))
297 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
298 EXPECT_EQ(-1, fsync(kDummyInt));
299 ASSERT_EQ(kDummyErrno, errno);
302 TEST_F(KernelWrapTest, getcwd) {
303 char buffer[PATH_MAX];
304 char result[PATH_MAX];
305 memset(buffer, 0, PATH_MAX);
306 strcpy(result, "getcwd_result");
307 EXPECT_CALL(mock, getcwd(buffer, kDummySizeT))
308 .WillOnce(DoAll(SetString(buffer, result), Return(buffer)));
309 EXPECT_STREQ(result, getcwd(buffer, kDummySizeT));
312 TEST_F(KernelWrapTest, getdents) {
313 #if !defined( __GLIBC__) && !defined(__BIONIC__)
314 // TODO(sbc): Find a way to test the getdents wrapper under glibc.
315 // It looks like the only way to exercise it is to call readdir(2).
316 // There is an internal glibc function __getdents that will call the
317 // IRT but that cannot be accessed from here as glibc does not export it.
319 void* void_ptr = &dummy_val;
320 EXPECT_CALL(mock, getdents(kDummyInt, void_ptr, kDummyInt2))
321 .WillOnce(Return(kDummyInt2));
322 EXPECT_EQ(kDummyInt2, getdents(kDummyInt, void_ptr, kDummyInt2));
326 // gcc gives error: getwd is deprecated.
327 #if defined(__GNUC__)
328 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
330 TEST_F(KernelWrapTest, getwd) {
331 char result[] = "getwd_result";
332 char buffer[] = "getwd";
333 EXPECT_CALL(mock, getwd(buffer)).WillOnce(Return(result));
334 EXPECT_EQ(result, getwd(buffer));
336 #if defined(__GNUC__)
337 #pragma GCC diagnostic warning "-Wdeprecated-declarations"
340 TEST_F(KernelWrapTest, ioctl) {
341 char buffer[] = "ioctl";
342 EXPECT_CALL(mock, ioctl(kDummyInt, kDummyInt2, _))
343 .WillOnce(Return(kDummyInt3));
344 EXPECT_EQ(kDummyInt3, ioctl(kDummyInt, kDummyInt2, buffer));
347 #if !defined(__BIONIC__)
348 TEST_F(KernelWrapTest, isatty) {
349 EXPECT_CALL(mock, isatty(kDummyInt)).WillOnce(Return(kDummyInt2));
350 EXPECT_EQ(kDummyInt2, isatty(kDummyInt));
352 // This test verifies that the IRT interception wrapper for isatty
353 // ignores the value of errno when isatty() returns 1. We had a bug
354 // where returning 1 from ki_isatty resulted in errno being returned
355 // by the IRT interface.
357 EXPECT_CALL(mock, isatty(kDummyInt)).WillOnce(Return(1));
358 EXPECT_EQ(1, isatty(kDummyInt));
362 TEST_F(KernelWrapTest, kill) {
363 EXPECT_CALL(mock, kill(kDummyInt, kDummyInt2)).WillOnce(Return(kDummyInt3));
364 EXPECT_EQ(kDummyInt3, kill(kDummyInt, kDummyInt2));
367 TEST_F(KernelWrapTest, lchown) {
368 EXPECT_CALL(mock, lchown(kDummyConstChar, kDummyUid, kDummyGid))
369 .WillOnce(Return(kDummyInt));
370 EXPECT_EQ(kDummyInt, lchown(kDummyConstChar, kDummyUid, kDummyGid));
373 TEST_F(KernelWrapTest, link) {
374 EXPECT_CALL(mock, link(kDummyConstChar, kDummyConstChar2))
375 .WillOnce(Return(kDummyInt));
376 EXPECT_EQ(kDummyInt, link(kDummyConstChar, kDummyConstChar2));
379 TEST_F(KernelWrapTest, lseek) {
380 EXPECT_CALL(mock, lseek(kDummyInt, kDummyInt2, kDummyInt3))
381 .WillOnce(Return(kDummyInt4));
382 EXPECT_EQ(kDummyInt4, lseek(kDummyInt, kDummyInt2, kDummyInt3));
385 TEST_F(KernelWrapTest, mkdir) {
387 EXPECT_CALL(mock, mkdir(kDummyConstChar, 0777)).WillOnce(Return(kDummyInt2));
388 EXPECT_EQ(kDummyInt2, mkdir(kDummyConstChar));
390 EXPECT_CALL(mock, mkdir(kDummyConstChar, kDummyMode))
391 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
392 EXPECT_EQ(-1, mkdir(kDummyConstChar, kDummyMode));
393 ASSERT_EQ(kDummyErrno, errno);
397 TEST_F(KernelWrapTest, mmap) {
398 // We only wrap mmap if |flags| has the MAP_ANONYMOUS bit unset.
399 int flags = kDummyInt2 & ~MAP_ANONYMOUS;
401 const size_t kDummySizeT2 = 0xbadf00d;
404 void* kDummyVoidPtr1 = &dummy1;
405 void* kDummyVoidPtr2 = &dummy2;
412 kDummySizeT2)).WillOnce(Return(kDummyVoidPtr2));
413 EXPECT_EQ(kDummyVoidPtr2,
422 TEST_F(KernelWrapTest, mount) {
424 mount(kDummyConstChar,
428 kDummyVoidPtr)).WillOnce(Return(kDummyInt2));
429 EXPECT_EQ(kDummyInt2,
430 mount(kDummyConstChar,
437 TEST_F(KernelWrapTest, munmap) {
438 // The way we wrap munmap, calls the "real" mmap as well as the intercepted
439 // one. The result returned is from the "real" mmap.
441 void* kDummyVoidPtr = &dummy1;
442 size_t kDummySizeT = sizeof(kDummyVoidPtr);
443 EXPECT_CALL(mock, munmap(kDummyVoidPtr, kDummySizeT));
444 munmap(kDummyVoidPtr, kDummySizeT);
447 TEST_F(KernelWrapTest, open) {
448 // We pass O_RDONLY because we do not want an error in flags translation
449 EXPECT_CALL(mock, open(kDummyConstChar, 0))
450 .WillOnce(Return(kDummyInt2))
451 .WillOnce(Return(kDummyInt2));
453 EXPECT_EQ(kDummyInt2, open(kDummyConstChar, 0));
454 EXPECT_EQ(kDummyInt2, open(kDummyConstChar, 0));
457 TEST_F(KernelWrapTest, pipe) {
459 EXPECT_CALL(mock, pipe(fds)).WillOnce(Return(kDummyInt));
460 EXPECT_EQ(kDummyInt, pipe(fds));
463 TEST_F(KernelWrapTest, read) {
465 void* dummy_void_ptr = &dummy_value;
466 EXPECT_CALL(mock, read(kDummyInt, dummy_void_ptr, kDummyInt2))
467 .WillOnce(Return(kDummyInt3));
468 EXPECT_EQ(kDummyInt3, read(kDummyInt, dummy_void_ptr, kDummyInt2));
471 TEST_F(KernelWrapTest, readlink) {
474 EXPECT_CALL(mock, readlink(kDummyConstChar, buf, 10))
475 .WillOnce(Return(kDummyInt))
476 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
478 EXPECT_EQ(kDummyInt, readlink(kDummyConstChar, buf, 10));
479 EXPECT_EQ(-1, readlink(kDummyConstChar, buf, 10));
480 ASSERT_EQ(kDummyErrno, errno);
484 // Under newlib there is no remove syscall. Instead it is implemented
485 // in terms of unlink()/rmdir().
486 TEST_F(KernelWrapTest, remove) {
487 EXPECT_CALL(mock, remove(kDummyConstChar)).WillOnce(Return(-1));
488 EXPECT_EQ(-1, remove(kDummyConstChar));
492 TEST_F(KernelWrapTest, rename) {
493 EXPECT_CALL(mock, rename(kDummyConstChar, kDummyConstChar2))
495 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
497 EXPECT_EQ(0, rename(kDummyConstChar, kDummyConstChar2));
498 EXPECT_EQ(-1, rename(kDummyConstChar, kDummyConstChar2));
499 ASSERT_EQ(kDummyErrno, errno);
502 TEST_F(KernelWrapTest, rmdir) {
503 EXPECT_CALL(mock, rmdir(kDummyConstChar))
504 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
505 EXPECT_EQ(-1, rmdir(kDummyConstChar));
506 ASSERT_EQ(kDummyErrno, errno);
509 static void new_handler(int) {}
511 TEST_F(KernelWrapTest, sigaction) {
512 struct sigaction action;
513 struct sigaction oaction;
514 EXPECT_CALL(mock, sigaction(kDummyInt, &action, &oaction))
515 .WillOnce(Return(0));
516 EXPECT_EQ(0, sigaction(kDummyInt, &action, &oaction));
519 TEST_F(KernelWrapTest, sigset) {
520 EXPECT_CALL(mock, sigaction(kDummyInt, _, _))
521 .WillOnce(Return(0));
522 EXPECT_EQ(NULL, sigset(kDummyInt, new_handler));
525 TEST_F(KernelWrapTest, signal) {
526 // KernelIntercept forwards calls to signal to KernelProxy::sigset.
527 EXPECT_CALL(mock, sigaction(kDummyInt, _, _))
528 .WillOnce(Return(0));
529 EXPECT_EQ(NULL, signal(kDummyInt, new_handler));
532 TEST_F(KernelWrapTest, stat) {
533 // The way we wrap stat does not support returning aribtrary values, only 0
535 struct stat in_statbuf;
536 MakeDummyStatbuf(&in_statbuf);
537 EXPECT_CALL(mock, stat(StrEq(kDummyConstChar), _))
538 .WillOnce(DoAll(SetStat(&in_statbuf), Return(0)))
539 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
540 struct stat out_statbuf;
542 EXPECT_EQ(0, stat(kDummyConstChar, &out_statbuf));
543 EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf));
545 EXPECT_EQ(-1, stat(kDummyConstChar, &out_statbuf));
546 ASSERT_EQ(kDummyErrno, errno);
549 TEST_F(KernelWrapTest, symlink) {
550 EXPECT_CALL(mock, symlink(kDummyConstChar, kDummyConstChar2))
551 .WillOnce(Return(kDummyInt));
552 EXPECT_EQ(kDummyInt, symlink(kDummyConstChar, kDummyConstChar2));
556 TEST_F(KernelWrapTest, tcflush) {
557 EXPECT_CALL(mock, tcflush(kDummyInt, kDummyInt2))
558 .WillOnce(Return(kDummyInt3));
559 EXPECT_EQ(kDummyInt3, tcflush(kDummyInt, kDummyInt2));
562 TEST_F(KernelWrapTest, tcgetattr) {
564 EXPECT_CALL(mock, tcgetattr(kDummyInt, &term)).WillOnce(Return(kDummyInt2));
565 EXPECT_EQ(kDummyInt2, tcgetattr(kDummyInt, &term));
568 TEST_F(KernelWrapTest, tcsetattr) {
570 EXPECT_CALL(mock, tcsetattr(kDummyInt, kDummyInt2, &term))
571 .WillOnce(Return(kDummyInt3));
572 EXPECT_EQ(kDummyInt3, tcsetattr(kDummyInt, kDummyInt2, &term));
576 TEST_F(KernelWrapTest, umount) {
577 EXPECT_CALL(mock, umount(kDummyConstChar)).WillOnce(Return(kDummyInt));
578 EXPECT_EQ(kDummyInt, umount(kDummyConstChar));
581 TEST_F(KernelWrapTest, truncate) {
582 EXPECT_CALL(mock, truncate(kDummyConstChar, kDummyInt3))
584 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
586 EXPECT_EQ(0, truncate(kDummyConstChar, kDummyInt3));
588 EXPECT_EQ(-1, truncate(kDummyConstChar, kDummyInt3));
591 TEST_F(KernelWrapTest, lstat) {
592 struct stat in_statbuf;
593 MakeDummyStatbuf(&in_statbuf);
594 EXPECT_CALL(mock, lstat(StrEq(kDummyConstChar), _))
595 .WillOnce(DoAll(SetStat(&in_statbuf), Return(0)))
596 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
597 struct stat out_statbuf;
599 EXPECT_EQ(0, lstat(kDummyConstChar, &out_statbuf));
600 EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf));
602 EXPECT_EQ(-1, lstat(kDummyConstChar, &out_statbuf));
603 ASSERT_EQ(kDummyErrno, errno);
606 TEST_F(KernelWrapTest, unlink) {
607 EXPECT_CALL(mock, unlink(kDummyConstChar))
608 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
609 EXPECT_EQ(-1, unlink(kDummyConstChar));
610 ASSERT_EQ(kDummyErrno, errno);
613 TEST_F(KernelWrapTest, utime) {
614 const struct utimbuf* times = NULL;
615 EXPECT_CALL(mock, utime(kDummyConstChar, times)).WillOnce(Return(kDummyInt));
616 EXPECT_EQ(kDummyInt, utime(kDummyConstChar, times));
619 TEST_F(KernelWrapTest, utimes) {
620 struct timeval* times = NULL;
621 EXPECT_CALL(mock, utimes(kDummyConstChar, times))
622 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
623 EXPECT_EQ(-1, utimes(kDummyConstChar, times));
624 ASSERT_EQ(kDummyErrno, errno);
627 TEST_F(KernelWrapTest, write) {
628 EXPECT_CALL(mock, write(kDummyInt, kDummyVoidPtr, kDummyInt2))
629 .WillOnce(Return(kDummyInt3));
630 EXPECT_EQ(kDummyInt3, write(kDummyInt, kDummyVoidPtr, kDummyInt2));
633 #if defined(PROVIDES_SOCKET_API) and !defined(__BIONIC__)
634 TEST_F(KernelWrapTest, poll) {
636 EXPECT_CALL(mock, poll(&fds, kDummyInt, kDummyInt2))
637 .WillOnce(Return(kDummyInt3));
638 EXPECT_EQ(kDummyInt3, poll(&fds, kDummyInt, kDummyInt2));
641 TEST_F(KernelWrapTest, select) {
645 EXPECT_CALL(mock, select(kDummyInt, &readfds, &writefds, &exceptfds, NULL))
646 .WillOnce(Return(kDummyInt2));
647 EXPECT_EQ(kDummyInt2,
648 select(kDummyInt, &readfds, &writefds, &exceptfds, NULL));
652 TEST_F(KernelWrapTest, accept) {
653 struct sockaddr addr;
655 EXPECT_CALL(mock, accept(kDummyInt, &addr, &len))
656 .WillOnce(Return(kDummyInt2));
657 EXPECT_EQ(kDummyInt2, accept(kDummyInt, &addr, &len));
660 TEST_F(KernelWrapTest, bind) {
661 // The way we wrap bind does not support returning arbitrary values, so we
663 struct sockaddr addr;
664 EXPECT_CALL(mock, bind(kDummyInt, &addr, kDummyInt2))
666 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
667 EXPECT_EQ(0, bind(kDummyInt, &addr, kDummyInt2));
668 EXPECT_EQ(-1, bind(kDummyInt, &addr, kDummyInt2));
669 EXPECT_EQ(kDummyErrno, errno);
672 TEST_F(KernelWrapTest, connect) {
673 // The way we wrap connect does not support returning arbitrary values, so we
675 struct sockaddr addr;
676 EXPECT_CALL(mock, connect(kDummyInt, &addr, kDummyInt2))
678 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
679 EXPECT_EQ(0, connect(kDummyInt, &addr, kDummyInt2));
680 EXPECT_EQ(-1, connect(kDummyInt, &addr, kDummyInt2));
681 EXPECT_EQ(kDummyErrno, errno);
684 TEST_F(KernelWrapTest, gethostbyname) {
685 struct hostent result;
686 EXPECT_CALL(mock, gethostbyname(kDummyConstChar)).WillOnce(Return(&result));
687 EXPECT_EQ(&result, gethostbyname(kDummyConstChar));
690 TEST_F(KernelWrapTest, getpeername) {
691 // The way we wrap getpeername does not support returning arbitrary values,
692 // so we test 0 and -1.
693 struct sockaddr addr;
695 EXPECT_CALL(mock, getpeername(kDummyInt, &addr, &len))
697 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
698 EXPECT_EQ(0, getpeername(kDummyInt, &addr, &len));
699 EXPECT_EQ(-1, getpeername(kDummyInt, &addr, &len));
700 EXPECT_EQ(kDummyErrno, errno);
703 TEST_F(KernelWrapTest, getsockname) {
704 // The way we wrap getsockname does not support returning arbitrary values,
705 // so we test 0 and -1.
706 struct sockaddr addr;
709 EXPECT_CALL(mock, getsockname(kDummyInt, &addr, &len))
711 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
712 EXPECT_EQ(0, getsockname(kDummyInt, &addr, &len));
713 EXPECT_EQ(-1, getsockname(kDummyInt, &addr, &len));
714 EXPECT_EQ(kDummyErrno, errno);
717 TEST_F(KernelWrapTest, getsockopt) {
718 // The way we wrap getsockname does not support returning arbitrary values,
719 // so we test 0 and -1.
721 void* dummy_void_ptr = &dummy_val;
724 mock, getsockopt(kDummyInt, kDummyInt2, kDummyInt3, dummy_void_ptr, &len))
726 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
729 getsockopt(kDummyInt, kDummyInt2, kDummyInt3, dummy_void_ptr, &len));
732 getsockopt(kDummyInt, kDummyInt2, kDummyInt3, dummy_void_ptr, &len));
733 EXPECT_EQ(kDummyErrno, errno);
736 TEST_F(KernelWrapTest, listen) {
737 // The way we wrap listen does not support returning arbitrary values, so we
739 EXPECT_CALL(mock, listen(kDummyInt, kDummyInt2))
741 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
742 EXPECT_EQ(0, listen(kDummyInt, kDummyInt2));
743 EXPECT_EQ(-1, listen(kDummyInt, kDummyInt2));
744 EXPECT_EQ(kDummyErrno, errno);
747 TEST_F(KernelWrapTest, recv) {
749 void* dummy_void_ptr = &dummy_val;
750 EXPECT_CALL(mock, recv(kDummyInt, dummy_void_ptr, kDummySizeT, kDummyInt2))
751 .WillOnce(Return(kDummyInt3));
752 EXPECT_EQ(kDummyInt3,
753 recv(kDummyInt, dummy_void_ptr, kDummySizeT, kDummyInt2));
756 TEST_F(KernelWrapTest, recvfrom) {
758 void* dummy_void_ptr = &dummy_val;
759 struct sockaddr addr;
763 recvfrom(kDummyInt, dummy_void_ptr, kDummyInt2, kDummyInt3, &addr, &len))
764 .WillOnce(Return(kDummyInt4));
767 recvfrom(kDummyInt, dummy_void_ptr, kDummyInt2, kDummyInt3, &addr, &len));
771 TEST_F(KernelWrapTest, recvmsg) {
773 EXPECT_CALL(mock, recvmsg(kDummyInt, &msg, kDummyInt2))
774 .WillOnce(Return(kDummyInt3));
775 EXPECT_EQ(kDummyInt3, recvmsg(kDummyInt, &msg, kDummyInt2));
779 TEST_F(KernelWrapTest, send) {
780 EXPECT_CALL(mock, send(kDummyInt, kDummyVoidPtr, kDummySizeT, kDummyInt2))
781 .WillOnce(Return(kDummyInt3));
782 EXPECT_EQ(kDummyInt3,
783 send(kDummyInt, kDummyVoidPtr, kDummySizeT, kDummyInt2));
786 TEST_F(KernelWrapTest, sendto) {
787 const socklen_t kDummySockLen = 0x50cc5;
788 struct sockaddr addr;
795 kDummySockLen)).WillOnce(Return(kDummyInt4));
796 EXPECT_EQ(kDummyInt4,
805 TEST_F(KernelWrapTest, sendmsg) {
807 EXPECT_CALL(mock, sendmsg(kDummyInt, &msg, kDummyInt2))
808 .WillOnce(Return(kDummyInt3));
809 EXPECT_EQ(kDummyInt3, sendmsg(kDummyInt, &msg, kDummyInt2));
812 TEST_F(KernelWrapTest, setsockopt) {
813 // The way we wrap setsockopt does not support returning arbitrary values, so
815 const socklen_t kDummySockLen = 0x50cc5;
819 kDummyInt, kDummyInt2, kDummyInt3, kDummyVoidPtr, kDummySockLen))
821 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
825 kDummyInt, kDummyInt2, kDummyInt3, kDummyVoidPtr, kDummySockLen));
829 kDummyInt, kDummyInt2, kDummyInt3, kDummyVoidPtr, kDummySockLen));
830 EXPECT_EQ(kDummyErrno, errno);
833 TEST_F(KernelWrapTest, shutdown) {
834 // The way we wrap shutdown does not support returning arbitrary values, so we
836 EXPECT_CALL(mock, shutdown(kDummyInt, kDummyInt2))
838 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
839 EXPECT_EQ(0, shutdown(kDummyInt, kDummyInt2));
840 EXPECT_EQ(-1, shutdown(kDummyInt, kDummyInt2));
841 EXPECT_EQ(kDummyErrno, errno);
844 TEST_F(KernelWrapTest, socket) {
845 EXPECT_CALL(mock, socket(kDummyInt, kDummyInt2, kDummyInt3))
846 .WillOnce(Return(kDummyInt4));
847 EXPECT_EQ(kDummyInt4, socket(kDummyInt, kDummyInt2, kDummyInt3));
850 TEST_F(KernelWrapTest, socketpair) {
851 // The way we wrap socketpair does not support returning arbitrary values,
852 // so we test 0 and -1.
854 EXPECT_CALL(mock, socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val))
856 .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
857 EXPECT_EQ(0, socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val));
858 EXPECT_EQ(-1, socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val));
859 EXPECT_EQ(kDummyErrno, errno);
862 #endif // PROVIDES_SOCKET_API