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)
5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// The linux host build of nacl_io can't do wrapping of syscalls so all
6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// these tests must be disabled.
7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if !defined(__linux__)
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
98bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include <unistd.h>
108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gtest/gtest.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "mock_kernel_proxy.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "nacl_io/kernel_intercept.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "nacl_io/kernel_wrap.h"
18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "nacl_io/kernel_wrap_real.h"
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "nacl_io/osmman.h"
20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "nacl_io/ossocket.h"
21bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "nacl_io/ostermios.h"
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "nacl_io/ostime.h"
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ppapi_simple/ps.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(__native_client__) && !defined(__GLIBC__)
268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)extern "C" {
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// TODO(sbc): remove once this gets added to the newlib toolchain headers.
288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)int fchdir(int fd);
298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
32ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochusing namespace nacl_io;
33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::testing::AnyNumber;
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using ::testing::DoAll;
37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::testing::Invoke;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::Return;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::StrEq;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define COMPARE_FIELD(actual, expected, f)                                 \
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (actual != expected) {                                                \
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    *result_listener << "mismatch of field \"" f                           \
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        "\". "                                             \
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                        "expected: " << expected << " actual: " << actual; \
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return false;                                                          \
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#define COMPARE_FIELD_SIMPLE(f) COMPARE_FIELD(arg->f, other->f, #f)
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciMATCHER_P(IsEqualToStatbuf, other, "") {
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  COMPARE_FIELD_SIMPLE(st_dev);
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  COMPARE_FIELD_SIMPLE(st_ino);
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  COMPARE_FIELD_SIMPLE(st_mode);
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  COMPARE_FIELD_SIMPLE(st_nlink);
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  COMPARE_FIELD_SIMPLE(st_uid);
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  COMPARE_FIELD_SIMPLE(st_gid);
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  COMPARE_FIELD_SIMPLE(st_rdev);
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  COMPARE_FIELD_SIMPLE(st_size);
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  COMPARE_FIELD_SIMPLE(st_atime);
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  COMPARE_FIELD_SIMPLE(st_mtime);
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  COMPARE_FIELD_SIMPLE(st_ctime);
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return true;
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciMATCHER_P(IsEqualToUtimbuf, other, "") {
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  COMPARE_FIELD(arg[0].tv_sec, other->actime, "actime");
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  COMPARE_FIELD(arg[1].tv_sec, other->modtime, "modtime");
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return true;
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciMATCHER_P(IsEqualToTimeval, other, "") {
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  COMPARE_FIELD(arg[0].tv_sec, other[0].tv_sec, "[0].tv_sec");
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  COMPARE_FIELD(arg[0].tv_nsec, other[0].tv_usec * 1000, "[0].tv_usec");
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  COMPARE_FIELD(arg[1].tv_sec, other[1].tv_sec, "[1].tv_sec");
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  COMPARE_FIELD(arg[1].tv_nsec, other[1].tv_usec * 1000, "[1].tv_usec");
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef COMPARE_FIELD
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#undef COMPARE_FIELD_SIMPLE
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ACTION_P(SetErrno, value) {
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  errno = value;
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)ACTION_P2(SetString, target, source) {
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  strcpy(target, source);
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P(SetStat, statbuf) {
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(arg1, 0, sizeof(struct stat));
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_dev = statbuf->st_dev;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_ino = statbuf->st_ino;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_mode = statbuf->st_mode;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_nlink = statbuf->st_nlink;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_uid = statbuf->st_uid;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_gid = statbuf->st_gid;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_rdev = statbuf->st_rdev;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_size = statbuf->st_size;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_atime = statbuf->st_atime;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_mtime = statbuf->st_mtime;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_ctime = statbuf->st_ctime;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MakeDummyStatbuf(struct stat* statbuf) {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(&statbuf[0], 0, sizeof(struct stat));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_dev = 1;
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_ino = 2;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_mode = 3;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_nlink = 4;
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_uid = 5;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_gid = 6;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_rdev = 7;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_size = 8;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_atime = 9;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_mtime = 10;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_ctime = 11;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst mode_t kDummyMode = 0xbeef;
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kDummyErrno = 0xfeeb;
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const int kDummyInt = 0xdedbeef;
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const int kDummyInt2 = 0xcabba6e;
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const int kDummyInt3 = 0xf00ba4;
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const int kDummyInt4 = 0xabacdba;
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const size_t kDummySizeT = 0x60067e;
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char* kDummyConstChar = "foobar";
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char* kDummyConstChar2 = "g00gl3";
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char* kDummyConstChar3 = "fr00gl3";
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const void* kDummyVoidPtr = "blahblah";
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst uid_t kDummyUid = 1001;
136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst gid_t kDummyGid = 1002;
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class KernelWrapTest : public ::testing::Test {
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  KernelWrapTest() {}
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SetUp() {
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Initialize the global errno value to a consistent value rather than
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // relying on its value from previous test runs.
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    errno = 0;
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Initializing the KernelProxy opens stdin/stdout/stderr.
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_CALL(mock, open(_, _, _))
1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        .WillOnce(Return(0))
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        .WillOnce(Return(1))
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        .WillOnce(Return(2));
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_EQ(0, ki_push_state_for_testing());
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_EQ(0, ki_init(&mock));
155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // We allow write to be called any number of times, and it forwards to
157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // _real_write. This prevents an infinite loop writing output if there is a
158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // failure.
159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ON_CALL(mock, write(_, _, _))
160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .WillByDefault(Invoke(this, &KernelWrapTest::DefaultWrite));
161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(mock, write(_, _, _)).Times(AnyNumber());
162a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
163a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
164a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void TearDown() {
165a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Uninitialize the kernel proxy so wrapped functions passthrough to their
166a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // unwrapped versions.
167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ki_uninit();
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MockKernelProxy mock;
171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private:
173010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ssize_t DefaultWrite(int fd, const void* buf, size_t count) {
174010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   assert(fd <= 2);
175010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   size_t nwrote;
176010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   int rtn = _real_write(fd, buf, count, &nwrote);
177010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   if (rtn != 0) {
178010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     errno = rtn;
179010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     return -1;
180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   }
181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   return nwrote;
182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, access) {
1888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, access(kDummyConstChar, kDummyInt)) .WillOnce(Return(0));
1898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(0, access(kDummyConstChar, kDummyInt));
190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(mock, access(kDummyConstChar, kDummyInt))
192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, access(kDummyConstChar, kDummyInt));
194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDummyErrno, errno);
195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, chdir) {
1998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, chdir(kDummyConstChar)).WillOnce(Return(0));
2008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(0, chdir(kDummyConstChar));
201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(mock, chdir(kDummyConstChar))
203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, chdir(kDummyConstChar));
205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, chmod) {
209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_CALL(mock, chmod(kDummyConstChar, kDummyMode))
21003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
21103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(-1, chmod(kDummyConstChar, kDummyMode));
21203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(KernelWrapTest, chown) {
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, chown(kDummyConstChar, kDummyUid, kDummyGid))
21703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
21803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(-1, chown(kDummyConstChar, kDummyUid, kDummyGid));
21903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
220eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, close) {
2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The way we wrap close does not support returning arbitrary values, so we
2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // test 0 and -1.
2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, close(kDummyInt))
226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0));
2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0, close(kDummyInt));
229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(mock, close(kDummyInt))
231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(-1, close(kDummyInt));
233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, dup) {
2374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, dup(kDummyInt)).WillOnce(Return(kDummyInt2));
2384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, dup(kDummyInt));
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, dup2) {
2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The way we wrap dup2 does not support returning aribtrary values, only -1
2434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // or the value of the new fd.
2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, dup2(kDummyInt, kDummyInt2))
2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2))
246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, dup2(kDummyInt, kDummyInt2));
2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(-1, dup2(kDummyInt, kDummyInt2));
250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(KernelWrapTest, fchdir) {
2548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, fchdir(kDummyInt))
255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(-1, fchdir(kDummyInt));
258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
2598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
2608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, fchmod) {
262c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_CALL(mock, fchmod(kDummyInt, kDummyMode))
263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
2658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
266c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0, fchmod(kDummyInt, kDummyMode));
267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, fchmod(kDummyInt, kDummyMode));
268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(KernelWrapTest, fchown) {
2724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, fchown(kDummyInt, kDummyUid, kDummyGid))
2734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt));
2744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, fchown(kDummyInt, kDummyUid, kDummyGid));
275eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
27768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(KernelWrapTest, fcntl) {
27868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  char buffer[] = "fcntl";
2794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, fcntl(kDummyInt, kDummyInt2, _))
2804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
2814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, fcntl(kDummyInt, kDummyInt2, buffer));
28268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
28368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(KernelWrapTest, fdatasync) {
285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(mock, fdatasync(kDummyInt)).WillOnce(Return(0))
286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
2878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(0, fdatasync(kDummyInt));
289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, fdatasync(kDummyInt));
290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
2918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
2928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, fstat) {
2944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The way we wrap fstat does not support returning aribtrary values, only 0
2954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // or -1.
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct stat in_statbuf;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MakeDummyStatbuf(&in_statbuf);
2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, fstat(kDummyInt, _))
2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(DoAll(SetStat(&in_statbuf), Return(0)))
300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct stat out_statbuf;
302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0, fstat(kDummyInt, &out_statbuf));
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf));
305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(-1, fstat(kDummyInt, &out_statbuf));
307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
31090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(KernelWrapTest, ftruncate) {
3114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, ftruncate(kDummyInt, kDummyInt2))
3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
3134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, ftruncate(kDummyInt, kDummyInt2));
31490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
31590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, fsync) {
317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(mock, fsync(kDummyInt))
318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
3198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(-1, fsync(kDummyInt));
320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(KernelWrapTest, futimes) {
3241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  struct timeval times[2] = {{123, 234}, {345, 456}};
3251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_CALL(mock, futimens(kDummyInt, IsEqualToTimeval(times)))
3261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
3271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(-1, futimes(kDummyInt, times));
3281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_EQ(kDummyErrno, errno);
3291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
3301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, getcwd) {
3325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  char buffer[PATH_MAX];
3335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  char result[PATH_MAX];
3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  memset(buffer, 0, PATH_MAX);
3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  strcpy(result, "getcwd_result");
3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_CALL(mock, getcwd(buffer, kDummySizeT))
3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)       .WillOnce(DoAll(SetString(buffer, result), Return(buffer)));
3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_STREQ(result, getcwd(buffer, kDummySizeT));
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, getdents) {
342c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if !defined( __GLIBC__) && !defined(__BIONIC__)
3433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // TODO(sbc): Find a way to test the getdents wrapper under glibc.
3444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // It looks like the only way to exercise it is to call readdir(2).
3453551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // There is an internal glibc function __getdents that will call the
3463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // IRT but that cannot be accessed from here as glibc does not export it.
3474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_val;
3484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* void_ptr = &dummy_val;
3494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, getdents(kDummyInt, void_ptr, kDummyInt2))
3504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
3514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, getdents(kDummyInt, void_ptr, kDummyInt2));
3523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// gcc gives error: getwd is deprecated.
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__GNUC__)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, getwd) {
3604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  char result[] = "getwd_result";
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buffer[] = "getwd";
3624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, getwd(buffer)).WillOnce(Return(result));
3634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(result, getwd(buffer));
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__GNUC__)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma GCC diagnostic warning "-Wdeprecated-declarations"
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
369eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(KernelWrapTest, ioctl) {
370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  char buffer[] = "ioctl";
3714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, ioctl(kDummyInt, kDummyInt2, _))
3724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
3734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, ioctl(kDummyInt, kDummyInt2, buffer));
374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
376c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if !defined(__BIONIC__)
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, isatty) {
3784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, isatty(kDummyInt)).WillOnce(Return(kDummyInt2));
3794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, isatty(kDummyInt));
380c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
381c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // This test verifies that the IRT interception wrapper for isatty
382c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // ignores the value of errno when isatty() returns 1.  We had a bug
383c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // where returning 1 from ki_isatty resulted in errno being returned
384c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // by the IRT interface.
385c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  errno = kDummyInt3;
386c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_CALL(mock, isatty(kDummyInt)).WillOnce(Return(1));
387c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(1, isatty(kDummyInt));
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
389c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(KernelWrapTest, kill) {
3924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, kill(kDummyInt, kDummyInt2)).WillOnce(Return(kDummyInt3));
3934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, kill(kDummyInt, kDummyInt2));
3943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
3953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
396eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(KernelWrapTest, lchown) {
3974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, lchown(kDummyConstChar, kDummyUid, kDummyGid))
3984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt));
3994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, lchown(kDummyConstChar, kDummyUid, kDummyGid));
4004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
4014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, link) {
4034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, link(kDummyConstChar, kDummyConstChar2))
40403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
40503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(-1, link(kDummyConstChar, kDummyConstChar2));
40603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
407eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
408eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, lseek) {
4104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, lseek(kDummyInt, kDummyInt2, kDummyInt3))
4114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt4));
4124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt4, lseek(kDummyInt, kDummyInt2, kDummyInt3));
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, mkdir) {
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(WIN32)
4174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, mkdir(kDummyConstChar, 0777)).WillOnce(Return(kDummyInt2));
4184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, mkdir(kDummyConstChar));
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
420c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_CALL(mock, mkdir(kDummyConstChar, kDummyMode))
4215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
4225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(-1, mkdir(kDummyConstChar, kDummyMode));
4235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, mmap) {
4284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // We only wrap mmap if |flags| has the MAP_ANONYMOUS bit unset.
4294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int flags = kDummyInt2 & ~MAP_ANONYMOUS;
4304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const size_t kDummySizeT2 = 0xbadf00d;
4324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy1 = 123;
4334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy2 = 456;
4344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* kDummyVoidPtr1 = &dummy1;
4354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* kDummyVoidPtr2 = &dummy2;
4364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock,
4374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              mmap(kDummyVoidPtr1,
4384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummySizeT,
4394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummyInt,
4404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   flags,
4414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummyInt3,
4424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummySizeT2)).WillOnce(Return(kDummyVoidPtr2));
4434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyVoidPtr2,
4444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            mmap(kDummyVoidPtr1,
4454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 kDummySizeT,
4464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 kDummyInt,
4474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 flags,
4484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 kDummyInt3,
4494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 kDummySizeT2));
4504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
4514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, mount) {
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock,
4544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              mount(kDummyConstChar,
4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    kDummyConstChar2,
4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    kDummyConstChar3,
4574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    kDummyInt,
4584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    kDummyVoidPtr)).WillOnce(Return(kDummyInt2));
4594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2,
4604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            mount(kDummyConstChar,
4614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  kDummyConstChar2,
4624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  kDummyConstChar3,
4634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  kDummyInt,
4644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  kDummyVoidPtr));
4654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
4664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, munmap) {
4684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The way we wrap munmap, calls the "real" mmap as well as the intercepted
4694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // one. The result returned is from the "real" mmap.
4704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy1 = 123;
4714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* kDummyVoidPtr = &dummy1;
4724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  size_t kDummySizeT = sizeof(kDummyVoidPtr);
4734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, munmap(kDummyVoidPtr, kDummySizeT));
4744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  munmap(kDummyVoidPtr, kDummySizeT);
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, open) {
478c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // We pass O_RDONLY because we do not want an error in flags translation
4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_CALL(mock, open(kDummyConstChar, 0, 0))
480cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(kDummyInt2))
4814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
4828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kDummyInt2, open(kDummyConstChar, 0, 0));
4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kDummyInt2, open(kDummyConstChar, 0, 0));
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(KernelWrapTest, pipe) {
4884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int fds[] = {1, 2};
4894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, pipe(fds)).WillOnce(Return(kDummyInt));
4904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, pipe(fds));
49168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
49268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, read) {
4944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_value;
4954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* dummy_void_ptr = &dummy_value;
4964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, read(kDummyInt, dummy_void_ptr, kDummyInt2))
4974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
4984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, read(kDummyInt, dummy_void_ptr, kDummyInt2));
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(KernelWrapTest, readlink) {
5028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  char buf[10];
5038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, readlink(kDummyConstChar, buf, 10))
505cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(kDummyInt))
506cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
5078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(kDummyInt, readlink(kDummyConstChar, buf, 10));
509cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, readlink(kDummyConstChar, buf, 10));
510cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
5118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
5128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
513d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#ifdef __GLIBC__
5148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Under newlib there is no remove syscall.  Instead it is implemented
5158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// in terms of unlink()/rmdir().
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, remove) {
5178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, remove(kDummyConstChar)).WillOnce(Return(-1));
5188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(-1, remove(kDummyConstChar));
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
520d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(KernelWrapTest, rename) {
5238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, rename(kDummyConstChar, kDummyConstChar2))
524cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
525cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
5268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(0, rename(kDummyConstChar, kDummyConstChar2));
528cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, rename(kDummyConstChar, kDummyConstChar2));
529cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
5308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
5318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, rmdir) {
5335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_CALL(mock, rmdir(kDummyConstChar))
5345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
5355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(-1, rmdir(kDummyConstChar));
5365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static void new_handler(int) {}
540f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
541f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(KernelWrapTest, sigaction) {
542f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  struct sigaction action;
543f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  struct sigaction oaction;
544f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(mock, sigaction(kDummyInt, &action, &oaction))
545f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      .WillOnce(Return(0));
546f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, sigaction(kDummyInt, &action, &oaction));
547f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
5483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(KernelWrapTest, sigset) {
550f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(mock, sigaction(kDummyInt, _, _))
551f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      .WillOnce(Return(0));
552f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(NULL, sigset(kDummyInt, new_handler));
5533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
5543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(KernelWrapTest, signal) {
5564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // KernelIntercept forwards calls to signal to KernelProxy::sigset.
557f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(mock, sigaction(kDummyInt, _, _))
558f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      .WillOnce(Return(0));
559f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(NULL, signal(kDummyInt, new_handler));
5603551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
5613551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, stat) {
5634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The way we wrap stat does not support returning aribtrary values, only 0
5644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // or -1.
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct stat in_statbuf;
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MakeDummyStatbuf(&in_statbuf);
5674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, stat(StrEq(kDummyConstChar), _))
5684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(DoAll(SetStat(&in_statbuf), Return(0)))
569cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct stat out_statbuf;
571cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0, stat(kDummyConstChar, &out_statbuf));
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf));
574cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(-1, stat(kDummyConstChar, &out_statbuf));
576cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
5774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
5784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, symlink) {
5804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, symlink(kDummyConstChar, kDummyConstChar2))
5814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt));
5824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, symlink(kDummyConstChar, kDummyConstChar2));
5834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
5844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
585c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#ifndef __BIONIC__
5864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, tcflush) {
5874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, tcflush(kDummyInt, kDummyInt2))
5884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
5894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, tcflush(kDummyInt, kDummyInt2));
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
592bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochTEST_F(KernelWrapTest, tcgetattr) {
593bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  struct termios term;
5944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, tcgetattr(kDummyInt, &term)).WillOnce(Return(kDummyInt2));
5954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, tcgetattr(kDummyInt, &term));
596bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
597bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
598bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochTEST_F(KernelWrapTest, tcsetattr) {
599bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  struct termios term;
6004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, tcsetattr(kDummyInt, kDummyInt2, &term))
6014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
6024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, tcsetattr(kDummyInt, kDummyInt2, &term));
603bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
604c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
605bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, umount) {
6074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, umount(kDummyConstChar)).WillOnce(Return(kDummyInt));
6084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, umount(kDummyConstChar));
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(KernelWrapTest, truncate) {
612cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(mock, truncate(kDummyConstChar, kDummyInt3))
613cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
614cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
6158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
6168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(0, truncate(kDummyConstChar, kDummyInt3));
617cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
618cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, truncate(kDummyConstChar, kDummyInt3));
6198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
6208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
6218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(KernelWrapTest, lstat) {
6225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  struct stat in_statbuf;
6235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  MakeDummyStatbuf(&in_statbuf);
6245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_CALL(mock, lstat(StrEq(kDummyConstChar), _))
6255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      .WillOnce(DoAll(SetStat(&in_statbuf), Return(0)))
626cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
6275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  struct stat out_statbuf;
628cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(0, lstat(kDummyConstChar, &out_statbuf));
6305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf));
631cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(-1, lstat(kDummyConstChar, &out_statbuf));
633cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
6348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
6358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, unlink) {
6375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_CALL(mock, unlink(kDummyConstChar))
6385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
6395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(-1, unlink(kDummyConstChar));
6405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
643eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(KernelWrapTest, utime) {
6441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const struct utimbuf times = {123, 456};
6451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_CALL(mock, utimens(kDummyConstChar, IsEqualToUtimbuf(&times)))
6461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      .WillOnce(Return(kDummyInt));
6471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(kDummyInt, utime(kDummyConstChar, &times));
648eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
649eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
6508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(KernelWrapTest, utimes) {
6511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  struct timeval times[2] = {{123, 234}, {345, 456}};
6521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_CALL(mock, utimens(kDummyConstChar, IsEqualToTimeval(times)))
653cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
6548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(-1, utimes(kDummyConstChar, times));
655cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
6568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
6578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, write) {
6594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, write(kDummyInt, kDummyVoidPtr, kDummyInt2))
6604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
6614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, write(kDummyInt, kDummyVoidPtr, kDummyInt2));
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
663eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
66403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class KernelWrapTestUninit : public ::testing::Test {
66503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void SetUp() {
66603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ASSERT_EQ(0, ki_push_state_for_testing());
6671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    kernel_wrap_uninit();
66803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
66903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
67003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void TearDown() {
6711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    kernel_wrap_init();
67203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    ki_pop_state_for_testing();
67303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
67403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
67503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
67603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(KernelWrapTestUninit, Mkdir_Uninitialised) {
67703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // If we are running within chrome we can't use these calls without
67803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // nacl_io initialized.
6791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (PSGetInstanceId() != 0)
6801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
68103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(0, mkdir("./foo", S_IREAD | S_IWRITE));
68203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  EXPECT_EQ(0, rmdir("./foo"));
68303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
68403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
68503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)TEST_F(KernelWrapTestUninit, Getcwd_Uninitialised) {
68603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // If we are running within chrome we can't use these calls without
68703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // nacl_io initialized.
6881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (PSGetInstanceId() != 0)
6891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return;
69003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  char dir[PATH_MAX];
69103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_NE((char*)NULL, getcwd(dir, PATH_MAX));
69203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Verify that the CWD ends with 'nacl_io_test'
69303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const char* suffix = "nacl_io_test";
69403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_GT(strlen(dir), strlen(suffix));
69503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  ASSERT_EQ(0, strcmp(dir+strlen(dir)-strlen(suffix), suffix));
69603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)}
69703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
698c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(PROVIDES_SOCKET_API) and !defined(__BIONIC__)
6993240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochTEST_F(KernelWrapTest, poll) {
7004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct pollfd fds;
7014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, poll(&fds, kDummyInt, kDummyInt2))
7024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
7034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, poll(&fds, kDummyInt, kDummyInt2));
7043240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch}
705a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7063240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochTEST_F(KernelWrapTest, select) {
7074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fd_set readfds;
7084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fd_set writefds;
7094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fd_set exceptfds;
7104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, select(kDummyInt, &readfds, &writefds, &exceptfds, NULL))
7114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
7124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2,
7134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            select(kDummyInt, &readfds, &writefds, &exceptfds, NULL));
7143240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch}
7153240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
7163240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch// Socket Functions
717a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, accept) {
7184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
7194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  socklen_t len;
7204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, accept(kDummyInt, &addr, &len))
7214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
7224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, accept(kDummyInt, &addr, &len));
723a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
724a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
725a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, bind) {
726cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The way we wrap bind does not support returning arbitrary values, so we
727cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // test 0 and -1.
7284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
7294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, bind(kDummyInt, &addr, kDummyInt2))
730cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
731cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
732cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0, bind(kDummyInt, &addr, kDummyInt2));
733cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, bind(kDummyInt, &addr, kDummyInt2));
734cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDummyErrno, errno);
735a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
736a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
737a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, connect) {
738cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The way we wrap connect does not support returning arbitrary values, so we
739cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // test 0 and -1.
7404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
7414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, connect(kDummyInt, &addr, kDummyInt2))
742cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
743cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
744cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0, connect(kDummyInt, &addr, kDummyInt2));
745cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, connect(kDummyInt, &addr, kDummyInt2));
746cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDummyErrno, errno);
747bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
748bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
749bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochTEST_F(KernelWrapTest, gethostbyname) {
7504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct hostent result;
7514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, gethostbyname(kDummyConstChar)).WillOnce(Return(&result));
7524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(&result, gethostbyname(kDummyConstChar));
753a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
754a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
755a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, getpeername) {
756cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The way we wrap getpeername does not support returning arbitrary values,
757cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // so we test 0 and -1.
7584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
7594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  socklen_t len;
7604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, getpeername(kDummyInt, &addr, &len))
761cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
762cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
763cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0, getpeername(kDummyInt, &addr, &len));
764cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, getpeername(kDummyInt, &addr, &len));
765cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDummyErrno, errno);
766a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
767a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
768a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, getsockname) {
769cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The way we wrap getsockname does not support returning arbitrary values,
770cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // so we test 0 and -1.
7714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
7724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  socklen_t len;
773cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, getsockname(kDummyInt, &addr, &len))
775cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
776cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
777cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0, getsockname(kDummyInt, &addr, &len));
778cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, getsockname(kDummyInt, &addr, &len));
779cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDummyErrno, errno);
780a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
781a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
782a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, getsockopt) {
783cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The way we wrap getsockname does not support returning arbitrary values,
784cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // so we test 0 and -1.
7854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_val;
7864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* dummy_void_ptr = &dummy_val;
7874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  socklen_t len;
7884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(
7894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      mock, getsockopt(kDummyInt, kDummyInt2, kDummyInt3, dummy_void_ptr, &len))
790cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
791cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
7924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(
793cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      0,
794cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      getsockopt(kDummyInt, kDummyInt2, kDummyInt3, dummy_void_ptr, &len));
795cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(
796cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      -1,
7974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      getsockopt(kDummyInt, kDummyInt2, kDummyInt3, dummy_void_ptr, &len));
798cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDummyErrno, errno);
799bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
800bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
801a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, listen) {
802cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The way we wrap listen does not support returning arbitrary values, so we
803cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // test 0 and -1.
804cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(mock, listen(kDummyInt, kDummyInt2))
805cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
806cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
807cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0, listen(kDummyInt, kDummyInt2));
808cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, listen(kDummyInt, kDummyInt2));
809cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDummyErrno, errno);
810a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
811a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
812a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, recv) {
8134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_val;
8144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* dummy_void_ptr = &dummy_val;
8154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, recv(kDummyInt, dummy_void_ptr, kDummySizeT, kDummyInt2))
8164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
8174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3,
8184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            recv(kDummyInt, dummy_void_ptr, kDummySizeT, kDummyInt2));
819a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
820a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
821a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, recvfrom) {
8224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_val;
8234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* dummy_void_ptr = &dummy_val;
8244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
8254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  socklen_t len;
8264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(
8274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      mock,
8284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      recvfrom(kDummyInt, dummy_void_ptr, kDummyInt2, kDummyInt3, &addr, &len))
8294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt4));
8304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(
8314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      kDummyInt4,
8324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      recvfrom(kDummyInt, dummy_void_ptr, kDummyInt2, kDummyInt3, &addr, &len));
833a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
834a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
835c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#ifndef __BIONIC__
836a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, recvmsg) {
8374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct msghdr msg;
8384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, recvmsg(kDummyInt, &msg, kDummyInt2))
8394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
8404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, recvmsg(kDummyInt, &msg, kDummyInt2));
841a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
842c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
843a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
844a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, send) {
8454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, send(kDummyInt, kDummyVoidPtr, kDummySizeT, kDummyInt2))
8464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
8474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3,
8484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            send(kDummyInt, kDummyVoidPtr, kDummySizeT, kDummyInt2));
849a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
850a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
851a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, sendto) {
8524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const socklen_t kDummySockLen = 0x50cc5;
8534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
8544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock,
8554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              sendto(kDummyInt,
8564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     kDummyVoidPtr,
8574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     kDummyInt2,
8584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     kDummyInt3,
8594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     &addr,
8604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     kDummySockLen)).WillOnce(Return(kDummyInt4));
8614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt4,
8624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            sendto(kDummyInt,
8634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummyVoidPtr,
8644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummyInt2,
8654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummyInt3,
8664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   &addr,
8674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummySockLen));
868a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
869a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
870a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, sendmsg) {
8714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct msghdr msg;
8724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, sendmsg(kDummyInt, &msg, kDummyInt2))
8734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
8744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, sendmsg(kDummyInt, &msg, kDummyInt2));
875a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
876a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
877a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, setsockopt) {
878cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The way we wrap setsockopt does not support returning arbitrary values, so
879cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // we test 0 and -1.
8804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const socklen_t kDummySockLen = 0x50cc5;
8814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(
8824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      mock,
8834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      setsockopt(
8844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          kDummyInt, kDummyInt2, kDummyInt3, kDummyVoidPtr, kDummySockLen))
885cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
886cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
8874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(
888cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      0,
8894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      setsockopt(
8904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          kDummyInt, kDummyInt2, kDummyInt3, kDummyVoidPtr, kDummySockLen));
891cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(
892cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      -1,
893cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      setsockopt(
894cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          kDummyInt, kDummyInt2, kDummyInt3, kDummyVoidPtr, kDummySockLen));
895cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDummyErrno, errno);
896a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
897a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
898a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, shutdown) {
899cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The way we wrap shutdown does not support returning arbitrary values, so we
900cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // test 0 and -1.
9014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, shutdown(kDummyInt, kDummyInt2))
902cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
903cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
904cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0, shutdown(kDummyInt, kDummyInt2));
905cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, shutdown(kDummyInt, kDummyInt2));
906cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDummyErrno, errno);
907a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
908a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
909a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, socket) {
9104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, socket(kDummyInt, kDummyInt2, kDummyInt3))
9114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt4));
9124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt4, socket(kDummyInt, kDummyInt2, kDummyInt3));
913a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
914a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
915a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, socketpair) {
916cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The way we wrap socketpair does not support returning arbitrary values,
917cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // so we test 0 and -1.
9184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_val;
9194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val))
920cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
921cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
922cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0, socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val));
923cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val));
924cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDummyErrno, errno);
925a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
926a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
9274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // PROVIDES_SOCKET_API
928f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
929f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // __linux__
930