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