kernel_wrap_test.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(__native_client__) && !defined(__GLIBC__)
248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)extern "C" {
258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// TODO(sbc): remove once these get added to the newlib toolchain headers.
268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)int fchdir(int fd);
278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)int utimes(const char *filename, const struct timeval times[2]);
288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
31ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochusing namespace nacl_io;
32ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::testing::AnyNumber;
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using ::testing::DoAll;
36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)using ::testing::Invoke;
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::Return;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::StrEq;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define COMPARE_FIELD(f)                                                     \
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (arg->f != statbuf->f) {                                                \
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    *result_listener << "mismatch of field \"" #f                            \
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        "\". "                                               \
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        "expected: " << statbuf->f << " actual: " << arg->f; \
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return false;                                                            \
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P(IsEqualToStatbuf, statbuf, "") {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_dev);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_ino);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_mode);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_nlink);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_uid);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_gid);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_rdev);
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_size);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_atime);
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_mtime);
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_ctime);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef COMPARE_FIELD
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ACTION_P(SetErrno, value) {
68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  errno = value;
69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P(SetStat, statbuf) {
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(arg1, 0, sizeof(struct stat));
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_dev = statbuf->st_dev;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_ino = statbuf->st_ino;
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_mode = statbuf->st_mode;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_nlink = statbuf->st_nlink;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_uid = statbuf->st_uid;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_gid = statbuf->st_gid;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_rdev = statbuf->st_rdev;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_size = statbuf->st_size;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_atime = statbuf->st_atime;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_mtime = statbuf->st_mtime;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_ctime = statbuf->st_ctime;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MakeDummyStatbuf(struct stat* statbuf) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(&statbuf[0], 0, sizeof(struct stat));
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_dev = 1;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_ino = 2;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_mode = 3;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_nlink = 4;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_uid = 5;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_gid = 6;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_rdev = 7;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_size = 8;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_atime = 9;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_mtime = 10;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_ctime = 11;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochconst mode_t kDummyMode = 0xbeef;
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kDummyErrno = 0xfeeb;
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const int kDummyInt = 0xdedbeef;
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const int kDummyInt2 = 0xcabba6e;
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const int kDummyInt3 = 0xf00ba4;
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const int kDummyInt4 = 0xabacdba;
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const size_t kDummySizeT = 0x60067e;
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char* kDummyConstChar = "foobar";
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char* kDummyConstChar2 = "g00gl3";
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char* kDummyConstChar3 = "fr00gl3";
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const void* kDummyVoidPtr = "blahblah";
112eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst uid_t kDummyUid = 1001;
113eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst gid_t kDummyGid = 1002;
114eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class KernelWrapTest : public ::testing::Test {
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  KernelWrapTest() {}
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SetUp() {
120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Initialize the global errno value to a consistent value rather than
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // relying on its value from previous test runs.
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    errno = 0;
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Initializing the KernelProxy opens stdin/stdout/stderr.
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(mock, open(_, _))
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        .WillOnce(Return(0))
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        .WillOnce(Return(1))
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        .WillOnce(Return(2));
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_EQ(0, ki_push_state_for_testing());
131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_EQ(0, ki_init(&mock));
132010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
133010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // We allow write to be called any number of times, and it forwards to
134010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // _real_write. This prevents an infinite loop writing output if there is a
135010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    // failure.
136010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ON_CALL(mock, write(_, _, _))
137010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)        .WillByDefault(Invoke(this, &KernelWrapTest::DefaultWrite));
138010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    EXPECT_CALL(mock, write(_, _, _)).Times(AnyNumber());
139a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
141a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void TearDown() {
142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // Uninitialize the kernel proxy so wrapped functions passthrough to their
143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    // unwrapped versions.
144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ki_uninit();
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MockKernelProxy mock;
148010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
149010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) private:
150010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  ssize_t DefaultWrite(int fd, const void* buf, size_t count) {
151010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   assert(fd <= 2);
152010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   size_t nwrote;
153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   int rtn = _real_write(fd, buf, count, &nwrote);
154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   if (rtn != 0) {
155010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     errno = rtn;
156010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)     return -1;
157010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   }
158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)   return nwrote;
159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  }
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, access) {
1658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, access(kDummyConstChar, kDummyInt)) .WillOnce(Return(0));
1668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(0, access(kDummyConstChar, kDummyInt));
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(mock, access(kDummyConstChar, kDummyInt))
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, access(kDummyConstChar, kDummyInt));
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDummyErrno, errno);
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, chdir) {
1768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, chdir(kDummyConstChar)).WillOnce(Return(0));
1778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(0, chdir(kDummyConstChar));
178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(mock, chdir(kDummyConstChar))
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, chdir(kDummyConstChar));
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, chmod) {
186c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_CALL(mock, chmod(kDummyConstChar, kDummyMode))
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
188c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(kDummyInt2,chmod(kDummyConstChar, kDummyMode));
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(KernelWrapTest, chown) {
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, chown(kDummyConstChar, kDummyUid, kDummyGid))
1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt));
1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, chown(kDummyConstChar, kDummyUid, kDummyGid));
195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, close) {
1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The way we wrap close does not support returning arbitrary values, so we
1994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // test 0 and -1.
2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, close(kDummyInt))
201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0));
2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0, close(kDummyInt));
204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(mock, close(kDummyInt))
206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(-1, close(kDummyInt));
208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, dup) {
2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, dup(kDummyInt)).WillOnce(Return(kDummyInt2));
2134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, dup(kDummyInt));
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, dup2) {
2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The way we wrap dup2 does not support returning aribtrary values, only -1
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // or the value of the new fd.
2194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, dup2(kDummyInt, kDummyInt2))
2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2))
221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, dup2(kDummyInt, kDummyInt2));
2244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(-1, dup2(kDummyInt, kDummyInt2));
225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
2264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(KernelWrapTest, fchdir) {
2298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, fchdir(kDummyInt))
230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(-1, fchdir(kDummyInt));
233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
2348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
2358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, fchmod) {
237c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_CALL(mock, fchmod(kDummyInt, kDummyMode))
238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
2408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
241c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(0, fchmod(kDummyInt, kDummyMode));
242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, fchmod(kDummyInt, kDummyMode));
243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(KernelWrapTest, fchown) {
2474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, fchown(kDummyInt, kDummyUid, kDummyGid))
2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt));
2494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, fchown(kDummyInt, kDummyUid, kDummyGid));
250eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
251eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
25268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(KernelWrapTest, fcntl) {
25368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  char buffer[] = "fcntl";
2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, fcntl(kDummyInt, kDummyInt2, _))
2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
2564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, fcntl(kDummyInt, kDummyInt2, buffer));
25768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
25868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(KernelWrapTest, fdatasync) {
260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(mock, fdatasync(kDummyInt)).WillOnce(Return(0))
261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
2628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(0, fdatasync(kDummyInt));
264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, fdatasync(kDummyInt));
265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
2668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
2678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, fstat) {
2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The way we wrap fstat does not support returning aribtrary values, only 0
2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // or -1.
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct stat in_statbuf;
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MakeDummyStatbuf(&in_statbuf);
2734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, fstat(kDummyInt, _))
2744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(DoAll(SetStat(&in_statbuf), Return(0)))
275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct stat out_statbuf;
277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0, fstat(kDummyInt, &out_statbuf));
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf));
280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(-1, fstat(kDummyInt, &out_statbuf));
282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(KernelWrapTest, ftruncate) {
2864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, ftruncate(kDummyInt, kDummyInt2))
2874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
2884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, ftruncate(kDummyInt, kDummyInt2));
28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, fsync) {
292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(mock, fsync(kDummyInt))
293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
2948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(-1, fsync(kDummyInt));
295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, getcwd) {
2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  char result[] = "getcwd_result";
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buffer[] = "getcwd";
3014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, getcwd(buffer, kDummySizeT)).WillOnce(Return(result));
3024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(result, getcwd(buffer, kDummySizeT));
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, getdents) {
306c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if !defined( __GLIBC__) && !defined(__BIONIC__)
3073551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // TODO(sbc): Find a way to test the getdents wrapper under glibc.
3084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // It looks like the only way to exercise it is to call readdir(2).
3093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // There is an internal glibc function __getdents that will call the
3103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // IRT but that cannot be accessed from here as glibc does not export it.
3114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_val;
3124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* void_ptr = &dummy_val;
3134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, getdents(kDummyInt, void_ptr, kDummyInt2))
3144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
3154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, getdents(kDummyInt, void_ptr, kDummyInt2));
3163551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// gcc gives error: getwd is deprecated.
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__GNUC__)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, getwd) {
3244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  char result[] = "getwd_result";
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buffer[] = "getwd";
3264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, getwd(buffer)).WillOnce(Return(result));
3274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(result, getwd(buffer));
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__GNUC__)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma GCC diagnostic warning "-Wdeprecated-declarations"
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
333eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(KernelWrapTest, ioctl) {
334eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  char buffer[] = "ioctl";
3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, ioctl(kDummyInt, kDummyInt2, _))
3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
3374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, ioctl(kDummyInt, kDummyInt2, buffer));
338eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
339eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
340c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if !defined(__BIONIC__)
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, isatty) {
3424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, isatty(kDummyInt)).WillOnce(Return(kDummyInt2));
3434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, isatty(kDummyInt));
344c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
345c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // This test verifies that the IRT interception wrapper for isatty
346c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // ignores the value of errno when isatty() returns 1.  We had a bug
347c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // where returning 1 from ki_isatty resulted in errno being returned
348c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // by the IRT interface.
349c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  errno = kDummyInt3;
350c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_CALL(mock, isatty(kDummyInt)).WillOnce(Return(1));
351c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(1, isatty(kDummyInt));
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
353c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(KernelWrapTest, kill) {
3564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, kill(kDummyInt, kDummyInt2)).WillOnce(Return(kDummyInt3));
3574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, kill(kDummyInt, kDummyInt2));
3583551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
3593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
360eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(KernelWrapTest, lchown) {
3614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, lchown(kDummyConstChar, kDummyUid, kDummyGid))
3624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt));
3634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, lchown(kDummyConstChar, kDummyUid, kDummyGid));
3644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, link) {
3674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, link(kDummyConstChar, kDummyConstChar2))
3684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt));
3694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, link(kDummyConstChar, kDummyConstChar2));
370eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
371eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, lseek) {
3734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, lseek(kDummyInt, kDummyInt2, kDummyInt3))
3744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt4));
3754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt4, lseek(kDummyInt, kDummyInt2, kDummyInt3));
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, mkdir) {
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(WIN32)
3804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, mkdir(kDummyConstChar, 0777)).WillOnce(Return(kDummyInt2));
3814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, mkdir(kDummyConstChar));
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
383c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_CALL(mock, mkdir(kDummyConstChar, kDummyMode))
3844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
385c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(kDummyInt2, mkdir(kDummyConstChar, kDummyMode));
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, mmap) {
3904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // We only wrap mmap if |flags| has the MAP_ANONYMOUS bit unset.
3914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int flags = kDummyInt2 & ~MAP_ANONYMOUS;
3924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const size_t kDummySizeT2 = 0xbadf00d;
3944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy1 = 123;
3954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy2 = 456;
3964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* kDummyVoidPtr1 = &dummy1;
3974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* kDummyVoidPtr2 = &dummy2;
3984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock,
3994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              mmap(kDummyVoidPtr1,
4004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummySizeT,
4014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummyInt,
4024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   flags,
4034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummyInt3,
4044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummySizeT2)).WillOnce(Return(kDummyVoidPtr2));
4054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyVoidPtr2,
4064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            mmap(kDummyVoidPtr1,
4074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 kDummySizeT,
4084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 kDummyInt,
4094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 flags,
4104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 kDummyInt3,
4114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 kDummySizeT2));
4124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
4134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, mount) {
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock,
4164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              mount(kDummyConstChar,
4174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    kDummyConstChar2,
4184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    kDummyConstChar3,
4194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    kDummyInt,
4204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    kDummyVoidPtr)).WillOnce(Return(kDummyInt2));
4214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2,
4224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            mount(kDummyConstChar,
4234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  kDummyConstChar2,
4244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  kDummyConstChar3,
4254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  kDummyInt,
4264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  kDummyVoidPtr));
4274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
4284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, munmap) {
4304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The way we wrap munmap, calls the "real" mmap as well as the intercepted
4314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // one. The result returned is from the "real" mmap.
4324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy1 = 123;
4334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* kDummyVoidPtr = &dummy1;
4344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  size_t kDummySizeT = sizeof(kDummyVoidPtr);
4354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, munmap(kDummyVoidPtr, kDummySizeT));
4364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  munmap(kDummyVoidPtr, kDummySizeT);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, open) {
440c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  // We pass O_RDONLY because we do not want an error in flags translation
441c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_CALL(mock, open(kDummyConstChar, 0))
442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(kDummyInt2))
4434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
4448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDummyInt2, open(kDummyConstChar, 0));
446c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_EQ(kDummyInt2, open(kDummyConstChar, 0));
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(KernelWrapTest, pipe) {
4504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int fds[] = {1, 2};
4514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, pipe(fds)).WillOnce(Return(kDummyInt));
4524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, pipe(fds));
45368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
45468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, read) {
4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_value;
4574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* dummy_void_ptr = &dummy_value;
4584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, read(kDummyInt, dummy_void_ptr, kDummyInt2))
4594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
4604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, read(kDummyInt, dummy_void_ptr, kDummyInt2));
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(KernelWrapTest, readlink) {
4648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  char buf[10];
4658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, readlink(kDummyConstChar, buf, 10))
467cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(kDummyInt))
468cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
4698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(kDummyInt, readlink(kDummyConstChar, buf, 10));
471cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, readlink(kDummyConstChar, buf, 10));
472cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
4738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
4748bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
475d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#ifdef __GLIBC__
4768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Under newlib there is no remove syscall.  Instead it is implemented
4778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// in terms of unlink()/rmdir().
4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, remove) {
4798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, remove(kDummyConstChar)).WillOnce(Return(-1));
4808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(-1, remove(kDummyConstChar));
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
482d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(KernelWrapTest, rename) {
4858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, rename(kDummyConstChar, kDummyConstChar2))
486cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
487cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
4888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(0, rename(kDummyConstChar, kDummyConstChar2));
490cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, rename(kDummyConstChar, kDummyConstChar2));
491cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
4928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
4938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, rmdir) {
4954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, rmdir(kDummyConstChar)).WillOnce(Return(kDummyInt));
4964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, rmdir(kDummyConstChar));
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static void new_handler(int) {}
500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
501f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(KernelWrapTest, sigaction) {
502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  struct sigaction action;
503f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  struct sigaction oaction;
504f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(mock, sigaction(kDummyInt, &action, &oaction))
505f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      .WillOnce(Return(0));
506f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(0, sigaction(kDummyInt, &action, &oaction));
507f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
5083551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(KernelWrapTest, sigset) {
510f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(mock, sigaction(kDummyInt, _, _))
511f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      .WillOnce(Return(0));
512f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(NULL, sigset(kDummyInt, new_handler));
5133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
5143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(KernelWrapTest, signal) {
5164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // KernelIntercept forwards calls to signal to KernelProxy::sigset.
517f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_CALL(mock, sigaction(kDummyInt, _, _))
518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      .WillOnce(Return(0));
519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  EXPECT_EQ(NULL, signal(kDummyInt, new_handler));
5203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
5213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, stat) {
5234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The way we wrap stat does not support returning aribtrary values, only 0
5244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // or -1.
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct stat in_statbuf;
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MakeDummyStatbuf(&in_statbuf);
5274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, stat(StrEq(kDummyConstChar), _))
5284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(DoAll(SetStat(&in_statbuf), Return(0)))
529cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct stat out_statbuf;
531cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0, stat(kDummyConstChar, &out_statbuf));
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf));
534cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(-1, stat(kDummyConstChar, &out_statbuf));
536cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
5374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
5384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
5394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, symlink) {
5404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, symlink(kDummyConstChar, kDummyConstChar2))
5414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt));
5424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, symlink(kDummyConstChar, kDummyConstChar2));
5434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
5444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
545c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#ifndef __BIONIC__
5464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, tcflush) {
5474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, tcflush(kDummyInt, kDummyInt2))
5484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
5494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, tcflush(kDummyInt, kDummyInt2));
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
552bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochTEST_F(KernelWrapTest, tcgetattr) {
553bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  struct termios term;
5544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, tcgetattr(kDummyInt, &term)).WillOnce(Return(kDummyInt2));
5554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, tcgetattr(kDummyInt, &term));
556bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
557bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
558bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochTEST_F(KernelWrapTest, tcsetattr) {
559bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  struct termios term;
5604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, tcsetattr(kDummyInt, kDummyInt2, &term))
5614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
5624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, tcsetattr(kDummyInt, kDummyInt2, &term));
563bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
564c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
565bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, umount) {
5674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, umount(kDummyConstChar)).WillOnce(Return(kDummyInt));
5684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, umount(kDummyConstChar));
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(KernelWrapTest, truncate) {
572cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(mock, truncate(kDummyConstChar, kDummyInt3))
573cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
574cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
5758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(0, truncate(kDummyConstChar, kDummyInt3));
577cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
578cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, truncate(kDummyConstChar, kDummyInt3));
5798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
5808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(KernelWrapTest, lstat) {
5825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  struct stat in_statbuf;
5835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  MakeDummyStatbuf(&in_statbuf);
5845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_CALL(mock, lstat(StrEq(kDummyConstChar), _))
5855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      .WillOnce(DoAll(SetStat(&in_statbuf), Return(0)))
586cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
5875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  struct stat out_statbuf;
588cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(0, lstat(kDummyConstChar, &out_statbuf));
5905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf));
591cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  EXPECT_EQ(-1, lstat(kDummyConstChar, &out_statbuf));
593cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
5948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
5958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, unlink) {
5974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, unlink(kDummyConstChar)).WillOnce(Return(kDummyInt));
5984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, unlink(kDummyConstChar));
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
601eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(KernelWrapTest, utime) {
602ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const struct utimbuf* times = NULL;
6034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, utime(kDummyConstChar, times)).WillOnce(Return(kDummyInt));
6044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, utime(kDummyConstChar, times));
605eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
606eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
6078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(KernelWrapTest, utimes) {
6088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  struct timeval* times = NULL;
609cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(mock, utimes(kDummyConstChar, times))
610cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
6118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(-1, utimes(kDummyConstChar, times));
612cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_EQ(kDummyErrno, errno);
6138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
6148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, write) {
6164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, write(kDummyInt, kDummyVoidPtr, kDummyInt2))
6174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
6184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, write(kDummyInt, kDummyVoidPtr, kDummyInt2));
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
620eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
621c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#if defined(PROVIDES_SOCKET_API) and !defined(__BIONIC__)
6223240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochTEST_F(KernelWrapTest, poll) {
6234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct pollfd fds;
6244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, poll(&fds, kDummyInt, kDummyInt2))
6254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
6264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, poll(&fds, kDummyInt, kDummyInt2));
6273240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch}
628a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
6293240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochTEST_F(KernelWrapTest, select) {
6304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fd_set readfds;
6314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fd_set writefds;
6324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fd_set exceptfds;
6334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, select(kDummyInt, &readfds, &writefds, &exceptfds, NULL))
6344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
6354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2,
6364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            select(kDummyInt, &readfds, &writefds, &exceptfds, NULL));
6373240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch}
6383240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
6393240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch// Socket Functions
640a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, accept) {
6414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
6424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  socklen_t len;
6434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, accept(kDummyInt, &addr, &len))
6444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
6454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, accept(kDummyInt, &addr, &len));
646a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
647a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
648a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, bind) {
649cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The way we wrap bind does not support returning arbitrary values, so we
650cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // test 0 and -1.
6514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
6524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, bind(kDummyInt, &addr, kDummyInt2))
653cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
654cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
655cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0, bind(kDummyInt, &addr, kDummyInt2));
656cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, bind(kDummyInt, &addr, kDummyInt2));
657cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDummyErrno, errno);
658a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
659a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
660a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, connect) {
661cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The way we wrap connect does not support returning arbitrary values, so we
662cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // test 0 and -1.
6634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
6644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, connect(kDummyInt, &addr, kDummyInt2))
665cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
666cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
667cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0, connect(kDummyInt, &addr, kDummyInt2));
668cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, connect(kDummyInt, &addr, kDummyInt2));
669cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDummyErrno, errno);
670bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
671bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
672bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochTEST_F(KernelWrapTest, gethostbyname) {
6734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct hostent result;
6744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, gethostbyname(kDummyConstChar)).WillOnce(Return(&result));
6754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(&result, gethostbyname(kDummyConstChar));
676a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
677a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
678a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, getpeername) {
679cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The way we wrap getpeername does not support returning arbitrary values,
680cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // so we test 0 and -1.
6814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
6824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  socklen_t len;
6834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, getpeername(kDummyInt, &addr, &len))
684cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
685cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
686cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0, getpeername(kDummyInt, &addr, &len));
687cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, getpeername(kDummyInt, &addr, &len));
688cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDummyErrno, errno);
689a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
690a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
691a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, getsockname) {
692cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The way we wrap getsockname does not support returning arbitrary values,
693cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // so we test 0 and -1.
6944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
6954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  socklen_t len;
696cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, getsockname(kDummyInt, &addr, &len))
698cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
699cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
700cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0, getsockname(kDummyInt, &addr, &len));
701cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, getsockname(kDummyInt, &addr, &len));
702cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDummyErrno, errno);
703a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
704a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
705a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, getsockopt) {
706cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The way we wrap getsockname does not support returning arbitrary values,
707cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // so we test 0 and -1.
7084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_val;
7094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* dummy_void_ptr = &dummy_val;
7104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  socklen_t len;
7114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(
7124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      mock, getsockopt(kDummyInt, kDummyInt2, kDummyInt3, dummy_void_ptr, &len))
713cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
714cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
7154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(
716cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      0,
717cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      getsockopt(kDummyInt, kDummyInt2, kDummyInt3, dummy_void_ptr, &len));
718cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(
719cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      -1,
7204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      getsockopt(kDummyInt, kDummyInt2, kDummyInt3, dummy_void_ptr, &len));
721cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDummyErrno, errno);
722bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
723bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
724a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, listen) {
725cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The way we wrap listen does not support returning arbitrary values, so we
726cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // test 0 and -1.
727cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_CALL(mock, listen(kDummyInt, kDummyInt2))
728cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
729cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
730cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0, listen(kDummyInt, kDummyInt2));
731cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, listen(kDummyInt, kDummyInt2));
732cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDummyErrno, errno);
733a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
734a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
735a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, recv) {
7364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_val;
7374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* dummy_void_ptr = &dummy_val;
7384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, recv(kDummyInt, dummy_void_ptr, kDummySizeT, kDummyInt2))
7394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
7404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3,
7414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            recv(kDummyInt, dummy_void_ptr, kDummySizeT, kDummyInt2));
742a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
743a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
744a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, recvfrom) {
7454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_val;
7464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* dummy_void_ptr = &dummy_val;
7474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
7484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  socklen_t len;
7494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(
7504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      mock,
7514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      recvfrom(kDummyInt, dummy_void_ptr, kDummyInt2, kDummyInt3, &addr, &len))
7524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt4));
7534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(
7544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      kDummyInt4,
7554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      recvfrom(kDummyInt, dummy_void_ptr, kDummyInt2, kDummyInt3, &addr, &len));
756a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
757a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
758c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#ifndef __BIONIC__
759a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, recvmsg) {
7604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct msghdr msg;
7614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, recvmsg(kDummyInt, &msg, kDummyInt2))
7624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
7634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, recvmsg(kDummyInt, &msg, kDummyInt2));
764a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
765c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#endif
766a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
767a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, send) {
7684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, send(kDummyInt, kDummyVoidPtr, kDummySizeT, kDummyInt2))
7694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
7704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3,
7714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            send(kDummyInt, kDummyVoidPtr, kDummySizeT, kDummyInt2));
772a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
773a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
774a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, sendto) {
7754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const socklen_t kDummySockLen = 0x50cc5;
7764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
7774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock,
7784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              sendto(kDummyInt,
7794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     kDummyVoidPtr,
7804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     kDummyInt2,
7814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     kDummyInt3,
7824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     &addr,
7834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     kDummySockLen)).WillOnce(Return(kDummyInt4));
7844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt4,
7854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            sendto(kDummyInt,
7864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummyVoidPtr,
7874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummyInt2,
7884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummyInt3,
7894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   &addr,
7904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummySockLen));
791a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
792a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
793a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, sendmsg) {
7944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct msghdr msg;
7954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, sendmsg(kDummyInt, &msg, kDummyInt2))
7964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
7974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, sendmsg(kDummyInt, &msg, kDummyInt2));
798a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
799a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
800a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, setsockopt) {
801cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The way we wrap setsockopt does not support returning arbitrary values, so
802cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // we test 0 and -1.
8034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const socklen_t kDummySockLen = 0x50cc5;
8044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(
8054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      mock,
8064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      setsockopt(
8074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          kDummyInt, kDummyInt2, kDummyInt3, kDummyVoidPtr, kDummySockLen))
808cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
809cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
8104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(
811cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      0,
8124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      setsockopt(
8134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          kDummyInt, kDummyInt2, kDummyInt3, kDummyVoidPtr, kDummySockLen));
814cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(
815cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      -1,
816cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      setsockopt(
817cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          kDummyInt, kDummyInt2, kDummyInt3, kDummyVoidPtr, kDummySockLen));
818cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDummyErrno, errno);
819a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
820a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
821a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, shutdown) {
822cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The way we wrap shutdown does not support returning arbitrary values, so we
823cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // test 0 and -1.
8244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, shutdown(kDummyInt, kDummyInt2))
825cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
826cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
827cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0, shutdown(kDummyInt, kDummyInt2));
828cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, shutdown(kDummyInt, kDummyInt2));
829cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDummyErrno, errno);
830a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
831a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
832a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, socket) {
8334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, socket(kDummyInt, kDummyInt2, kDummyInt3))
8344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt4));
8354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt4, socket(kDummyInt, kDummyInt2, kDummyInt3));
836a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
837a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
838a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, socketpair) {
839cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The way we wrap socketpair does not support returning arbitrary values,
840cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // so we test 0 and -1.
8414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_val;
8424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val))
843cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(Return(0))
844cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      .WillOnce(DoAll(SetErrno(kDummyErrno), Return(-1)));
845cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(0, socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val));
846cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(-1, socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val));
847cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(kDummyErrno, errno);
848a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
849a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
8504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // PROVIDES_SOCKET_API
851f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
852f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif  // __linux__
853