kernel_wrap_test.cc revision 8bcbed890bc3ce4d7a057a8f32cab53fa534672e
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)
58bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include <unistd.h>
68bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "gtest/gtest.h"
11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "kernel_proxy_mock.h"
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "nacl_io/kernel_intercept.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "nacl_io/kernel_wrap.h"
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "nacl_io/osmman.h"
15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "nacl_io/ossocket.h"
16bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "nacl_io/ostermios.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(__native_client__) && !defined(__GLIBC__)
198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)extern "C" {
208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// TODO(sbc): remove once these get added to the newlib toolchain headers.
218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)int fchdir(int fd);
228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)int utimes(const char *filename, const struct timeval times[2]);
238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
26ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochusing namespace nacl_io;
27ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_;
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)using ::testing::DoAll;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::Return;
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::StrEq;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#define COMPARE_FIELD(f)                                                     \
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  if (arg->f != statbuf->f) {                                                \
374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    *result_listener << "mismatch of field \"" #f                            \
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        "\". "                                               \
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                        "expected: " << statbuf->f << " actual: " << arg->f; \
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return false;                                                            \
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MATCHER_P(IsEqualToStatbuf, statbuf, "") {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_dev);
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_ino);
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_mode);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_nlink);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_uid);
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_gid);
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_rdev);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_size);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_atime);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_mtime);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  COMPARE_FIELD(st_ctime);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#undef COMPARE_FIELD
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ACTION_P(SetStat, statbuf) {
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(arg1, 0, sizeof(struct stat));
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_dev = statbuf->st_dev;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_ino = statbuf->st_ino;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_mode = statbuf->st_mode;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_nlink = statbuf->st_nlink;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_uid = statbuf->st_uid;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_gid = statbuf->st_gid;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_rdev = statbuf->st_rdev;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_size = statbuf->st_size;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_atime = statbuf->st_atime;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_mtime = statbuf->st_mtime;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  arg1->st_ctime = statbuf->st_ctime;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MakeDummyStatbuf(struct stat* statbuf) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  memset(&statbuf[0], 0, sizeof(struct stat));
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_dev = 1;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_ino = 2;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_mode = 3;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_nlink = 4;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_uid = 5;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_gid = 6;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_rdev = 7;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_size = 8;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_atime = 9;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_mtime = 10;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  statbuf->st_ctime = 11;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const int kDummyInt = 0xdedbeef;
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const int kDummyInt2 = 0xcabba6e;
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const int kDummyInt3 = 0xf00ba4;
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const int kDummyInt4 = 0xabacdba;
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const size_t kDummySizeT = 0x60067e;
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char* kDummyConstChar = "foobar";
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char* kDummyConstChar2 = "g00gl3";
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const char* kDummyConstChar3 = "fr00gl3";
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)const void* kDummyVoidPtr = "blahblah";
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst uid_t kDummyUid = 1001;
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochconst gid_t kDummyGid = 1002;
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class KernelWrapTest : public ::testing::Test {
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  KernelWrapTest() {}
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SetUp() {
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Initializing the KernelProxy opens stdin/stdout/stderr.
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    EXPECT_CALL(mock, open(_, _))
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        .WillOnce(Return(0))
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        .WillOnce(Return(1))
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        .WillOnce(Return(2));
112868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    // And will call mount / and /dev.
113868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    EXPECT_CALL(mock, mount(_, _, _, _, _))
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        .WillOnce(Return(0))
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        .WillOnce(Return(0));
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    ki_init(&mock);
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void TearDown() { ki_uninit(); }
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  KernelProxyMock mock;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, access) {
1288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, access(kDummyConstChar, kDummyInt)) .WillOnce(Return(-1));
1298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(-1, access(kDummyConstChar, kDummyInt));
1308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, access(kDummyConstChar, kDummyInt)) .WillOnce(Return(0));
1328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(0, access(kDummyConstChar, kDummyInt));
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, chdir) {
1368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, chdir(kDummyConstChar)).WillOnce(Return(-1));
1378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(-1, chdir(kDummyConstChar));
1388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, chdir(kDummyConstChar)).WillOnce(Return(0));
1408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(0, chdir(kDummyConstChar));
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, chmod) {
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, chmod(kDummyConstChar, kDummyInt))
1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, chmod(kDummyConstChar, kDummyInt));
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
149eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(KernelWrapTest, chown) {
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, chown(kDummyConstChar, kDummyUid, kDummyGid))
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt));
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, chown(kDummyConstChar, kDummyUid, kDummyGid));
153eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
154eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, close) {
1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The way we wrap close does not support returning arbitrary values, so we
1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // test 0 and -1.
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, close(kDummyInt))
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(0))
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(-1));
1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0, close(kDummyInt));
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(-1, close(kDummyInt));
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, dup) {
1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, dup(kDummyInt)).WillOnce(Return(kDummyInt2));
1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, dup(kDummyInt));
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, dup2) {
1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The way we wrap dup2 does not support returning aribtrary values, only -1
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // or the value of the new fd.
1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, dup2(kDummyInt, kDummyInt2))
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2))
1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(-1));
1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, dup2(kDummyInt, kDummyInt2));
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(-1, dup2(kDummyInt, kDummyInt2));
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(KernelWrapTest, fchdir) {
1828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, fchdir(kDummyInt))
1838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      .WillOnce(Return(-1));
1848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(-1, fchdir(kDummyInt));
1858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
1868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, fchmod) {
1888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, fchmod(kDummyInt, kDummyInt2)) .WillOnce(Return(-1));
1898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(-1, fchmod(kDummyInt, kDummyInt2));
1908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
1918bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, fchmod(kDummyInt, kDummyInt2)) .WillOnce(Return(0));
1928bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(0, fchmod(kDummyInt, kDummyInt2));
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
195eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(KernelWrapTest, fchown) {
1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, fchown(kDummyInt, kDummyUid, kDummyGid))
1974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt));
1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, fchown(kDummyInt, kDummyUid, kDummyGid));
199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
20168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(KernelWrapTest, fcntl) {
20268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  char buffer[] = "fcntl";
2034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, fcntl(kDummyInt, kDummyInt2, _))
2044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
2054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, fcntl(kDummyInt, kDummyInt2, buffer));
20668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
20768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
2088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(KernelWrapTest, fdatasync) {
2098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, fdatasync(kDummyInt)).WillOnce(Return(-1));
2108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(-1, fdatasync(kDummyInt));
2118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, fdatasync(kDummyInt)).WillOnce(Return(0));
2138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(0, fdatasync(kDummyInt));
2148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
2158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, fstat) {
2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The way we wrap fstat does not support returning aribtrary values, only 0
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // or -1.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct stat in_statbuf;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MakeDummyStatbuf(&in_statbuf);
2214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, fstat(kDummyInt, _))
2224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(DoAll(SetStat(&in_statbuf), Return(0)))
2234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(-1));
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct stat out_statbuf;
2254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0, fstat(kDummyInt, &out_statbuf));
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf));
2274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(-1, fstat(kDummyInt, &out_statbuf));
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)TEST_F(KernelWrapTest, ftruncate) {
2314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, ftruncate(kDummyInt, kDummyInt2))
2324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
2334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, ftruncate(kDummyInt, kDummyInt2));
23490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
23590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, fsync) {
2378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, fsync(kDummyInt)).WillOnce(Return(-1));
2388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(-1, fsync(kDummyInt));
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, getcwd) {
2424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  char result[] = "getcwd_result";
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buffer[] = "getcwd";
2444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, getcwd(buffer, kDummySizeT)).WillOnce(Return(result));
2454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(result, getcwd(buffer, kDummySizeT));
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, getdents) {
2493551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#ifndef __GLIBC__
2503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // TODO(sbc): Find a way to test the getdents wrapper under glibc.
2514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // It looks like the only way to exercise it is to call readdir(2).
2523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // There is an internal glibc function __getdents that will call the
2533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // IRT but that cannot be accessed from here as glibc does not export it.
2544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_val;
2554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* void_ptr = &dummy_val;
2564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, getdents(kDummyInt, void_ptr, kDummyInt2))
2574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
2584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, getdents(kDummyInt, void_ptr, kDummyInt2));
2593551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#endif
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// gcc gives error: getwd is deprecated.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__GNUC__)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, getwd) {
2674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  char result[] = "getwd_result";
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char buffer[] = "getwd";
2694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, getwd(buffer)).WillOnce(Return(result));
2704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(result, getwd(buffer));
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(__GNUC__)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#pragma GCC diagnostic warning "-Wdeprecated-declarations"
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(KernelWrapTest, ioctl) {
277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  char buffer[] = "ioctl";
2784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, ioctl(kDummyInt, kDummyInt2, _))
2794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
2804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, ioctl(kDummyInt, kDummyInt2, buffer));
281eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
282eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, isatty) {
2844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, isatty(kDummyInt)).WillOnce(Return(kDummyInt2));
2854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, isatty(kDummyInt));
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(KernelWrapTest, kill) {
2894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, kill(kDummyInt, kDummyInt2)).WillOnce(Return(kDummyInt3));
2904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, kill(kDummyInt, kDummyInt2));
2913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
2923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(KernelWrapTest, lchown) {
2944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, lchown(kDummyConstChar, kDummyUid, kDummyGid))
2954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt));
2964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, lchown(kDummyConstChar, kDummyUid, kDummyGid));
2974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
2984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, link) {
3004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, link(kDummyConstChar, kDummyConstChar2))
3014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt));
3024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, link(kDummyConstChar, kDummyConstChar2));
303eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
304eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, lseek) {
3064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, lseek(kDummyInt, kDummyInt2, kDummyInt3))
3074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt4));
3084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt4, lseek(kDummyInt, kDummyInt2, kDummyInt3));
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, mkdir) {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(WIN32)
3134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, mkdir(kDummyConstChar, 0777)).WillOnce(Return(kDummyInt2));
3144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, mkdir(kDummyConstChar));
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, mkdir(kDummyConstChar, kDummyInt))
3174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
3184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, mkdir(kDummyConstChar, kDummyInt));
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, mmap) {
3234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // We only wrap mmap if |flags| has the MAP_ANONYMOUS bit unset.
3244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int flags = kDummyInt2 & ~MAP_ANONYMOUS;
3254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const size_t kDummySizeT2 = 0xbadf00d;
3274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy1 = 123;
3284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy2 = 456;
3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* kDummyVoidPtr1 = &dummy1;
3304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* kDummyVoidPtr2 = &dummy2;
3314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock,
3324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              mmap(kDummyVoidPtr1,
3334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummySizeT,
3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummyInt,
3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   flags,
3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummyInt3,
3374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummySizeT2)).WillOnce(Return(kDummyVoidPtr2));
3384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyVoidPtr2,
3394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            mmap(kDummyVoidPtr1,
3404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 kDummySizeT,
3414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 kDummyInt,
3424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 flags,
3434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 kDummyInt3,
3444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                 kDummySizeT2));
3454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, mount) {
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock,
3494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              mount(kDummyConstChar,
3504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    kDummyConstChar2,
3514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    kDummyConstChar3,
3524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    kDummyInt,
3534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                    kDummyVoidPtr)).WillOnce(Return(kDummyInt2));
3544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2,
3554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            mount(kDummyConstChar,
3564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  kDummyConstChar2,
3574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  kDummyConstChar3,
3584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  kDummyInt,
3594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                  kDummyVoidPtr));
3604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
3614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, munmap) {
3634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The way we wrap munmap, calls the "real" mmap as well as the intercepted
3644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // one. The result returned is from the "real" mmap.
3654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy1 = 123;
3664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* kDummyVoidPtr = &dummy1;
3674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  size_t kDummySizeT = sizeof(kDummyVoidPtr);
3684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, munmap(kDummyVoidPtr, kDummySizeT));
3694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  munmap(kDummyVoidPtr, kDummySizeT);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, open) {
3744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, open(kDummyConstChar, kDummyInt))
3754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
3764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, open(kDummyConstChar, kDummyInt));
3778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, open(kDummyConstChar, kDummyInt))
3798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
3808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, open(kDummyConstChar, kDummyInt));
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
38368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(KernelWrapTest, pipe) {
3844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int fds[] = {1, 2};
3854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, pipe(fds)).WillOnce(Return(kDummyInt));
3864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, pipe(fds));
38768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
38868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, read) {
3904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_value;
3914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* dummy_void_ptr = &dummy_value;
3924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, read(kDummyInt, dummy_void_ptr, kDummyInt2))
3934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
3944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, read(kDummyInt, dummy_void_ptr, kDummyInt2));
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(KernelWrapTest, readlink) {
3988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  char buf[10];
3998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, readlink(kDummyConstChar, buf, 10))
4018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      .WillOnce(Return(-1));
4028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(-1, readlink(kDummyConstChar, buf, 10));
4038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, readlink(kDummyConstChar, buf, 10))
4058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      .WillOnce(Return(kDummyInt));
4068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(kDummyInt, readlink(kDummyConstChar, buf, 10));
4078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
4088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
409d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#ifdef __GLIBC__
4108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// Under newlib there is no remove syscall.  Instead it is implemented
4118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)// in terms of unlink()/rmdir().
4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, remove) {
4138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, remove(kDummyConstChar)).WillOnce(Return(-1));
4148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(-1, remove(kDummyConstChar));
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
416d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(KernelWrapTest, rename) {
4198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, rename(kDummyConstChar, kDummyConstChar2))
4208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      .WillOnce(Return(-1));
4218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(-1, rename(kDummyConstChar, kDummyConstChar2));
4228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, rename(kDummyConstChar, kDummyConstChar2))
4248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)      .WillOnce(Return(0));
4258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(0, rename(kDummyConstChar, kDummyConstChar2));
4268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
4278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, rmdir) {
4294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, rmdir(kDummyConstChar)).WillOnce(Return(kDummyInt));
4304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, rmdir(kDummyConstChar));
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static void new_handler(int) {}
4344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)static void old_handler(int) {}
4353551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4363551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(KernelWrapTest, sigset) {
4374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, sigset(kDummyInt, new_handler))
4384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(old_handler));
4394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(&old_handler, sigset(kDummyInt, new_handler));
4403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
4413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4423551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)TEST_F(KernelWrapTest, signal) {
4434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // KernelIntercept forwards calls to signal to KernelProxy::sigset.
4444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, sigset(kDummyInt, new_handler))
4454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(old_handler));
4464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(&old_handler, signal(kDummyInt, new_handler));
4473551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)}
4483551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
4492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, stat) {
4504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // The way we wrap stat does not support returning aribtrary values, only 0
4514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // or -1.
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct stat in_statbuf;
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MakeDummyStatbuf(&in_statbuf);
4544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, stat(StrEq(kDummyConstChar), _))
4554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(DoAll(SetStat(&in_statbuf), Return(0)))
4564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(-1));
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct stat out_statbuf;
4584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(0, stat(kDummyConstChar, &out_statbuf));
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_THAT(&in_statbuf, IsEqualToStatbuf(&out_statbuf));
4604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(-1, stat(kDummyConstChar, &out_statbuf));
4614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
4624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, symlink) {
4644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, symlink(kDummyConstChar, kDummyConstChar2))
4654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt));
4664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, symlink(kDummyConstChar, kDummyConstChar2));
4674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
4684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)TEST_F(KernelWrapTest, tcflush) {
4704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, tcflush(kDummyInt, kDummyInt2))
4714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
4724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, tcflush(kDummyInt, kDummyInt2));
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochTEST_F(KernelWrapTest, tcgetattr) {
476bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  struct termios term;
4774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, tcgetattr(kDummyInt, &term)).WillOnce(Return(kDummyInt2));
4784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, tcgetattr(kDummyInt, &term));
479bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
480bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
481bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochTEST_F(KernelWrapTest, tcsetattr) {
482bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  struct termios term;
4834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, tcsetattr(kDummyInt, kDummyInt2, &term))
4844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
4854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, tcsetattr(kDummyInt, kDummyInt2, &term));
486bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
487bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, umount) {
4894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, umount(kDummyConstChar)).WillOnce(Return(kDummyInt));
4904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, umount(kDummyConstChar));
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(KernelWrapTest, truncate) {
4948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, truncate(kDummyConstChar, kDummyInt3)).WillOnce(Return(-1));
4958bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(-1, truncate(kDummyConstChar, kDummyInt3));
4968bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
4978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, truncate(kDummyConstChar, kDummyInt3)).WillOnce(Return(0));
4988bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(0, truncate(kDummyConstChar, kDummyInt3));
4998bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
5008bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(KernelWrapTest, lstat) {
5028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  struct stat buf;
5038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, lstat(kDummyConstChar, &buf)).WillOnce(Return(-1));
5048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(-1, lstat(kDummyConstChar, &buf));
5058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, lstat(kDummyConstChar, &buf)).WillOnce(Return(0));
5078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(0, lstat(kDummyConstChar, &buf));
5088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
5098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, unlink) {
5114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, unlink(kDummyConstChar)).WillOnce(Return(kDummyInt));
5124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, unlink(kDummyConstChar));
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST_F(KernelWrapTest, utime) {
516ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const struct utimbuf* times = NULL;
5174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, utime(kDummyConstChar, times)).WillOnce(Return(kDummyInt));
5184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt, utime(kDummyConstChar, times));
519eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
520eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)TEST_F(KernelWrapTest, utimes) {
5228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  struct timeval* times = NULL;
5238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_CALL(mock, utimes(kDummyConstChar, times)).WillOnce(Return(-1));
5248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_EQ(-1, utimes(kDummyConstChar, times));
5258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)}
5268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(KernelWrapTest, write) {
5284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, write(kDummyInt, kDummyVoidPtr, kDummyInt2))
5294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
5304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, write(kDummyInt, kDummyVoidPtr, kDummyInt2));
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
532eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
533a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#ifdef PROVIDES_SOCKET_API
5343240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochTEST_F(KernelWrapTest, poll) {
5354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct pollfd fds;
5364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, poll(&fds, kDummyInt, kDummyInt2))
5374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
5384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, poll(&fds, kDummyInt, kDummyInt2));
5393240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch}
540a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5413240926e260ce088908e02ac07a6cf7b0c0cbf44Ben MurdochTEST_F(KernelWrapTest, select) {
5424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fd_set readfds;
5434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fd_set writefds;
5444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  fd_set exceptfds;
5454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, select(kDummyInt, &readfds, &writefds, &exceptfds, NULL))
5464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
5474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2,
5484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            select(kDummyInt, &readfds, &writefds, &exceptfds, NULL));
5493240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch}
5503240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch
5513240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdoch// Socket Functions
552a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, accept) {
5534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
5544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  socklen_t len;
5554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, accept(kDummyInt, &addr, &len))
5564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
5574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, accept(kDummyInt, &addr, &len));
558a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
559a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
560a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, bind) {
5614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
5624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, bind(kDummyInt, &addr, kDummyInt2))
5634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
5644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, bind(kDummyInt, &addr, kDummyInt2));
565a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
566a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
567a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, connect) {
5684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
5694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, connect(kDummyInt, &addr, kDummyInt2))
5704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
5714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, connect(kDummyInt, &addr, kDummyInt2));
572bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
573bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
574bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben MurdochTEST_F(KernelWrapTest, gethostbyname) {
5754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct hostent result;
5764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, gethostbyname(kDummyConstChar)).WillOnce(Return(&result));
5774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(&result, gethostbyname(kDummyConstChar));
578a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
579a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
580a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, getpeername) {
5814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
5824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  socklen_t len;
5834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, getpeername(kDummyInt, &addr, &len))
5844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
5854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, getpeername(kDummyInt, &addr, &len));
586a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
587a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
588a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, getsockname) {
5894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
5904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  socklen_t len;
5914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, getsockname(kDummyInt, &addr, &len))
5924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt2));
5934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt2, getsockname(kDummyInt, &addr, &len));
594a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
595a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
596a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, getsockopt) {
5974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_val;
5984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* dummy_void_ptr = &dummy_val;
5994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  socklen_t len;
6004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(
6014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      mock, getsockopt(kDummyInt, kDummyInt2, kDummyInt3, dummy_void_ptr, &len))
6024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt4));
6034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(
6044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      kDummyInt4,
6054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      getsockopt(kDummyInt, kDummyInt2, kDummyInt3, dummy_void_ptr, &len));
606bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
607bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
608a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, listen) {
6094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, listen(kDummyInt, kDummyInt2)).WillOnce(Return(kDummyInt3));
6104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, listen(kDummyInt, kDummyInt2));
611a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
612a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
613a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, recv) {
6144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_val;
6154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* dummy_void_ptr = &dummy_val;
6164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, recv(kDummyInt, dummy_void_ptr, kDummySizeT, kDummyInt2))
6174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
6184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3,
6194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            recv(kDummyInt, dummy_void_ptr, kDummySizeT, kDummyInt2));
620a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
621a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
622a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, recvfrom) {
6234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_val;
6244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void* dummy_void_ptr = &dummy_val;
6254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
6264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  socklen_t len;
6274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(
6284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      mock,
6294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      recvfrom(kDummyInt, dummy_void_ptr, kDummyInt2, kDummyInt3, &addr, &len))
6304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt4));
6314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(
6324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      kDummyInt4,
6334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      recvfrom(kDummyInt, dummy_void_ptr, kDummyInt2, kDummyInt3, &addr, &len));
634a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
635a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
636a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, recvmsg) {
6374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct msghdr msg;
6384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, recvmsg(kDummyInt, &msg, kDummyInt2))
6394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
6404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, recvmsg(kDummyInt, &msg, kDummyInt2));
641a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
642a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
643a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, send) {
6444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, send(kDummyInt, kDummyVoidPtr, kDummySizeT, kDummyInt2))
6454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
6464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3,
6474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            send(kDummyInt, kDummyVoidPtr, kDummySizeT, kDummyInt2));
648a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
649a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
650a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, sendto) {
6514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const socklen_t kDummySockLen = 0x50cc5;
6524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct sockaddr addr;
6534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock,
6544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)              sendto(kDummyInt,
6554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     kDummyVoidPtr,
6564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     kDummyInt2,
6574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     kDummyInt3,
6584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     &addr,
6594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                     kDummySockLen)).WillOnce(Return(kDummyInt4));
6604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt4,
6614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            sendto(kDummyInt,
6624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummyVoidPtr,
6634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummyInt2,
6644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummyInt3,
6654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   &addr,
6664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                   kDummySockLen));
667a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
668a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
669a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, sendmsg) {
6704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  struct msghdr msg;
6714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, sendmsg(kDummyInt, &msg, kDummyInt2))
6724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
6734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, sendmsg(kDummyInt, &msg, kDummyInt2));
674a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
675a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
676a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, setsockopt) {
6774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const socklen_t kDummySockLen = 0x50cc5;
6784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(
6794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      mock,
6804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      setsockopt(
6814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          kDummyInt, kDummyInt2, kDummyInt3, kDummyVoidPtr, kDummySockLen))
6824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt4));
6834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(
6844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      kDummyInt4,
6854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      setsockopt(
6864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)          kDummyInt, kDummyInt2, kDummyInt3, kDummyVoidPtr, kDummySockLen));
687a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
688a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
689a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, shutdown) {
6904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, shutdown(kDummyInt, kDummyInt2))
6914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt3));
6924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt3, shutdown(kDummyInt, kDummyInt2));
693a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
694a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
695a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, socket) {
6964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, socket(kDummyInt, kDummyInt2, kDummyInt3))
6974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt4));
6984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt4, socket(kDummyInt, kDummyInt2, kDummyInt3));
699a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
700a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
701a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST_F(KernelWrapTest, socketpair) {
7024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  int dummy_val;
7034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_CALL(mock, socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val))
7044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      .WillOnce(Return(kDummyInt4));
7054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  EXPECT_EQ(kDummyInt4,
7064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            socketpair(kDummyInt, kDummyInt2, kDummyInt3, &dummy_val));
707a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
708a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#endif  // PROVIDES_SOCKET_API
710