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