kernel_wrap_test.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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.
4
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__)
8
9#include <unistd.h>
10
11#include <string>
12#include <vector>
13
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/osmman.h"
19#include "nacl_io/ossocket.h"
20#include "nacl_io/ostermios.h"
21
22#if defined(__native_client__) && !defined(__GLIBC__)
23extern "C" {
24// TODO(sbc): remove once these get added to the newlib toolchain headers.
25int fchdir(int fd);
26int utimes(const char *filename, const struct timeval times[2]);
27}
28#endif
29
30using namespace nacl_io;
31
32using ::testing::_;
33using ::testing::DoAll;
34using ::testing::Return;
35using ::testing::StrEq;
36
37namespace {
38
39#define COMPARE_FIELD(f)                                                     \
40  if (arg->f != statbuf->f) {                                                \
41    *result_listener << "mismatch of field \"" #f                            \
42                        "\". "                                               \
43                        "expected: " << statbuf->f << " actual: " << arg->f; \
44    return false;                                                            \
45  }
46
47MATCHER_P(IsEqualToStatbuf, statbuf, "") {
48  COMPARE_FIELD(st_dev);
49  COMPARE_FIELD(st_ino);
50  COMPARE_FIELD(st_mode);
51  COMPARE_FIELD(st_nlink);
52  COMPARE_FIELD(st_uid);
53  COMPARE_FIELD(st_gid);
54  COMPARE_FIELD(st_rdev);
55  COMPARE_FIELD(st_size);
56  COMPARE_FIELD(st_atime);
57  COMPARE_FIELD(st_mtime);
58  COMPARE_FIELD(st_ctime);
59  return true;
60}
61
62#undef COMPARE_FIELD
63
64ACTION_P(SetStat, statbuf) {
65  memset(arg1, 0, sizeof(struct stat));
66  arg1->st_dev = statbuf->st_dev;
67  arg1->st_ino = statbuf->st_ino;
68  arg1->st_mode = statbuf->st_mode;
69  arg1->st_nlink = statbuf->st_nlink;
70  arg1->st_uid = statbuf->st_uid;
71  arg1->st_gid = statbuf->st_gid;
72  arg1->st_rdev = statbuf->st_rdev;
73  arg1->st_size = statbuf->st_size;
74  arg1->st_atime = statbuf->st_atime;
75  arg1->st_mtime = statbuf->st_mtime;
76  arg1->st_ctime = statbuf->st_ctime;
77}
78
79void MakeDummyStatbuf(struct stat* statbuf) {
80  memset(&statbuf[0], 0, sizeof(struct stat));
81  statbuf->st_dev = 1;
82  statbuf->st_ino = 2;
83  statbuf->st_mode = 3;
84  statbuf->st_nlink = 4;
85  statbuf->st_uid = 5;
86  statbuf->st_gid = 6;
87  statbuf->st_rdev = 7;
88  statbuf->st_size = 8;
89  statbuf->st_atime = 9;
90  statbuf->st_mtime = 10;
91  statbuf->st_ctime = 11;
92}
93
94const int kDummyInt = 0xdedbeef;
95const int kDummyInt2 = 0xcabba6e;
96const int kDummyInt3 = 0xf00ba4;
97const int kDummyInt4 = 0xabacdba;
98const size_t kDummySizeT = 0x60067e;
99const char* kDummyConstChar = "foobar";
100const char* kDummyConstChar2 = "g00gl3";
101const char* kDummyConstChar3 = "fr00gl3";
102const void* kDummyVoidPtr = "blahblah";
103const uid_t kDummyUid = 1001;
104const gid_t kDummyGid = 1002;
105
106class KernelWrapTest : public ::testing::Test {
107 public:
108  KernelWrapTest() {}
109
110  virtual void SetUp() {
111    // Initializing the KernelProxy opens stdin/stdout/stderr.
112    EXPECT_CALL(mock, open(_, _))
113        .WillOnce(Return(0))
114        .WillOnce(Return(1))
115        .WillOnce(Return(2));
116    // And will call mount / and /dev.
117    EXPECT_CALL(mock, mount(_, _, _, _, _))
118        .WillOnce(Return(0))
119        .WillOnce(Return(0));
120
121    ki_init(&mock);
122  }
123
124  virtual void TearDown() { ki_uninit(); }
125
126  MockKernelProxy mock;
127};
128
129}  // namespace
130
131TEST_F(KernelWrapTest, access) {
132  EXPECT_CALL(mock, access(kDummyConstChar, kDummyInt)) .WillOnce(Return(-1));
133  EXPECT_EQ(-1, access(kDummyConstChar, kDummyInt));
134
135  EXPECT_CALL(mock, access(kDummyConstChar, kDummyInt)) .WillOnce(Return(0));
136  EXPECT_EQ(0, access(kDummyConstChar, kDummyInt));
137}
138
139TEST_F(KernelWrapTest, chdir) {
140  EXPECT_CALL(mock, chdir(kDummyConstChar)).WillOnce(Return(-1));
141  EXPECT_EQ(-1, chdir(kDummyConstChar));
142
143  EXPECT_CALL(mock, chdir(kDummyConstChar)).WillOnce(Return(0));
144  EXPECT_EQ(0, chdir(kDummyConstChar));
145}
146
147TEST_F(KernelWrapTest, chmod) {
148  EXPECT_CALL(mock, chmod(kDummyConstChar, kDummyInt))
149      .WillOnce(Return(kDummyInt2));
150  EXPECT_EQ(kDummyInt2, chmod(kDummyConstChar, kDummyInt));
151}
152
153TEST_F(KernelWrapTest, chown) {
154  EXPECT_CALL(mock, chown(kDummyConstChar, kDummyUid, kDummyGid))
155      .WillOnce(Return(kDummyInt));
156  EXPECT_EQ(kDummyInt, chown(kDummyConstChar, kDummyUid, kDummyGid));
157}
158
159TEST_F(KernelWrapTest, close) {
160  // The way we wrap close does not support returning arbitrary values, so we
161  // test 0 and -1.
162  EXPECT_CALL(mock, close(kDummyInt))
163      .WillOnce(Return(0))
164      .WillOnce(Return(-1));
165
166  EXPECT_EQ(0, close(kDummyInt));
167  EXPECT_EQ(-1, close(kDummyInt));
168}
169
170TEST_F(KernelWrapTest, dup) {
171  EXPECT_CALL(mock, dup(kDummyInt)).WillOnce(Return(kDummyInt2));
172  EXPECT_EQ(kDummyInt2, dup(kDummyInt));
173}
174
175TEST_F(KernelWrapTest, dup2) {
176  // The way we wrap dup2 does not support returning aribtrary values, only -1
177  // or the value of the new fd.
178  EXPECT_CALL(mock, dup2(kDummyInt, kDummyInt2))
179      .WillOnce(Return(kDummyInt2))
180      .WillOnce(Return(-1));
181  EXPECT_EQ(kDummyInt2, dup2(kDummyInt, kDummyInt2));
182  EXPECT_EQ(-1, dup2(kDummyInt, kDummyInt2));
183}
184
185TEST_F(KernelWrapTest, fchdir) {
186  EXPECT_CALL(mock, fchdir(kDummyInt))
187      .WillOnce(Return(-1));
188  EXPECT_EQ(-1, fchdir(kDummyInt));
189}
190
191TEST_F(KernelWrapTest, fchmod) {
192  EXPECT_CALL(mock, fchmod(kDummyInt, kDummyInt2)) .WillOnce(Return(-1));
193  EXPECT_EQ(-1, fchmod(kDummyInt, kDummyInt2));
194
195  EXPECT_CALL(mock, fchmod(kDummyInt, kDummyInt2)) .WillOnce(Return(0));
196  EXPECT_EQ(0, fchmod(kDummyInt, kDummyInt2));
197}
198
199TEST_F(KernelWrapTest, fchown) {
200  EXPECT_CALL(mock, fchown(kDummyInt, kDummyUid, kDummyGid))
201      .WillOnce(Return(kDummyInt));
202  EXPECT_EQ(kDummyInt, fchown(kDummyInt, kDummyUid, kDummyGid));
203}
204
205TEST_F(KernelWrapTest, fcntl) {
206  char buffer[] = "fcntl";
207  EXPECT_CALL(mock, fcntl(kDummyInt, kDummyInt2, _))
208      .WillOnce(Return(kDummyInt3));
209  EXPECT_EQ(kDummyInt3, fcntl(kDummyInt, kDummyInt2, buffer));
210}
211
212TEST_F(KernelWrapTest, fdatasync) {
213  EXPECT_CALL(mock, fdatasync(kDummyInt)).WillOnce(Return(-1));
214  EXPECT_EQ(-1, fdatasync(kDummyInt));
215
216  EXPECT_CALL(mock, fdatasync(kDummyInt)).WillOnce(Return(0));
217  EXPECT_EQ(0, fdatasync(kDummyInt));
218}
219
220TEST_F(KernelWrapTest, fstat) {
221  // The way we wrap fstat does not support returning aribtrary values, only 0
222  // or -1.
223  struct stat in_statbuf;
224  MakeDummyStatbuf(&in_statbuf);
225  EXPECT_CALL(mock, fstat(kDummyInt, _))
226      .WillOnce(DoAll(SetStat(&in_statbuf), Return(0)))
227      .WillOnce(Return(-1));
228  struct stat out_statbuf;
229  EXPECT_EQ(0, fstat(kDummyInt, &out_statbuf));
230  EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf));
231  EXPECT_EQ(-1, fstat(kDummyInt, &out_statbuf));
232}
233
234TEST_F(KernelWrapTest, ftruncate) {
235  EXPECT_CALL(mock, ftruncate(kDummyInt, kDummyInt2))
236      .WillOnce(Return(kDummyInt3));
237  EXPECT_EQ(kDummyInt3, ftruncate(kDummyInt, kDummyInt2));
238}
239
240TEST_F(KernelWrapTest, fsync) {
241  EXPECT_CALL(mock, fsync(kDummyInt)).WillOnce(Return(-1));
242  EXPECT_EQ(-1, fsync(kDummyInt));
243}
244
245TEST_F(KernelWrapTest, getcwd) {
246  char result[] = "getcwd_result";
247  char buffer[] = "getcwd";
248  EXPECT_CALL(mock, getcwd(buffer, kDummySizeT)).WillOnce(Return(result));
249  EXPECT_EQ(result, getcwd(buffer, kDummySizeT));
250}
251
252TEST_F(KernelWrapTest, getdents) {
253#ifndef __GLIBC__
254  // TODO(sbc): Find a way to test the getdents wrapper under glibc.
255  // It looks like the only way to exercise it is to call readdir(2).
256  // There is an internal glibc function __getdents that will call the
257  // IRT but that cannot be accessed from here as glibc does not export it.
258  int dummy_val;
259  void* void_ptr = &dummy_val;
260  EXPECT_CALL(mock, getdents(kDummyInt, void_ptr, kDummyInt2))
261      .WillOnce(Return(kDummyInt2));
262  EXPECT_EQ(kDummyInt2, getdents(kDummyInt, void_ptr, kDummyInt2));
263#endif
264}
265
266// gcc gives error: getwd is deprecated.
267#if defined(__GNUC__)
268#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
269#endif
270TEST_F(KernelWrapTest, getwd) {
271  char result[] = "getwd_result";
272  char buffer[] = "getwd";
273  EXPECT_CALL(mock, getwd(buffer)).WillOnce(Return(result));
274  EXPECT_EQ(result, getwd(buffer));
275}
276#if defined(__GNUC__)
277#pragma GCC diagnostic warning "-Wdeprecated-declarations"
278#endif
279
280TEST_F(KernelWrapTest, ioctl) {
281  char buffer[] = "ioctl";
282  EXPECT_CALL(mock, ioctl(kDummyInt, kDummyInt2, _))
283      .WillOnce(Return(kDummyInt3));
284  EXPECT_EQ(kDummyInt3, ioctl(kDummyInt, kDummyInt2, buffer));
285}
286
287TEST_F(KernelWrapTest, isatty) {
288  EXPECT_CALL(mock, isatty(kDummyInt)).WillOnce(Return(kDummyInt2));
289  EXPECT_EQ(kDummyInt2, isatty(kDummyInt));
290}
291
292TEST_F(KernelWrapTest, kill) {
293  EXPECT_CALL(mock, kill(kDummyInt, kDummyInt2)).WillOnce(Return(kDummyInt3));
294  EXPECT_EQ(kDummyInt3, kill(kDummyInt, kDummyInt2));
295}
296
297TEST_F(KernelWrapTest, lchown) {
298  EXPECT_CALL(mock, lchown(kDummyConstChar, kDummyUid, kDummyGid))
299      .WillOnce(Return(kDummyInt));
300  EXPECT_EQ(kDummyInt, lchown(kDummyConstChar, kDummyUid, kDummyGid));
301}
302
303TEST_F(KernelWrapTest, link) {
304  EXPECT_CALL(mock, link(kDummyConstChar, kDummyConstChar2))
305      .WillOnce(Return(kDummyInt));
306  EXPECT_EQ(kDummyInt, link(kDummyConstChar, kDummyConstChar2));
307}
308
309TEST_F(KernelWrapTest, lseek) {
310  EXPECT_CALL(mock, lseek(kDummyInt, kDummyInt2, kDummyInt3))
311      .WillOnce(Return(kDummyInt4));
312  EXPECT_EQ(kDummyInt4, lseek(kDummyInt, kDummyInt2, kDummyInt3));
313}
314
315TEST_F(KernelWrapTest, mkdir) {
316#if defined(WIN32)
317  EXPECT_CALL(mock, mkdir(kDummyConstChar, 0777)).WillOnce(Return(kDummyInt2));
318  EXPECT_EQ(kDummyInt2, mkdir(kDummyConstChar));
319#else
320  EXPECT_CALL(mock, mkdir(kDummyConstChar, kDummyInt))
321      .WillOnce(Return(kDummyInt2));
322  EXPECT_EQ(kDummyInt2, mkdir(kDummyConstChar, kDummyInt));
323#endif
324}
325
326TEST_F(KernelWrapTest, mmap) {
327  // We only wrap mmap if |flags| has the MAP_ANONYMOUS bit unset.
328  int flags = kDummyInt2 & ~MAP_ANONYMOUS;
329
330  const size_t kDummySizeT2 = 0xbadf00d;
331  int dummy1 = 123;
332  int dummy2 = 456;
333  void* kDummyVoidPtr1 = &dummy1;
334  void* kDummyVoidPtr2 = &dummy2;
335  EXPECT_CALL(mock,
336              mmap(kDummyVoidPtr1,
337                   kDummySizeT,
338                   kDummyInt,
339                   flags,
340                   kDummyInt3,
341                   kDummySizeT2)).WillOnce(Return(kDummyVoidPtr2));
342  EXPECT_EQ(kDummyVoidPtr2,
343            mmap(kDummyVoidPtr1,
344                 kDummySizeT,
345                 kDummyInt,
346                 flags,
347                 kDummyInt3,
348                 kDummySizeT2));
349}
350
351TEST_F(KernelWrapTest, mount) {
352  EXPECT_CALL(mock,
353              mount(kDummyConstChar,
354                    kDummyConstChar2,
355                    kDummyConstChar3,
356                    kDummyInt,
357                    kDummyVoidPtr)).WillOnce(Return(kDummyInt2));
358  EXPECT_EQ(kDummyInt2,
359            mount(kDummyConstChar,
360                  kDummyConstChar2,
361                  kDummyConstChar3,
362                  kDummyInt,
363                  kDummyVoidPtr));
364}
365
366TEST_F(KernelWrapTest, munmap) {
367  // The way we wrap munmap, calls the "real" mmap as well as the intercepted
368  // one. The result returned is from the "real" mmap.
369  int dummy1 = 123;
370  void* kDummyVoidPtr = &dummy1;
371  size_t kDummySizeT = sizeof(kDummyVoidPtr);
372  EXPECT_CALL(mock, munmap(kDummyVoidPtr, kDummySizeT));
373  munmap(kDummyVoidPtr, kDummySizeT);
374}
375
376
377TEST_F(KernelWrapTest, open) {
378  EXPECT_CALL(mock, open(kDummyConstChar, kDummyInt))
379      .WillOnce(Return(kDummyInt2));
380  EXPECT_EQ(kDummyInt2, open(kDummyConstChar, kDummyInt));
381
382  EXPECT_CALL(mock, open(kDummyConstChar, kDummyInt))
383      .WillOnce(Return(kDummyInt2));
384  EXPECT_EQ(kDummyInt2, open(kDummyConstChar, kDummyInt));
385}
386
387TEST_F(KernelWrapTest, pipe) {
388  int fds[] = {1, 2};
389  EXPECT_CALL(mock, pipe(fds)).WillOnce(Return(kDummyInt));
390  EXPECT_EQ(kDummyInt, pipe(fds));
391}
392
393TEST_F(KernelWrapTest, read) {
394  int dummy_value;
395  void* dummy_void_ptr = &dummy_value;
396  EXPECT_CALL(mock, read(kDummyInt, dummy_void_ptr, kDummyInt2))
397      .WillOnce(Return(kDummyInt3));
398  EXPECT_EQ(kDummyInt3, read(kDummyInt, dummy_void_ptr, kDummyInt2));
399}
400
401TEST_F(KernelWrapTest, readlink) {
402  char buf[10];
403
404  EXPECT_CALL(mock, readlink(kDummyConstChar, buf, 10))
405      .WillOnce(Return(-1));
406  EXPECT_EQ(-1, readlink(kDummyConstChar, buf, 10));
407
408  EXPECT_CALL(mock, readlink(kDummyConstChar, buf, 10))
409      .WillOnce(Return(kDummyInt));
410  EXPECT_EQ(kDummyInt, readlink(kDummyConstChar, buf, 10));
411}
412
413#ifdef __GLIBC__
414// Under newlib there is no remove syscall.  Instead it is implemented
415// in terms of unlink()/rmdir().
416TEST_F(KernelWrapTest, remove) {
417  EXPECT_CALL(mock, remove(kDummyConstChar)).WillOnce(Return(-1));
418  EXPECT_EQ(-1, remove(kDummyConstChar));
419}
420#endif
421
422TEST_F(KernelWrapTest, rename) {
423  EXPECT_CALL(mock, rename(kDummyConstChar, kDummyConstChar2))
424      .WillOnce(Return(-1));
425  EXPECT_EQ(-1, rename(kDummyConstChar, kDummyConstChar2));
426
427  EXPECT_CALL(mock, rename(kDummyConstChar, kDummyConstChar2))
428      .WillOnce(Return(0));
429  EXPECT_EQ(0, rename(kDummyConstChar, kDummyConstChar2));
430}
431
432TEST_F(KernelWrapTest, rmdir) {
433  EXPECT_CALL(mock, rmdir(kDummyConstChar)).WillOnce(Return(kDummyInt));
434  EXPECT_EQ(kDummyInt, rmdir(kDummyConstChar));
435}
436
437static void new_handler(int) {}
438
439TEST_F(KernelWrapTest, sigaction) {
440  struct sigaction action;
441  struct sigaction oaction;
442  EXPECT_CALL(mock, sigaction(kDummyInt, &action, &oaction))
443      .WillOnce(Return(0));
444  EXPECT_EQ(0, sigaction(kDummyInt, &action, &oaction));
445}
446
447TEST_F(KernelWrapTest, sigset) {
448  EXPECT_CALL(mock, sigaction(kDummyInt, _, _))
449      .WillOnce(Return(0));
450  EXPECT_EQ(NULL, sigset(kDummyInt, new_handler));
451}
452
453TEST_F(KernelWrapTest, signal) {
454  // KernelIntercept forwards calls to signal to KernelProxy::sigset.
455  EXPECT_CALL(mock, sigaction(kDummyInt, _, _))
456      .WillOnce(Return(0));
457  EXPECT_EQ(NULL, signal(kDummyInt, new_handler));
458}
459
460TEST_F(KernelWrapTest, stat) {
461  // The way we wrap stat does not support returning aribtrary values, only 0
462  // or -1.
463  struct stat in_statbuf;
464  MakeDummyStatbuf(&in_statbuf);
465  EXPECT_CALL(mock, stat(StrEq(kDummyConstChar), _))
466      .WillOnce(DoAll(SetStat(&in_statbuf), Return(0)))
467      .WillOnce(Return(-1));
468  struct stat out_statbuf;
469  EXPECT_EQ(0, stat(kDummyConstChar, &out_statbuf));
470  EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf));
471  EXPECT_EQ(-1, stat(kDummyConstChar, &out_statbuf));
472}
473
474TEST_F(KernelWrapTest, symlink) {
475  EXPECT_CALL(mock, symlink(kDummyConstChar, kDummyConstChar2))
476      .WillOnce(Return(kDummyInt));
477  EXPECT_EQ(kDummyInt, symlink(kDummyConstChar, kDummyConstChar2));
478}
479
480TEST_F(KernelWrapTest, tcflush) {
481  EXPECT_CALL(mock, tcflush(kDummyInt, kDummyInt2))
482      .WillOnce(Return(kDummyInt3));
483  EXPECT_EQ(kDummyInt3, tcflush(kDummyInt, kDummyInt2));
484}
485
486TEST_F(KernelWrapTest, tcgetattr) {
487  struct termios term;
488  EXPECT_CALL(mock, tcgetattr(kDummyInt, &term)).WillOnce(Return(kDummyInt2));
489  EXPECT_EQ(kDummyInt2, tcgetattr(kDummyInt, &term));
490}
491
492TEST_F(KernelWrapTest, tcsetattr) {
493  struct termios term;
494  EXPECT_CALL(mock, tcsetattr(kDummyInt, kDummyInt2, &term))
495      .WillOnce(Return(kDummyInt3));
496  EXPECT_EQ(kDummyInt3, tcsetattr(kDummyInt, kDummyInt2, &term));
497}
498
499TEST_F(KernelWrapTest, umount) {
500  EXPECT_CALL(mock, umount(kDummyConstChar)).WillOnce(Return(kDummyInt));
501  EXPECT_EQ(kDummyInt, umount(kDummyConstChar));
502}
503
504TEST_F(KernelWrapTest, truncate) {
505  EXPECT_CALL(mock, truncate(kDummyConstChar, kDummyInt3)).WillOnce(Return(-1));
506  EXPECT_EQ(-1, truncate(kDummyConstChar, kDummyInt3));
507
508  EXPECT_CALL(mock, truncate(kDummyConstChar, kDummyInt3)).WillOnce(Return(0));
509  EXPECT_EQ(0, truncate(kDummyConstChar, kDummyInt3));
510}
511
512TEST_F(KernelWrapTest, lstat) {
513  struct stat buf;
514  EXPECT_CALL(mock, lstat(kDummyConstChar, &buf)).WillOnce(Return(-1));
515  EXPECT_EQ(-1, lstat(kDummyConstChar, &buf));
516
517  EXPECT_CALL(mock, lstat(kDummyConstChar, &buf)).WillOnce(Return(0));
518  EXPECT_EQ(0, lstat(kDummyConstChar, &buf));
519}
520
521TEST_F(KernelWrapTest, unlink) {
522  EXPECT_CALL(mock, unlink(kDummyConstChar)).WillOnce(Return(kDummyInt));
523  EXPECT_EQ(kDummyInt, unlink(kDummyConstChar));
524}
525
526TEST_F(KernelWrapTest, utime) {
527  const struct utimbuf* times = NULL;
528  EXPECT_CALL(mock, utime(kDummyConstChar, times)).WillOnce(Return(kDummyInt));
529  EXPECT_EQ(kDummyInt, utime(kDummyConstChar, times));
530}
531
532TEST_F(KernelWrapTest, utimes) {
533  struct timeval* times = NULL;
534  EXPECT_CALL(mock, utimes(kDummyConstChar, times)).WillOnce(Return(-1));
535  EXPECT_EQ(-1, utimes(kDummyConstChar, times));
536}
537
538TEST_F(KernelWrapTest, write) {
539  EXPECT_CALL(mock, write(kDummyInt, kDummyVoidPtr, kDummyInt2))
540      .WillOnce(Return(kDummyInt3));
541  EXPECT_EQ(kDummyInt3, write(kDummyInt, kDummyVoidPtr, kDummyInt2));
542}
543
544#ifdef PROVIDES_SOCKET_API
545TEST_F(KernelWrapTest, poll) {
546  struct pollfd fds;
547  EXPECT_CALL(mock, poll(&fds, kDummyInt, kDummyInt2))
548      .WillOnce(Return(kDummyInt3));
549  EXPECT_EQ(kDummyInt3, poll(&fds, kDummyInt, kDummyInt2));
550}
551
552TEST_F(KernelWrapTest, select) {
553  fd_set readfds;
554  fd_set writefds;
555  fd_set exceptfds;
556  EXPECT_CALL(mock, select(kDummyInt, &readfds, &writefds, &exceptfds, NULL))
557      .WillOnce(Return(kDummyInt2));
558  EXPECT_EQ(kDummyInt2,
559            select(kDummyInt, &readfds, &writefds, &exceptfds, NULL));
560}
561
562// Socket Functions
563TEST_F(KernelWrapTest, accept) {
564  struct sockaddr addr;
565  socklen_t len;
566  EXPECT_CALL(mock, accept(kDummyInt, &addr, &len))
567      .WillOnce(Return(kDummyInt2));
568  EXPECT_EQ(kDummyInt2, accept(kDummyInt, &addr, &len));
569}
570
571TEST_F(KernelWrapTest, bind) {
572  struct sockaddr addr;
573  EXPECT_CALL(mock, bind(kDummyInt, &addr, kDummyInt2))
574      .WillOnce(Return(kDummyInt2));
575  EXPECT_EQ(kDummyInt2, bind(kDummyInt, &addr, kDummyInt2));
576}
577
578TEST_F(KernelWrapTest, connect) {
579  struct sockaddr addr;
580  EXPECT_CALL(mock, connect(kDummyInt, &addr, kDummyInt2))
581      .WillOnce(Return(kDummyInt2));
582  EXPECT_EQ(kDummyInt2, connect(kDummyInt, &addr, kDummyInt2));
583}
584
585TEST_F(KernelWrapTest, gethostbyname) {
586  struct hostent result;
587  EXPECT_CALL(mock, gethostbyname(kDummyConstChar)).WillOnce(Return(&result));
588  EXPECT_EQ(&result, gethostbyname(kDummyConstChar));
589}
590
591TEST_F(KernelWrapTest, getpeername) {
592  struct sockaddr addr;
593  socklen_t len;
594  EXPECT_CALL(mock, getpeername(kDummyInt, &addr, &len))
595      .WillOnce(Return(kDummyInt2));
596  EXPECT_EQ(kDummyInt2, getpeername(kDummyInt, &addr, &len));
597}
598
599TEST_F(KernelWrapTest, getsockname) {
600  struct sockaddr addr;
601  socklen_t len;
602  EXPECT_CALL(mock, getsockname(kDummyInt, &addr, &len))
603      .WillOnce(Return(kDummyInt2));
604  EXPECT_EQ(kDummyInt2, getsockname(kDummyInt, &addr, &len));
605}
606
607TEST_F(KernelWrapTest, getsockopt) {
608  int dummy_val;
609  void* dummy_void_ptr = &dummy_val;
610  socklen_t len;
611  EXPECT_CALL(
612      mock, getsockopt(kDummyInt, kDummyInt2, kDummyInt3, dummy_void_ptr, &len))
613      .WillOnce(Return(kDummyInt4));
614  EXPECT_EQ(
615      kDummyInt4,
616      getsockopt(kDummyInt, kDummyInt2, kDummyInt3, dummy_void_ptr, &len));
617}
618
619TEST_F(KernelWrapTest, listen) {
620  EXPECT_CALL(mock, listen(kDummyInt, kDummyInt2)).WillOnce(Return(kDummyInt3));
621  EXPECT_EQ(kDummyInt3, listen(kDummyInt, kDummyInt2));
622}
623
624TEST_F(KernelWrapTest, recv) {
625  int dummy_val;
626  void* dummy_void_ptr = &dummy_val;
627  EXPECT_CALL(mock, recv(kDummyInt, dummy_void_ptr, kDummySizeT, kDummyInt2))
628      .WillOnce(Return(kDummyInt3));
629  EXPECT_EQ(kDummyInt3,
630            recv(kDummyInt, dummy_void_ptr, kDummySizeT, kDummyInt2));
631}
632
633TEST_F(KernelWrapTest, recvfrom) {
634  int dummy_val;
635  void* dummy_void_ptr = &dummy_val;
636  struct sockaddr addr;
637  socklen_t len;
638  EXPECT_CALL(
639      mock,
640      recvfrom(kDummyInt, dummy_void_ptr, kDummyInt2, kDummyInt3, &addr, &len))
641      .WillOnce(Return(kDummyInt4));
642  EXPECT_EQ(
643      kDummyInt4,
644      recvfrom(kDummyInt, dummy_void_ptr, kDummyInt2, kDummyInt3, &addr, &len));
645}
646
647TEST_F(KernelWrapTest, recvmsg) {
648  struct msghdr msg;
649  EXPECT_CALL(mock, recvmsg(kDummyInt, &msg, kDummyInt2))
650      .WillOnce(Return(kDummyInt3));
651  EXPECT_EQ(kDummyInt3, recvmsg(kDummyInt, &msg, kDummyInt2));
652}
653
654TEST_F(KernelWrapTest, send) {
655  EXPECT_CALL(mock, send(kDummyInt, kDummyVoidPtr, kDummySizeT, kDummyInt2))
656      .WillOnce(Return(kDummyInt3));
657  EXPECT_EQ(kDummyInt3,
658            send(kDummyInt, kDummyVoidPtr, kDummySizeT, kDummyInt2));
659}
660
661TEST_F(KernelWrapTest, sendto) {
662  const socklen_t kDummySockLen = 0x50cc5;
663  struct sockaddr addr;
664  EXPECT_CALL(mock,
665              sendto(kDummyInt,
666                     kDummyVoidPtr,
667                     kDummyInt2,
668                     kDummyInt3,
669                     &addr,
670                     kDummySockLen)).WillOnce(Return(kDummyInt4));
671  EXPECT_EQ(kDummyInt4,
672            sendto(kDummyInt,
673                   kDummyVoidPtr,
674                   kDummyInt2,
675                   kDummyInt3,
676                   &addr,
677                   kDummySockLen));
678}
679
680TEST_F(KernelWrapTest, sendmsg) {
681  struct msghdr msg;
682  EXPECT_CALL(mock, sendmsg(kDummyInt, &msg, kDummyInt2))
683      .WillOnce(Return(kDummyInt3));
684  EXPECT_EQ(kDummyInt3, sendmsg(kDummyInt, &msg, kDummyInt2));
685}
686
687TEST_F(KernelWrapTest, setsockopt) {
688  const socklen_t kDummySockLen = 0x50cc5;
689  EXPECT_CALL(
690      mock,
691      setsockopt(
692          kDummyInt, kDummyInt2, kDummyInt3, kDummyVoidPtr, kDummySockLen))
693      .WillOnce(Return(kDummyInt4));
694  EXPECT_EQ(
695      kDummyInt4,
696      setsockopt(
697          kDummyInt, kDummyInt2, kDummyInt3, kDummyVoidPtr, kDummySockLen));
698}
699
700TEST_F(KernelWrapTest, shutdown) {
701  EXPECT_CALL(mock, shutdown(kDummyInt, kDummyInt2))
702      .WillOnce(Return(kDummyInt3));
703  EXPECT_EQ(kDummyInt3, shutdown(kDummyInt, kDummyInt2));
704}
705
706TEST_F(KernelWrapTest, socket) {
707  EXPECT_CALL(mock, socket(kDummyInt, kDummyInt2, kDummyInt3))
708      .WillOnce(Return(kDummyInt4));
709  EXPECT_EQ(kDummyInt4, socket(kDummyInt, kDummyInt2, kDummyInt3));
710}
711
712TEST_F(KernelWrapTest, socketpair) {
713  int dummy_val;
714  EXPECT_CALL(mock, socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val))
715      .WillOnce(Return(kDummyInt4));
716  EXPECT_EQ(kDummyInt4,
717            socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val));
718}
719
720#endif  // PROVIDES_SOCKET_API
721
722#endif  // __linux__
723