kernel_wrap_test.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gtest/gtest.h"
9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "kernel_proxy_mock.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "nacl_io/kernel_intercept.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "nacl_io/kernel_wrap.h"
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "nacl_io/osmman.h"
13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "nacl_io/ossocket.h"
14bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "nacl_io/ostermios.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochusing namespace nacl_io;
17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using ::testing::DoAll;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::Return;
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::StrEq;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define COMPARE_FIELD(f)                                                     \
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (arg->f != statbuf->f) {                                                \
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    *result_listener << "mismatch of field \"" #f                            \
284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        "\". "                                               \
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        "expected: " << statbuf->f << " actual: " << arg->f; \
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return false;                                                            \
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P(IsEqualToStatbuf, statbuf, "") {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_dev);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_ino);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_mode);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_nlink);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_uid);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_gid);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_rdev);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_size);
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_atime);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_mtime);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_ctime);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef COMPARE_FIELD
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P(SetStat, statbuf) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(arg1, 0, sizeof(struct stat));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_dev = statbuf->st_dev;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_ino = statbuf->st_ino;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_mode = statbuf->st_mode;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_nlink = statbuf->st_nlink;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_uid = statbuf->st_uid;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_gid = statbuf->st_gid;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_rdev = statbuf->st_rdev;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_size = statbuf->st_size;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_atime = statbuf->st_atime;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_mtime = statbuf->st_mtime;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_ctime = statbuf->st_ctime;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MakeDummyStatbuf(struct stat* statbuf) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(&statbuf[0], 0, sizeof(struct stat));
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_dev = 1;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_ino = 2;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_mode = 3;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_nlink = 4;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_uid = 5;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_gid = 6;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_rdev = 7;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_size = 8;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_atime = 9;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_mtime = 10;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_ctime = 11;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const int kDummyInt = 0xdedbeef;
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const int kDummyInt2 = 0xcabba6e;
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const int kDummyInt3 = 0xf00ba4;
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const int kDummyInt4 = 0xabacdba;
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const size_t kDummySizeT = 0x60067e;
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char* kDummyConstChar = "foobar";
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char* kDummyConstChar2 = "g00gl3";
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char* kDummyConstChar3 = "fr00gl3";
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const void* kDummyVoidPtr = "blahblah";
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst uid_t kDummyUid = 1001;
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst gid_t kDummyGid = 1002;
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class KernelWrapTest : public ::testing::Test {
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  KernelWrapTest() {}
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SetUp() {
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Initializing the KernelProxy opens stdin/stdout/stderr.
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(mock, open(_, _))
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        .WillOnce(Return(0))
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        .WillOnce(Return(1))
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        .WillOnce(Return(2));
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // And will call mount / and /dev.
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_CALL(mock, mount(_, _, _, _, _))
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        .WillOnce(Return(0))
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        .WillOnce(Return(0));
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ki_init(&mock);
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void TearDown() { ki_uninit(); }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  KernelProxyMock mock;
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, access) {
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, access(kDummyConstChar, kDummyInt))
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, access(kDummyConstChar, kDummyInt));
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, chdir) {
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, chdir(kDummyConstChar)).WillOnce(Return(kDummyInt));
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, chdir(kDummyConstChar));
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, chmod) {
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, chmod(kDummyConstChar, kDummyInt))
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, chmod(kDummyConstChar, kDummyInt));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(KernelWrapTest, chown) {
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, chown(kDummyConstChar, kDummyUid, kDummyGid))
1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt));
1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, chown(kDummyConstChar, kDummyUid, kDummyGid));
138eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, close) {
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The way we wrap close does not support returning arbitrary values, so we
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // test 0 and -1.
1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, close(kDummyInt))
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(0))
1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(-1));
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0, close(kDummyInt));
1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(-1, close(kDummyInt));
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, dup) {
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, dup(kDummyInt)).WillOnce(Return(kDummyInt2));
1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, dup(kDummyInt));
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, dup2) {
1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The way we wrap dup2 does not support returning aribtrary values, only -1
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // or the value of the new fd.
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, dup2(kDummyInt, kDummyInt2))
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2))
1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(-1));
1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, dup2(kDummyInt, kDummyInt2));
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(-1, dup2(kDummyInt, kDummyInt2));
1644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, fchmod) {
1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, fchmod(kDummyInt, kDummyInt2))
1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, fchmod(kDummyInt, kDummyInt2));
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(KernelWrapTest, fchown) {
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, fchown(kDummyInt, kDummyUid, kDummyGid))
1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt));
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, fchown(kDummyInt, kDummyUid, kDummyGid));
176eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
17868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(KernelWrapTest, fcntl) {
17968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  char buffer[] = "fcntl";
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, fcntl(kDummyInt, kDummyInt2, _))
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, fcntl(kDummyInt, kDummyInt2, buffer));
18368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, fstat) {
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The way we wrap fstat does not support returning aribtrary values, only 0
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // or -1.
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct stat in_statbuf;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MakeDummyStatbuf(&in_statbuf);
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, fstat(kDummyInt, _))
1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(DoAll(SetStat(&in_statbuf), Return(0)))
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(-1));
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct stat out_statbuf;
1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0, fstat(kDummyInt, &out_statbuf));
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf));
1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(-1, fstat(kDummyInt, &out_statbuf));
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(KernelWrapTest, ftruncate) {
2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, ftruncate(kDummyInt, kDummyInt2))
2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, ftruncate(kDummyInt, kDummyInt2));
20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, fsync) {
2064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, fsync(kDummyInt)).WillOnce(Return(kDummyInt2));
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, fsync(kDummyInt));
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, getcwd) {
2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  char result[] = "getcwd_result";
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buffer[] = "getcwd";
2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, getcwd(buffer, kDummySizeT)).WillOnce(Return(result));
2144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(result, getcwd(buffer, kDummySizeT));
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, getdents) {
2183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#ifndef __GLIBC__
2193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // TODO(sbc): Find a way to test the getdents wrapper under glibc.
2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // It looks like the only way to exercise it is to call readdir(2).
2213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // There is an internal glibc function __getdents that will call the
2223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // IRT but that cannot be accessed from here as glibc does not export it.
2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_val;
2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* void_ptr = &dummy_val;
2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, getdents(kDummyInt, void_ptr, kDummyInt2))
2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, getdents(kDummyInt, void_ptr, kDummyInt2));
2283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// gcc gives error: getwd is deprecated.
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__GNUC__)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, getwd) {
2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  char result[] = "getwd_result";
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buffer[] = "getwd";
2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, getwd(buffer)).WillOnce(Return(result));
2394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(result, getwd(buffer));
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__GNUC__)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma GCC diagnostic warning "-Wdeprecated-declarations"
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(KernelWrapTest, ioctl) {
246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  char buffer[] = "ioctl";
2474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, ioctl(kDummyInt, kDummyInt2, _))
2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, ioctl(kDummyInt, kDummyInt2, buffer));
250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, isatty) {
2534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, isatty(kDummyInt)).WillOnce(Return(kDummyInt2));
2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, isatty(kDummyInt));
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(KernelWrapTest, kill) {
2584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, kill(kDummyInt, kDummyInt2)).WillOnce(Return(kDummyInt3));
2594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, kill(kDummyInt, kDummyInt2));
2603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
262eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(KernelWrapTest, lchown) {
2634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, lchown(kDummyConstChar, kDummyUid, kDummyGid))
2644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt));
2654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, lchown(kDummyConstChar, kDummyUid, kDummyGid));
2664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, link) {
2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, link(kDummyConstChar, kDummyConstChar2))
2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt));
2714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, link(kDummyConstChar, kDummyConstChar2));
272eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
273eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, lseek) {
2754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, lseek(kDummyInt, kDummyInt2, kDummyInt3))
2764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt4));
2774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt4, lseek(kDummyInt, kDummyInt2, kDummyInt3));
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, mkdir) {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(WIN32)
2824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, mkdir(kDummyConstChar, 0777)).WillOnce(Return(kDummyInt2));
2834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, mkdir(kDummyConstChar));
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
2854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, mkdir(kDummyConstChar, kDummyInt))
2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, mkdir(kDummyConstChar, kDummyInt));
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, mmap) {
2924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // We only wrap mmap if |flags| has the MAP_ANONYMOUS bit unset.
2934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int flags = kDummyInt2 & ~MAP_ANONYMOUS;
2944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const size_t kDummySizeT2 = 0xbadf00d;
2964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy1 = 123;
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy2 = 456;
2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* kDummyVoidPtr1 = &dummy1;
2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* kDummyVoidPtr2 = &dummy2;
3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock,
3014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              mmap(kDummyVoidPtr1,
3024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummySizeT,
3034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummyInt,
3044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   flags,
3054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummyInt3,
3064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummySizeT2)).WillOnce(Return(kDummyVoidPtr2));
3074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyVoidPtr2,
3084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            mmap(kDummyVoidPtr1,
3094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 kDummySizeT,
3104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 kDummyInt,
3114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 flags,
3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 kDummyInt3,
3134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 kDummySizeT2));
3144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, mount) {
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock,
3184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              mount(kDummyConstChar,
3194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    kDummyConstChar2,
3204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    kDummyConstChar3,
3214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    kDummyInt,
3224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    kDummyVoidPtr)).WillOnce(Return(kDummyInt2));
3234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2,
3244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            mount(kDummyConstChar,
3254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  kDummyConstChar2,
3264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  kDummyConstChar3,
3274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  kDummyInt,
3284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  kDummyVoidPtr));
3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, munmap) {
3324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The way we wrap munmap, calls the "real" mmap as well as the intercepted
3334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // one. The result returned is from the "real" mmap.
3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy1 = 123;
3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* kDummyVoidPtr = &dummy1;
3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  size_t kDummySizeT = sizeof(kDummyVoidPtr);
3374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, munmap(kDummyVoidPtr, kDummySizeT));
3384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  munmap(kDummyVoidPtr, kDummySizeT);
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, open) {
3434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, open(kDummyConstChar, kDummyInt))
3444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
3454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, open(kDummyConstChar, kDummyInt));
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(KernelWrapTest, pipe) {
3494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int fds[] = {1, 2};
3504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, pipe(fds)).WillOnce(Return(kDummyInt));
3514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, pipe(fds));
35268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
35368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, read) {
3554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_value;
3564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* dummy_void_ptr = &dummy_value;
3574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, read(kDummyInt, dummy_void_ptr, kDummyInt2))
3584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
3594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, read(kDummyInt, dummy_void_ptr, kDummyInt2));
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
362d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#ifdef __GLIBC__
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, remove) {
3644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, remove(kDummyConstChar)).WillOnce(Return(kDummyInt));
3654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, remove(kDummyConstChar));
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
367d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, rmdir) {
3704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, rmdir(kDummyConstChar)).WillOnce(Return(kDummyInt));
3714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, rmdir(kDummyConstChar));
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static void new_handler(int) {}
3754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static void old_handler(int) {}
3763551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3773551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(KernelWrapTest, sigset) {
3784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, sigset(kDummyInt, new_handler))
3794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(old_handler));
3804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(&old_handler, sigset(kDummyInt, new_handler));
3813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
3823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(KernelWrapTest, signal) {
3844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // KernelIntercept forwards calls to signal to KernelProxy::sigset.
3854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, sigset(kDummyInt, new_handler))
3864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(old_handler));
3874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(&old_handler, signal(kDummyInt, new_handler));
3883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
3893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, stat) {
3914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The way we wrap stat does not support returning aribtrary values, only 0
3924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // or -1.
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct stat in_statbuf;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MakeDummyStatbuf(&in_statbuf);
3954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, stat(StrEq(kDummyConstChar), _))
3964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(DoAll(SetStat(&in_statbuf), Return(0)))
3974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(-1));
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct stat out_statbuf;
3994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0, stat(kDummyConstChar, &out_statbuf));
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf));
4014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(-1, stat(kDummyConstChar, &out_statbuf));
4024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
4034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, symlink) {
4054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, symlink(kDummyConstChar, kDummyConstChar2))
4064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt));
4074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, symlink(kDummyConstChar, kDummyConstChar2));
4084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
4094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, tcflush) {
4114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, tcflush(kDummyInt, kDummyInt2))
4124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
4134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, tcflush(kDummyInt, kDummyInt2));
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
416bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochTEST_F(KernelWrapTest, tcgetattr) {
417bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  struct termios term;
4184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, tcgetattr(kDummyInt, &term)).WillOnce(Return(kDummyInt2));
4194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, tcgetattr(kDummyInt, &term));
420bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
421bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
422bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochTEST_F(KernelWrapTest, tcsetattr) {
423bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  struct termios term;
4244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, tcsetattr(kDummyInt, kDummyInt2, &term))
4254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
4264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, tcsetattr(kDummyInt, kDummyInt2, &term));
427bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
428bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, umount) {
4304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, umount(kDummyConstChar)).WillOnce(Return(kDummyInt));
4314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, umount(kDummyConstChar));
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, unlink) {
4354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, unlink(kDummyConstChar)).WillOnce(Return(kDummyInt));
4364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, unlink(kDummyConstChar));
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(KernelWrapTest, utime) {
440ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const struct utimbuf* times = NULL;
4414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, utime(kDummyConstChar, times)).WillOnce(Return(kDummyInt));
4424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, utime(kDummyConstChar, times));
443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
444eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, write) {
4464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, write(kDummyInt, kDummyVoidPtr, kDummyInt2))
4474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
4484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, write(kDummyInt, kDummyVoidPtr, kDummyInt2));
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
450eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
451a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#ifdef PROVIDES_SOCKET_API
4523240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochTEST_F(KernelWrapTest, poll) {
4534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct pollfd fds;
4544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, poll(&fds, kDummyInt, kDummyInt2))
4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, poll(&fds, kDummyInt, kDummyInt2));
4573240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch}
458a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
4593240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochTEST_F(KernelWrapTest, select) {
4604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fd_set readfds;
4614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fd_set writefds;
4624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fd_set exceptfds;
4634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, select(kDummyInt, &readfds, &writefds, &exceptfds, NULL))
4644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
4654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2,
4664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            select(kDummyInt, &readfds, &writefds, &exceptfds, NULL));
4673240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch}
4683240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
4693240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch// Socket Functions
470a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, accept) {
4714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
4724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  socklen_t len;
4734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, accept(kDummyInt, &addr, &len))
4744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
4754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, accept(kDummyInt, &addr, &len));
476a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
477a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
478a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, bind) {
4794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
4804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, bind(kDummyInt, &addr, kDummyInt2))
4814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
4824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, bind(kDummyInt, &addr, kDummyInt2));
483a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
484a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
485a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, connect) {
4864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
4874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, connect(kDummyInt, &addr, kDummyInt2))
4884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
4894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, connect(kDummyInt, &addr, kDummyInt2));
490bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
491bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
492bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochTEST_F(KernelWrapTest, gethostbyname) {
4934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct hostent result;
4944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, gethostbyname(kDummyConstChar)).WillOnce(Return(&result));
4954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(&result, gethostbyname(kDummyConstChar));
496a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
497a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
498a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, getpeername) {
4994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
5004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  socklen_t len;
5014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, getpeername(kDummyInt, &addr, &len))
5024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
5034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, getpeername(kDummyInt, &addr, &len));
504a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
505a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
506a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, getsockname) {
5074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
5084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  socklen_t len;
5094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, getsockname(kDummyInt, &addr, &len))
5104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
5114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, getsockname(kDummyInt, &addr, &len));
512a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
513a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
514a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, getsockopt) {
5154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_val;
5164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* dummy_void_ptr = &dummy_val;
5174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  socklen_t len;
5184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(
5194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      mock, getsockopt(kDummyInt, kDummyInt2, kDummyInt3, dummy_void_ptr, &len))
5204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt4));
5214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(
5224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      kDummyInt4,
5234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      getsockopt(kDummyInt, kDummyInt2, kDummyInt3, dummy_void_ptr, &len));
524bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
525bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
526a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, listen) {
5274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, listen(kDummyInt, kDummyInt2)).WillOnce(Return(kDummyInt3));
5284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, listen(kDummyInt, kDummyInt2));
529a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
530a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
531a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, recv) {
5324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_val;
5334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* dummy_void_ptr = &dummy_val;
5344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, recv(kDummyInt, dummy_void_ptr, kDummySizeT, kDummyInt2))
5354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
5364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3,
5374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            recv(kDummyInt, dummy_void_ptr, kDummySizeT, kDummyInt2));
538a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
539a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
540a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, recvfrom) {
5414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_val;
5424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* dummy_void_ptr = &dummy_val;
5434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
5444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  socklen_t len;
5454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(
5464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      mock,
5474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      recvfrom(kDummyInt, dummy_void_ptr, kDummyInt2, kDummyInt3, &addr, &len))
5484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt4));
5494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(
5504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      kDummyInt4,
5514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      recvfrom(kDummyInt, dummy_void_ptr, kDummyInt2, kDummyInt3, &addr, &len));
552a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
553a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
554a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, recvmsg) {
5554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct msghdr msg;
5564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, recvmsg(kDummyInt, &msg, kDummyInt2))
5574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
5584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, recvmsg(kDummyInt, &msg, kDummyInt2));
559a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
560a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
561a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, send) {
5624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, send(kDummyInt, kDummyVoidPtr, kDummySizeT, kDummyInt2))
5634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
5644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3,
5654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            send(kDummyInt, kDummyVoidPtr, kDummySizeT, kDummyInt2));
566a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
567a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
568a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, sendto) {
5694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const socklen_t kDummySockLen = 0x50cc5;
5704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
5714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock,
5724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              sendto(kDummyInt,
5734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     kDummyVoidPtr,
5744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     kDummyInt2,
5754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     kDummyInt3,
5764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     &addr,
5774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     kDummySockLen)).WillOnce(Return(kDummyInt4));
5784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt4,
5794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            sendto(kDummyInt,
5804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummyVoidPtr,
5814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummyInt2,
5824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummyInt3,
5834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   &addr,
5844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummySockLen));
585a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
586a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
587a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, sendmsg) {
5884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct msghdr msg;
5894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, sendmsg(kDummyInt, &msg, kDummyInt2))
5904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
5914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, sendmsg(kDummyInt, &msg, kDummyInt2));
592a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
593a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
594a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, setsockopt) {
5954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const socklen_t kDummySockLen = 0x50cc5;
5964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(
5974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      mock,
5984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      setsockopt(
5994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          kDummyInt, kDummyInt2, kDummyInt3, kDummyVoidPtr, kDummySockLen))
6004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt4));
6014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(
6024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      kDummyInt4,
6034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      setsockopt(
6044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          kDummyInt, kDummyInt2, kDummyInt3, kDummyVoidPtr, kDummySockLen));
605a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
606a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
607a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, shutdown) {
6084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, shutdown(kDummyInt, kDummyInt2))
6094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
6104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, shutdown(kDummyInt, kDummyInt2));
611a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
612a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
613a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, socket) {
6144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, socket(kDummyInt, kDummyInt2, kDummyInt3))
6154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt4));
6164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt4, socket(kDummyInt, kDummyInt2, kDummyInt3));
617a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
618a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
619a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, socketpair) {
6204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_val;
6214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val))
6224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt4));
6234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt4,
6244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val));
625a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
626a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
6274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // PROVIDES_SOCKET_API
628